Mosquitto代码编写与EMQX的使用

本文详细介绍了Mosquitto库的基本用法,包括初始化、连接、认证、消息处理以及EMQX的部署和测试。通过示例展示了如何使用Mosquitto进行MQTT通信,并验证其与EMQX的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
👉👉👉Mosquitto编译安装与EMQX部署,由此入

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

在这里插入图片描述
MQTTX下载链接
在这里插入图片描述

2-测试服务器是否有效

启动服务器
在这里插入图片描述
软件登陆连接服务器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
设置完成点击连接
在这里插入图片描述
可以看到收发正常,服务器可以使用

2-测试程序是否有效

编译上文的测试程序 功能:连接服务器,订阅sub主题,接收到来自sub主题数据,再通过pub主题发出接收的消息
记得修改程序中的客户端参数 IP,端口,订阅/发布主题等等

  1. 打开服务器
    在这里插入图片描述
  2. 编译运行程序
    在这里插入图片描述
  3. 通过MQTTX软件查看程序功能是否正常
    程序功能:MQTTX软件通过sub主题下发数据,程序a.out通过订阅sub主题获取来自sub主题的数据,再通过pub主题发送接收的数据
    在这里插入图片描述

👉👉👉Mosquitto编译安装与EMQX部署,由此入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值