发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[应用方案]

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

[复制链接]
913|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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代码库的测试示例程序,编写适配自己设备上运行的程序,代码如下:

void mqtt_client_test(void *parameter)
{
        int result = 0;
        char buf[32];
        int cnt = 0;
        
    mqtt_client_t *client = NULL;
    mqtt_message_t msg;

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

    mqtt_log_init();

    client = mqtt_lease();
        
    mqtt_set_port(client, "1883");

    mqtt_set_host(client, "192.168.0.103");                         // 电脑的IP地址
    mqtt_set_client_id(client, random_string(10));
    mqtt_set_user_name(client, random_string(10));
    mqtt_set_password(client, random_string(10));
    mqtt_set_clean_session(client, 1);
        
    /* 连接 MQTT Server */
    if (0 != mqtt_connect(client))
    {
                printf("mqtt_connect error\r\n");
                vTaskDelete(NULL);
    }
        
    /**
     * 订阅主题为 topic1 的消息,如果 MQTT Server 发布了这个主题的消息,那么设备就会
     * 收到这条消息,并且还会运行这条消息对应的处理函数 topic1_handler
     */
    result = mqtt_subscribe(client, "topic1", QOS0, topic1_handler);
        if (result)
        {
                printf("mqtt_subscribe topic1 error\r\n");
        }

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

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

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

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

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

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

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

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

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

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

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


  • 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,去 ‘#’ 掉注释符号即可。
  • 在529行,改为允许异步接收,即更改为 true 。

2.2 启动 mosquitto 服务程序

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

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


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

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


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


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

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

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


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


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


使用特权

评论回复

打赏榜单

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

评论
21小跑堂 2024-12-18 17:39 回复TA
APM32运行MQTTClient并实现与MQTTServer通信。通过该测试,用户可熟悉MQTT的运行机制,了解订阅和发布的相对关系。值得借鉴 
沙发
呐咯密密| | 2024-12-13 19:57 | 只看该作者
MQTT Server 程序在哪获取

使用特权

评论回复
板凳
luobeihai|  楼主 | 2024-12-21 15:12 | 只看该作者
呐咯密密 发表于 2024-12-13 19:57
MQTT Server 程序在哪获取

PC端运行的MQTT Server程序 mosquitto , 是开源的。你搜一下网上都能下载到的。

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

96

帖子

2

粉丝