本帖最后由 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 程序(发布或者订阅开发板的消息)。
2.2 修改 mosquitto 配置文件
安装好了这个 MQTT Server 程序之后,默认只支持电脑上的回环测试IP的(127.0.0.1),我们需要支持我们自己电脑的 IP 的话,那需要修改安装目录下的配置文件 mosquitto.conf 。
2.2 启动 mosquitto 服务程序
该程序默认安装在,c:\Program Files\mosquitto 这个目录下,我们需要启动命令行,然后进入到这个目录下启动这个程序。
cd "c:\Program Files\mosquitto" # 进入目录
.\mosquitto.exe -c mosquitto.conf -v # 启动MQTT服务程序
下面进行的实验中,都要保持 MQTTServer 程序移植在运行。
2.3 MQTTX 程序去连接 mosquitto
连接之后,命令行 mosquitto 那边会提示连接成功。
3. APM32F407运行MQTTClient程序,与PC端的MQTTServer实现通信
下载程序到开发板运行,当程序运行起来后,就会去连接电脑上运行的 mosquitto MQTT服务程序。这个时候,开发板不断发布主题 mqtt_publish 的消息,而有因为 MQTTX 订阅了这个主题,所以服务器会转发这个主题消息到 MQTTX 上。如下:
这个实际的通信过程其实就是,开发板就是我们的设备,而 MQTTX 是电脑上运行的一个 MQTT 客户端程序,这个程序也可以在手机上运行等等。 mosquitto MQTT服务程序在这个过程中充当消息转发而已。大致通信过程如下:
通过上述过程,这样我们就可以通过手机远程去控制我们的设备,或者我们的远程设备上报数据到手机上面了。
|
APM32运行MQTTClient并实现与MQTTServer通信。通过该测试,用户可熟悉MQTT的运行机制,了解订阅和发布的相对关系。值得借鉴