瑞萨单片机william hill官网
直播中

华仔stm32

3年用户 2935经验值
擅长:嵌入式技术
私信 关注
[经验]

【RA4M2设计挑战赛】RTT 之AT组件实现MQTT数据调试

【RA4M2设计挑战赛】DA16200 MQTT数据
前面实现了用库函数实现的MQTT数据,今天我偿试用AT组件来实现MQTT手工调试来实现。因为掉了坑,在此记录,以便后来想做AT组件,或者MQTT的借鉴之用。

RTT添加AT组件

1、如何添加组件与学习,烦请大家参照组件类 - AT 命令客户端应用笔记 - 《RT-Thread应用笔记》 - 书栈网 · BookStack这篇文章来学习
2、按照这篇帖子设置好组件后重新生成MDK工程。

FSP添加用于AT的串口

因为DA16200模块接到PMOD2接口上,根据原理图需要把串口配到uart0上:

image.png

测试程序

MDK工程添加at_da16200.c/h文件,并添加到工程里以及头文件的引用

image.png
代码如下:

#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

用串口终端连接上开发板:
image.png

同时把我们的自建的MQTT服务器打开,监测客户端的连接情况:

image.png
在串口终端上连上按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
image.png

接着我们打开at client手动模式:
image.png

这样我们就可以手工输入AT命令来调试程序了。

image.png

接下来我们手动连接到我们的服务器:

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说明连接成功就可以发送数据了。
image.png
我们在服务器上看到客户端已经连上去了:
image.png

接下来我们发布数据:
AT+NWMQMSG=HELLO RA4M2 MQTT
从下面截图看,收发数据正常
image.png
从服务器、MQTTx分别发送数据,模块也正常接收到数据:

image.png

至此,我们的AT组件调试MQTT就通过了。下一步写入函数进行调试。

避坑要点

1、今天我手工试命令时,不小心进了AT+DPM(低耗模式)结果误认为模块挂了,还有有RA罗工的帮助,用手工拉低IO再发送AT+DPM=0(退出低功耗模式)才恢复正常调试模式。
2、我前面配置了一次MQTT的数据结果死活连不上服务器。后面我查找命令用:AT+NWMQDEL这个命令来重置MQTT配置,后面才正常使用。

更多回帖

发帖
×
20
完善资料,
赚取积分