返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[应用方案] APM32实现MQTT通信(三)_编写MQTTClient测试程序,与MQTT服务端进行通信

[复制链接]
 楼主| luobeihai 发表于 2024-12-12 22:02 | 显示全部楼层 |阅读模式
<
本帖最后由 luobeihai 于 2024-12-12 22:07 编辑

#申请原创# @21小跑堂

0. 前言

前面的文章《APM32实现MQTT通信(二)_实现ESP8266模块的socket接口函数,以提供MQTTClient库底层数据收发接口》,链接:

https://bbs.21ic.com/icview-3420442-1-1.html

已经实现了通过socket接口函数,进行数据的收发。基于此我们就可以编写MQTT的客户端测试程序,然后去连接MQTT的服务端,从而实现远程控制。

本文将实现APM32F407运行MQTTClient的程序,然后PC端将运行MQTT的服务端程序,然后APM32F407通过MQTT去连接PC端运行的服务端,实现远程通信。

1. 编写APM32运行的MQTTClient测试程序

我使用的 MQTT 函数库到这里下载:https://github.com/jiejieTop/mqttclient

我们可以根据里面的MQTT代码库的测试示例程序,编写适配自己设备上运行的程序,代码如下:

  1. void mqtt_client_test(void *parameter)
  2. {
  3.         int result = 0;
  4.         char buf[32];
  5.         int cnt = 0;
  6.         
  7.     mqtt_client_t *client = NULL;
  8.     mqtt_message_t msg;

  9.     memset(&msg, 0, sizeof(msg));

  10.     mqtt_log_init();

  11.     client = mqtt_lease();
  12.         
  13.     mqtt_set_port(client, "1883");

  14.     mqtt_set_host(client, "192.168.0.103");                         // 电脑的IP地址
  15.     mqtt_set_client_id(client, random_string(10));
  16.     mqtt_set_user_name(client, random_string(10));
  17.     mqtt_set_password(client, random_string(10));
  18.     mqtt_set_clean_session(client, 1);
  19.         
  20.     /* 连接 MQTT Server */
  21.     if (0 != mqtt_connect(client))
  22.     {
  23.                 printf("mqtt_connect error\r\n");
  24.                 vTaskDelete(NULL);
  25.     }
  26.         
  27.     /**
  28.      * 订阅主题为 topic1 的消息,如果 MQTT Server 发布了这个主题的消息,那么设备就会
  29.      * 收到这条消息,并且还会运行这条消息对应的处理函数 topic1_handler
  30.      */
  31.     result = mqtt_subscribe(client, "topic1", QOS0, topic1_handler);
  32.         if (result)
  33.         {
  34.                 printf("mqtt_subscribe topic1 error\r\n");
  35.         }

  36.     msg.payload = buf;
  37.     msg.qos = QOS0;

  38.     while (1)
  39.     {
  40.                 sprintf(buf, "mqtt_test, %d", cnt++);
  41.         msg.payloadlen = strlen(msg.payload);
  42.                 mqtt_publish(client, "mqtt_publish", &msg);                // MQTT Client 发布主题为 mqtt_publish 的消息给 MQTT Server
  43.         vTaskDelay(2000);
  44.     }
  45. }

编写完成之后,我们需要创建一个 MQTT Client 测试任务,我这里使用的系统是 FreeRTOS ,所以通过FreeRTOS提供的任务函数创建一个MQTT测试任务即可。

结合前面的代码,我们需要创建两个任务,一个是 at_recv_parser 任务,这个任务是一直阻塞等待接收 ESP8266 模块通过串口发送过来的数据,并且对数据进行解析后提供给其他的任务使用。另一个任务就是 mqtt_client_test 任务,即 MQTTClient 测试任务,里面负责发布或者订阅消息

  1. /* 任务属性 */
  2. const osThreadAttr_t defaultTask_attributes = {
  3.   .name = "defaultTask",
  4.   .priority = (osPriority_t) osPriorityNormal,
  5.   .stack_size = 512 * 4
  6. };

  7. void FreeRTOS_Init(void)
  8. {
  9.     osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);   // 默认任务,为了测试代码是否正在运行
  10.     osThreadNew(mqtt_client_test, NULL, &defaultTask_attributes);   // MQTTClient测试任务
  11.     osThreadNew(at_recv_parser, NULL, &defaultTask_attributes);                // AT命令解析任务
  12. }

2. PC端安装MQTT服务端程序

编写好上面的代码之后,就可以编译下载到开发板上进行测试了,我使用的是 APM32F407 芯片进行测试。

但是在测试之前,我们需要在PC端安装MQTT服务程序,然后APM32F407运行的MQTT客户端程序,去连接PC电脑的服务端程序。

2.1 在PC上安装两个应用程序

需要在PC端安装一个 MQTT Server 程序(接收开发板的连接),和一个 MQTT Client 程序(发布或者订阅开发板的消息)。

image-20220819223642398.png

  • mosquitto-2.0.14-install-windows-x64 :是在 PC 上运行的 MQTT Server 程序,这个应用程序在后面的实验中是需要一直运行的。
  • MQTTX-Setup-1.7.2-x64 :图形化 MQTT Client 桌面程序,可以订阅和发布消息。

2.2 修改 mosquitto 配置文件

安装好了这个 MQTT Server 程序之后,默认只支持电脑上的回环测试IP的(127.0.0.1),我们需要支持我们自己电脑的 IP 的话,那需要修改安装目录下的配置文件 mosquitto.conf 。

  • 在232行设置默认的监听端口为1883,去 ‘#’ 掉注释符号即可。
    image-20220819225724342.png
  • 在529行,改为允许异步接收,即更改为 true 。
    image-20220819225948493.png

2.2 启动 mosquitto 服务程序

该程序默认安装在,c:\Program Files\mosquitto 这个目录下,我们需要启动命令行,然后进入到这个目录下启动这个程序。

  1. cd  "c:\Program Files\mosquitto"                        # 进入目录
  2. .\mosquitto.exe -c mosquitto.conf -v                # 启动MQTT服务程序

image-20220819235521908.png

下面进行的实验中,都要保持 MQTTServer 程序移植在运行。

2.3 MQTTX 程序去连接 mosquitto
  • 打开 MQTTX 程序,建立一个连接。

image-20220819235943176.png

连接之后,命令行 mosquitto 那边会提示连接成功。

image-20220820000254675.png

  • 订阅 mqtt_publish 主题,因为代码里面写的就是发布这个主题消息的。所以电脑上运行的客户端订阅这个主题。
    image-20220820000411263.png

3. APM32F407运行MQTTClient程序,与PC端的MQTTServer实现通信

下载程序到开发板运行,当程序运行起来后,就会去连接电脑上运行的 mosquitto MQTT服务程序。这个时候,开发板不断发布主题 mqtt_publish 的消息,而有因为 MQTTX 订阅了这个主题,所以服务器会转发这个主题消息到 MQTTX 上。如下:

image-20220820001010752.png

这个实际的通信过程其实就是,开发板就是我们的设备,而 MQTTX 是电脑上运行的一个 MQTT 客户端程序,这个程序也可以在手机上运行等等。 mosquitto MQTT服务程序在这个过程中充当消息转发而已。大致通信过程如下:

image-20220820002243771.png

通过上述过程,这样我们就可以通过手机远程去控制我们的设备,或者我们的远程设备上报数据到手机上面了


打赏榜单

21小跑堂 打赏了 50.00 元 2024-12-18
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

APM32运行MQTTClient并实现与MQTTServer通信。通过该测试,用户可熟悉MQTT的运行机制,了解订阅和发布的相对关系。值得借鉴  发表于 2024-12-18 17:39
呐咯密密 发表于 2024-12-13 19:57 | 显示全部楼层
s
MQTT Server 程序在哪获取
 楼主| luobeihai 发表于 2024-12-21 15:12 | 显示全部楼层
s
呐咯密密 发表于 2024-12-13 19:57
MQTT Server 程序在哪获取

PC端运行的MQTT Server程序 mosquitto , 是开源的。你搜一下网上都能下载到的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

101

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部