Mosquitto代码编写与EMQX的使用
一、Mosquitto使用
'常用头文件'
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>
#include <mqtt_protocol.h>
1-常用函数
1. mosquitto_lib_init
函数原型: int mosquitto_lib_init(void)
入口参数:无
返回值:表示初始化是否成功
功能:用于在使用Mosquitto库之前进行必要的初始化操作,例如分配内存和设置默认值
2. mosquitto_new
函数原型: struct mosquitto *mosquitto_new(const char *id, bool clean_start, void *userdata)
入口参数1:要设置的Client ID
入口参数2:是否进行清理启动,即在连接到MQTT代理时是否清除之前的会话信息
入口参数3:设置用户数据,可以将自定义的数据传递给mosquitto客户端实例,以便在回调函数中使用
返回值:创建的客户端地址
功能:创建一个新的mosquitto客户端实例
3. mosquitto_username_pw_set
函数原型: int mosquitto_username_pw_set(struct mosquitto *mosq, const char *username, const char *password)
入口参数1:要设置的mosquitto客户端实例
入口参数2:要连接的MQTT用户名
入口参数3:要连接的MQTT密码
返回值:表示设置是否成功
功能:设置mosquitto客户端连接的用户名及密码
4. mosquitto_lib_cleanup
函数原型: int mosquitto_lib_cleanup(void)
入口参数:无
返回值:表示是否成功
功能:用于清理与mosquitto库相关的资源和内存。它会释放与mosquitto库初始化时分配的内存,并进行一些清理操作,以确保程序正常退出时不会出现内存泄漏或其他问题
5. mosquitto_connect
函数原型: int mosquitto_connect(struct mosquitto *mosq, const char *host, int port, int keepalive)
入口参数1:要连接的mosquitto客户端
入口参数2:要连接的服务器主机名/IP地址
入口参数3:要连接的端口号
入口参数4:保持连接的时间间隔
返回值:表示是否成功
功能:用于连接到MQTT代理服务器
6. mosquitto_message_callback_set
函数原型: void mosquitto_message_callback_set(struct mosquitto *mosq, void (*on_message)(struct mosquitto *, void *, const struct mosquitto_message *))
入口参数1:要绑定的mosquitto客户端
入口参数2:要绑定的回调函数
返回值:无
功能:设置当接收到消息时的回调函数
7. mosquitto_subscribe
函数原型: libmosq_EXPORT int mosquitto_subscribe(struct mosquitto *mosq, int *mid, const char *sub, int qos);
入口参数1:要订阅的mosquitto客户端
入口参数2:一个指向整数的指针,用于存储订阅消息的ID
入口参数3:要订阅的主题的字符串
入口参数4:表示服务质量(QoS)的整数
返回值:表示是否成功
功能:订阅MQTT主题
8. mosquitto_publish
函数原型: int mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain)
入口参数1:要发送的mosquitto客户端
入口参数2:指向整数的指针,用于存储消息的ID
入口参数3:字符串,表示要发布消息的主题
入口参数4:消息的长度
入口参数5:指向消息内容的指针
入口参数6:消息的服务质量等级
入口参数7:是否保留消息
返回值:表示是否成功
功能:用于发布消息的函数
9. mosquitto_loop
函数原型: int mosquitto_loop(struct mosquitto *mosq, int timeout, int max_packets)
入口参数1:要循环的mosquitto客户端
入口参数2:是超时时间(以毫秒为单位)
入口参数3:最大处理数据包的数量
返回值:表示是否成功
功能:在MQTT客户端中执行网络循环
2-测试程序
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>
#include <mqtt_protocol.h>
#define KEEP_ALIVE 60 //控制心跳间隔长短/秒
struct mosquitto *mosq = NULL;
//订阅主题接收处理
void my_message_calllback(struct mosquitto *mosq,void *obj,const struct mosquitto_message *msg)
{
if(mosquitto_publish(mosq,NULL,"pub",strlen(msg->payload),msg->payload,2,0) != MOSQ_ERR_SUCCESS)
{
printf("mosquitto_publish() failed: %s\n",strerror(errno));
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
}
}
int main(int argc, char *argv[])
{
int rc;
char *ip = "192.168.43.189";//IP
char *topic = "sub";
int port = 1883;//端口号
char buffer[256] = "pub data";
//初始化mqtt库 初始化需要的网络资源
mosquitto_lib_init();
//创建一个新的mosquitto实例
mosq = mosquitto_new(NULL,true,NULL);
//设置账号密码
mosquitto_username_pw_set(mosq,"admin","public");
if(!mosq)
{
printf("mosquitto_new() failed: %s\n",strerror(errno));
mosquitto_lib_cleanup();
return -1;
}
//连接服务器
if(mosquitto_connect(mosq,ip,port,KEEP_ALIVE) != MOSQ_ERR_SUCCESS)
{
printf("mosquitto_connect() failed: %s\n",strerror(errno));
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return -1;
}
//绑定订阅主题接收处理函数
mosquitto_message_callback_set(mosq,my_message_calllback);
//启动一个单独的线程来处理与MQTT代理的通信
/*if(mosquitto_loop_start(mosq) != MOSQ_ERR_SUCCESS)
{
printf("mosquitto_loop_start() failed: %s\n",strerror(errno));
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
}*/
if((mosquitto_subscribe(mosq,NULL,topic,2)) != MOSQ_ERR_SUCCESS)
{
printf("failed to subscribe from broker: %s\n",strerror(errno));
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return -3;
}
/*if(mosquitto_publish(mosq,NULL,"pub",strlen(buffer),buffer,0,0) != MOSQ_ERR_SUCCESS)
{
printf("mosquitto_publish() failed: %s\n",strerror(errno));
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
}*/
while(1)
{
mosquitto_loop(mosq,-1,1);
}
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return 0;
}
二、EMQX
1-查看EMQX信息
./emqx/bin/emqx
2-查看/修改EMQX配置信息
nano ./emqx/etc/emqx.conf
3-启动
启动关闭方式根据安装方式,参考官网指南
./emqx/bin/emqx start
4-关闭
./emqx/bin/emqx stop
三、测试
1-安装工具MQTTX
2-测试服务器是否有效
启动服务器
软件登陆连接服务器
设置完成点击连接
可以看到收发正常,服务器可以使用
2-测试程序是否有效
编译上文的测试程序 功能:连接服务器,订阅sub主题,接收到来自sub主题数据,再通过pub主题发出接收的消息
记得修改程序中的客户端参数 IP,端口,订阅/发布主题等等
- 打开服务器
- 编译运行程序
- 通过MQTTX软件查看程序功能是否正常
程序功能:MQTTX软件通过sub主题下发数据,程序a.out通过订阅sub主题获取来自sub主题的数据,再通过pub主题发送接收的数据