1、前言
前面对MQTT进行了简单的介绍,并了解了如何在Linux上搭建MQTT 的运行 环境,参考连接:MQTT通讯协议(mosquitto)在Linux上的环境构建与测试,那些仅仅是经过命令去测试,如今咱们来经过mosquitto的官方源码,编程实现MQTT协议的发布订阅。
上一章中经过源码编译安装后,将会有几个咱们须要用到的文件。对应路径以下:html
mosquitto-1.6.10/lib/libmosquitto.so.1
mosquitto-1.6.10/lib/cpp/libmosquittopp.so.1
mosquitto-1.6.10/lib/mosquitto.h
mosquitto-1.6.10/lib/mosquittopp.h
下面的程序是使用标准C语言来实现,因此咱们只须要用到mosquitto.h和libmosquitto.so.1两个文件就能够了。web
2、同步函数
mosquitto有同步和异步两种通信方式。这里的异步是一种非阻塞的方式,比同步通讯性能更好,由于同步的方式是“通讯+等待”的阻塞模式,不过接下来先编写一下mosquitto同步函数,再写异步函数。
具体函数以下:
对mosquitto的函数说明能够参照官方网站的API解释:参考连接如:mosquitto_connect
编程
具体代码
订阅端(sub.c)api
#include
#include
#include
#include "mosquitto.h"
#define HOST "localhost"
#define PORT 1883
#define KEEP_ALIVE 60
#define MSG_MAX_SIZE 512
// 定义运行标志决定是否须要结束
static int running = 1;
void my_connect_callback(struct mosquitto *mosq, void *obj, int rc)
{
printf("Call the function: on_connect\n");
if(rc){
// 链接错误,退出程序
printf("on_connect error!\n");
exit(1);
}else{
// 订阅主题
// 参数:句柄、id、订阅的主题、qos
if(mosquitto_subscribe(mosq, NULL, "topic1", 2)){
printf("Set the topic error!\n");
exit(1);
}
}
}
void my_disconnect_callback(struct mosquitto *mosq, void *obj, int rc)
{
printf("Call the function: my_disconnect_callback\n");
running = 0;
}
void my_subscribe_callback(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)
{
printf("Call the function: on_subscribe\n");
}
void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)
{
printf("Call the function: on_message\n");
printf("Recieve a message of %s : %s\n", (char *)msg->topic, (char *)msg->payload);
if(0 == strcmp(msg->payload, "quit")){
mosquitto_disconnect(mosq);
}
}
int main()
{
int ret;
struct mosquitto *mosq;
// 初始化mosquitto库
ret = mosquitto_lib_init();
if(ret){
printf("Init lib error!\n");
return -1;
}
// 建立一个订阅端实例
// 参数:id(不须要则为NULL)、clean_start、用户数据
mosq = mosquitto_new("sub_test", true, NULL);
if(mosq == NULL){
printf("New sub_test error!\n");
mosquitto_lib_cleanup();
return -1;
}
// 设置回调函数
// 参数:句柄、回调函数
mosquitto_connect_callback_set(mosq, my_connect_callback);
mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);
mosquitto_message_callback_set(mosq, my_message_callback);
// 链接至服务器
// 参数:句柄、ip(host)、端口、心跳
ret = mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE);
if(ret){
printf("Connect server error!\n");
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return -1;
}
// 开始通讯:循环执行、直到运行标志running被改变
printf("Start!\n");
while(running)
{
mosquitto_loop(mosq, -1, 1);
}
// 结束后的清理工做
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
printf("End!\n");
return 0;
}
发布端(pub.c)bash
#include
#include
#include
#include
#include "mosquitto