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

安装好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服务器之间网络连接的代码:


#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);
}

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


//发布消息
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回调函数,通知客户端处理消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值