【RA4M2设计挑战赛】DA16200 MQTT数据
前面实现了用库函数实现的MQTT数据,今天我偿试用AT组件来实现MQTT手工调试来实现。因为掉了坑,在此记录,以便后来想做AT组件,或者MQTT的借鉴之用。
1、如何添加组件与学习,烦请大家参照组件类 - AT 命令客户端应用笔记 - 《RT-Thread应用笔记》 - 书栈网 · BookStack这篇文章来学习
2、按照这篇帖子设置好组件后重新生成MDK工程。
因为DA16200模块接到PMOD2接口上,根据原理图需要把串口配到uart0上:
MDK工程添加at_da16200.c/h文件,并添加到工程里以及头文件的引用
代码如下:
#include <stdlib.h>
#include <string.h>
#include <rtthread.h>
#include <at.h>
#include "at_da16200.h"
/* AT+CIFSR Query local IP address and MAC */
int at_client_test(int argc, char **argv)
{
at_response_t resp = RT_NULL;
int result = 0;
if (argc != 1)
{
rt_kprintf("at_client_test - AT client send commands to AT server.");
return -1;
}
/* 创建响应结构体,设置最大支持响应数据长度为 256 字节
(最大响应长度用户根据实际需求自定义),响应数据行数无限制,超时时间为 5 秒 */
resp = at_create_resp(256, 0, rt_tick_from_millisecond(5000));
if (resp == RT_NULL)
{
rt_kprintf("No memory for response structure!");
return -2;
}
/* 关闭回显功能 */
at_exec_cmd(resp, "ATE");
/* AT Client 发送查询 IP 地址命令并接收 AT Server 响应 */
/* 响应数据及信息存放在 resp 结构体中 */
result = at_exec_cmd(resp, "AT+CIFSR");
if (result != RT_EOK)
{
rt_kprintf("AT client send commands failed or return response error!");
goto __exit;
}
/* 按行数循环打印接收到的响应数据 */
{
const char *line_buffer = RT_NULL;
rt_kprintf("Response buffer");
for(rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++)
{
if((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL)
{
rt_kprintf("line %d buffer : %s", line_num, line_buffer);
}
else
{
rt_kprintf("Parse line buffer error!");
}
}
}
/* 按自定义表达式(sscanf 解析方式)解析数据,得到对应数据 */
{
char resp_arg[AT_CMD_MAX_LEN] = { 0 };
/* 自定义数据解析表达式 ,用于解析两双引号之间字符串信息 */
const char * resp_expr = "%*[^\"]\"%[^\"]\"";
rt_kprintf(" Parse arguments");
/* 解析响应数据中第一行数据,得到对应 IP 地址 */
if (at_resp_parse_line_args(resp, 1, resp_expr, resp_arg) == 1)
{
rt_kprintf("Station IP : %s", resp_arg);
memset(resp_arg, 0x00, AT_CMD_MAX_LEN);
}
else
{
rt_kprintf("Parse error, current line buff : %s", at_resp_get_line(resp, 4));
}
/* 解析响应数据中第二行数据,得到对应 MAC 地址 */
if (at_resp_parse_line_args(resp, 2, resp_expr, resp_arg) == 1)
{
rt_kprintf("Station MAC : %s", resp_arg);
}
else
{
rt_kprintf("Parse error, current line buff : %s", at_resp_get_line(resp, 5));
goto __exit;
}
}
__exit:
if(resp)
{
/* 删除 resp 结构体 */
at_delete_resp(resp);
}
return result;
}
/* 设置当前 AT 客户端最大支持的一次接收数据的长度 */
#define AT_CLIENT_RECV_BUFF_LEN 512
int at_client_test_init(int argc, char **argv)
{
if (argc != 2)
{
rt_kprintf("at_client_init <dev_name> -- AT client initialize.\n");
return -RT_ERROR;
}
at_client_init(argv[1], AT_CLIENT_RECV_BUFF_LEN);
return RT_EOK;
}
#ifdef FINSH_USING_MSH
#include <finsh.h>
/* 添加 AT Client 测试命令到 shell */
MSH_CMD_EXPORT(at_client_test, AT client send cmd and get response);
/* 添加 AT Client 初始化命令到 shell */
MSH_CMD_EXPORT_ALIAS(at_client_test_init, at_client_init, initialize AT client);
#endif
编译后下载,把DA16200wif模块插入PMOD2上。
用串口终端连接上开发板:
同时把我们的自建的MQTT服务器打开,监测客户端的连接情况:
在串口终端上连上按TAB键查看已加载模块:
msh >
msh >[I/I2C] I2C bus [i2c1] registered
\ | /
- RT - Thread Operating System
/ | \ 5.0.0 build Feb 8 2023 19:50:34
2006 - 2022 Copyright by RT-Thread team
[I/sensor] rt_sensor[temp_hs300x] init success
[I/sensor] rt_sensor[humi_hs300x] init success
hal_entry run.
msh >
RT-Thread shell commands:
at - RT-Thread AT component cli: at <server|client [dev_name]>
canstat - stat can device status
pin - pin [option]
reboot - Reboot System
help - RT-Thread shell help.
ps - List threads in the system.
free - Show the memory usage in the system.
clear - clear the terminal screen
version - show RT-Thread version information
list - list objects
can_sample - can device sample
sensor_fifo - Sensor fifo mode test function
sensor_int - Sensor interrupt mode test function
sensor_polling - Sensor polling mode test function
sensor - sensor test function
at_client_test - AT client send cmd and get response
at_client_init - initialize AT client
msh >
看到有at_client已经有了,执行at_client_init uart0初始化AT
接着我们打开at client手动模式:
这样我们就可以手工输入AT命令来调试程序了。
接下来我们手动连接到我们的服务器:
AT+NWMQDEL---删除mqtt的配置
AT+NWMQBR=192.168.3.192,1883 连接到服务器
AT+NWMQTS=1,ugl 设置订阅主题 为:lugl
AT+NWMQTP=lugl 设置发布主题为lugl
AT+NWMQCL=1 使用MQTT连接
如果到这一步DA16200返回NWMQCL:1说明连接成功就可以发送数据了。
我们在服务器上看到客户端已经连上去了:
接下来我们发布数据:
AT+NWMQMSG=HELLO RA4M2 MQTT
从下面截图看,收发数据正常
从服务器、MQTTx分别发送数据,模块也正常接收到数据:
至此,我们的AT组件调试MQTT就通过了。下一步写入函数进行调试。
1、今天我手工试命令时,不小心进了AT+DPM(低耗模式)结果误认为模块挂了,还有有RA罗工的帮助,用手工拉低IO再发送AT+DPM=0(退出低功耗模式)才恢复正常调试模式。
2、我前面配置了一次MQTT的数据结果死活连不上服务器。后面我查找命令用:AT+NWMQDEL这个命令来重置MQTT配置,后面才正常使用。
更多回帖