百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C++ MQTT客户端库libmosquitto的使用

liebian365 2024-11-18 14:14 24 浏览 0 评论

安装好MQTT服务器Mosquitto之后,就可以使用Mosquitto提供的客户端库开发MQTT客户端软件了。本文以Ubuntu上使用Mosquitto的客户端库为例子。

Ubuntu上安装Mosquitto时,安装程序会将客户端库libmosquitto.so.1自动拷贝到系统目录,由于Mosquitto本身有多个版本,也在不断升级,所以该库文件libmosquitto.so.1其实是一个软连接,链接到当前系统安装的版本的Mosqutto客户端库。

要开始编码,首先要到Mosquitto的官网下载头文件(只有一个mosquitto.h)。

然后创建qt项目,.pro中添加连接-lmosquitto,或者不在.pro添加连接,而是动态加载库libmosquitto.so.1的导出函数指针。

该库的主要函数有以下一些:

mosquitto_new

mosquitto_connect_callback_set

mosquitto_disconnect_callback_set

mosquitto_message_callback_set

mosquitto_username_pw_set

mosquitto_connect_async

mosquitto_loop_start

mosquitto_publish

mosquitto_subscribe

mosquitto_disconnect

mosquitto_destroy

以下是链接MQTT服务器,建立和断开客户端和MQTT服务器之间网络连接的代码:

Bash

#include <QUuid>
#include "mosquitto.h"

struct mosquitto * ctx = NULL;

void onMosquittoConnect(struct mosquitto *, void *, int)
{
    
}
void onMosquittoDisconnect(struct mosquitto *, void *, int)
{
    
}
void onMosquittoMessage(struct mosquitto *, void *, const struct mosquitto_message *)
{
    //主题:msg->topic
    //消息:(const unsigned char *)msg->payload
    //消息字节数:msg->payloadlen)
}
    
bool connectMosquitto()
{
    std::string clientID = QUuid::createUuid().toString().toUpper().toStdString(); //给客户端自定义一个ID,传递null,则产生随机ID
    bool clearOnDisconnect = true; //标志是否在断开连接后,服务器清空本链接的所有消息
    auto obj = 123; //后续回调函数中传递的自定义对象
    ctx = mosquitto_new(clientID.c_str(), clearOnDisconnect, obj);
    if(!ctx)
        return false;
    else
    {
        //设置回调函数
        mosquitto_connect_callback_set(ctx, &onMosquittoConnect);
        mosquitto_disconnect_callback_set(ctx, &onMosquittoDisconnect);
        mosquitto_message_callback_set(ctx, &onMosquittoMessage);
        
        std::string user = "user1";      //MQTT服务器登录账号
        std::string pwd = "pwd1";        //MQTT服务器登录密码
        std::string ip = "127.0.0.1";    //MQTT服务器IP
        int port = 1883;                 //MQTT服务器端口
        int heartBeatSecs= 60;           //心跳间隔秒数
        
        //设置登录账号和密码
        mosquitto_username_pw_set(ctx, user.c_str(), pwd.c_str());
        
        //连接登录MQTT服务器
        int ret = mosquitto_connect_async(ctx, ip.c_str(), port, heartBeatSecs);
        if(ret != 0)
            return false;

        //开启时间循环(本函数立即返回)
        mosquitto_loop_start(ctx);
    }
}

void disconnectMosquitto()
{
    mosquitto_disconnect(ctx);
    mosquitto_destroy(ctx);
}

以下是发布消息和订阅消息的代码:

Bash

//发布消息
int mid = 0; //消息ID,可为NULL
const char * topic = "xx"; //主题
char msg[6] = "Hello"; //消息
int qos = 2; //消息服务的质量,0/1/2
bool retainedMsg = false; //是否保留消息
mosquitto_publish(ctx, &mid, topic, sizeof(msg), msg, qos, retainedMsg);
//需要注意的是,消息体可以为NULL

//订阅消息
//mid用于接收发送的消息的mid
//topic是订阅的消息主题
//qos是为本主题请求的消息服务质量,0/1/2
mosquitto_subscribe(ctx, &mid, topic, qos);
//订阅消息之后,客户端收到MQTT服务器发过来的消息后,
//就会调用onMosquittoMessage回调函数,通知客户端处理消息

相关推荐

Pandoc安装、使用、快速上手(pandoc安装教程)

Pandoc安装、使用、快速上手Pandoc如果你需要将文档从一种格式转换成另一种格式,那么Pandoc是你的一把瑞士军刀,Pandoc可以将下列格式文档进行相互转换。Markdown、Microso...

Pinocchio 安装教程|机器人学的必备库

视频讲解:Pinocchio安装教程|机器人学的必备库_哔哩哔哩_bilibilihttps://gepettoweb.laas.fr/doc/stack-of-tasks/pinocchio/ma...

常用linux命令:netstat(常用linux命令有多少个)

linuxnetstat命令用于显示网络状态,可用于列出系统上所有的网络套接字连接情况#显示所有的连接$netstat-aActiveInternetconnections(serv...

【收藏】Linux服务器常用巡检命令

在Linux服务器上进行常规巡检是确保服务器稳定性和安全性的重要措施之一。以下是一些常用的巡检命令和技巧:1.查看系统信息1.1系统信息显示命令:uname-a[root@linux100~]...

详解linux内核网络数据包发送在UDP协议层的处理与监控

udp_sendmsg这个函数定义在net/ipv4/udp.c,函数很长,分段来看。UDP插入UDPudp_sendmsgcorking是一项优化技术,允许内核将多个数据累积成一体的数据...

Linux实例常用内核网络参数介绍与常见问题处理

Linux实例常用内核网络参数介绍与常见问题处理概述本文主要介绍常见的Linux内核参数及相关问题的处理方式。详细信息注意:Linux从4.12内核版本开始移除了tcp_tw_recycle配置。即移...

Linux配置网络(rocky linux配置网络)

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux安全之网络防火墙(linux防火墙配置基本步骤)

纸上得来终觉浅,绝知此事要躬行。iptables是运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。在大部分Linux发行版中,可以通...

linux命令 - fuser、lsof、pidof学习

fuser可以借由文件(或文件系统)找出正在使用该文件的程序。有的时候我想要知道我的程序到底在这次启动过程中打开了多少文件,可以利用fuser来观察啦!举例来说,你如果卸载时发现系统通知:“...

Linux使用中的一些问题及解决过程(记录1)

1.在Linux虚拟中安装dhcpv6后,Server发送的dhcpv6advertise报文中的udp校验和出错,导致用户不能获取IPv6地址修正方法:将该接口的校验关闭ethtool--of...

比 netstat 好用?Linux 网络状态工具 ss 详解

ss命令用于显示socket状态。他可以显示PACKETsockets,TCPsockets,UDPsockets,DCCPsockets,RAWsockets,Unixdomains...

七、网工必备“基础命令”:像查水电表一样轻松排查网络问题!

网络命令听起来高深,但其实它们就像你家里的“工具箱”——拧螺丝用螺丝刀,测电路用电笔,而排查网络问题,就用这些命令!今天我们就用生活中最常见的例子,带你轻松掌握ping、ipconfig、tracer...

为什么 Windows 病毒不影响 Linux 机器?

病毒是一种计算机程序。病毒不会影响Linux的原因和MicrosoftExcel不能在Linux上运行的原因是一样的:Linux不能运行Windows程序。你可以使用特殊的软件,...

别让Linux网络基础拖后腿!这些 lsof 骚操作你真的了解吗?

lsof是Linux系统管理中极为强大的工具,尤其在网络问题排查中堪称神器。以下从基础到进阶的用法解析,帮你彻底掌握网络相关的骚操作:一、基础必知:网络连接的本质Linux中一切皆文件,网络连...

别让Linux网络基础拖后腿!这些 netstat 骚操作你真的了解吗?

在Linux网络管理和故障排查中,netstat确实是必备的瑞士军刀。掌握这些进阶技巧能显著提升效率,尤其当服务器出现连接数爆满、端口冲突或异常流量时。以下乃是自实战之中所总结而成的深度操作指南:继续...

取消回复欢迎 发表评论: