安装好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回调函数,通知客户端处理消息