【瑞萨RA-eco-RA6M4评测】Zephyr MQTT物联网监测系统
# DA16200 MQTT 发布移植文档
> 本文档说明在 DA16200 AT 驱动上实现的 MQTT 业务:broker 配置、连接建立流程、JSON 数据发布(SHT30 温湿度),以及调试方法。
>
> DA16200 整体移植见:[【瑞萨RA-eco-RA6M4评测】Zephyr驱动DA16200 wifi模块 - #板卡评测 - 与非网](https://www.eefocus.com/forum/thread-236025-1-1.html)
> NTP 对时见
> [【瑞萨RA-eco-RA6M4评测】Zephyr 为了较时,我用上了NTP - #板卡评测 - 与非网](https://www.eefocus.com/forum/thread-236026-1-1.html)
---
## 目录
1. [概述](#1-概述)
2. [配置项](#2-配置项)
3. (#3-at-命令流程)
4. [应用集成](#4-应用集成)
5. (#5-api)
6. [注意事项与排错](#6-注意事项与排错)
---
## 1. 概述
SHT30 (I2C) ──×100 定点整数──▶ main.c 拼 JSON ──▶ da16200_mqtt_publish()
│ AT+NWMQMSG (UART)
▼
DA16200 模块内置 MQTT 客户端
│ TCP 1883
▼
MQTT broker (主题 sensor/tab5_203634/temperature)
```
- MQTT 协议栈跑在 **DA16200 模块内部**(AT 命令控制),MCU 不参与 TCP/MQTT 协议细节,只负责配置和发发布命令;
- broker 连接由**连接管理线程**在 WiFi 连网成功(并完成 NTP 对时)后自动建立,断线重连后自动重建;
- 应用层只需调 `da16200_mqtt_publish()`,未就绪时返回 `-ENOTCONN` 自动跳过。
---
## 2. 配置项
全部在 `src/drivers/da16200.h`,**烧录前必须填写**:
```c
#define DA16200_MQTT_BROKER "192.168.1.100" /* broker 地址(IP 或域名) */
#define DA16200_MQTT_PORT "1883" /* 明文端口;TLS 是另一套命令 */
#define DA16200_MQTT_USER "YOUR_MQTT_USER"
#define DA16200_MQTT_PW "YOUR_MQTT_PASSWORD"
#define DA16200_MQTT_CLIENT_ID"ra6m4-client" /* broker 侧需唯一 */
#define DA16200_MQTT_TOPIC "sensor/tab5_203634/temperature"
```
发布周期在 `src/main.c`:`#define MQTT_PUB_PERIOD_MS 10000`(10 秒)。
---
## 3. AT 命令流程
`mqtt_setup()`(`src/drivers/da16200.c`),WiFi 连网成功后由管理线程执行,与 FSP 示例 `mqtt_con_routine()` 一致:
| 步骤 | 命令 | 说明 |
|------|------|------|
| 1 | `AT+NWMQBR=,` | 设置 broker 地址和端口 |
| 2 | `AT+NWMQQOS=0` | QoS 0(最多一次) |
| 3 | `AT+NWMQLI=,` | 登录用户名/密码 |
| 4 | `AT+NWMQCID=` | Client ID |
| 5 | `AT+NWMQCL=1` | 启动 MQTT 客户端,连接 broker |
发布:
```
AT+NWMQMSG='<msg>','<topic>'
```
**JSON 引号规则(重要)**:AT 参数中含逗号或单引号时,参数必须用单引号包裹。JSON payload 含大量逗号和双引号,因此整条消息用单引号包住(手册同款示例:`AT+NWMQMSG='{"car":"red", "type":"bus"}'`)。驱动中的拼接:
```c
snprintf(cmd, sizeof(cmd), "AT+NWMQMSG='%s',%s\r\n", payload, topic);
```
其他事实:
- `AT+NWMQCL` 只是启动/停止客户端,**重启后不自动恢复**——所以每次重连后都要重新执行整套 `mqtt_setup()`;
- 消息最大长度 256 字节(本应用 JSON 约 40 字节,余量充足);
- `AT+NWMQCL=1` 返回 `OK` 只表示命令被受理,broker 真正连上的标志是扩展响应 `+NWMQCL:1`(broker 不可达时也会先回 `OK`,见 §6)。
---
## 4. 应用集成
`main.c` 主循环中,联网状态下每 10 秒发布一次温湿度:
```c
if (++mqtt_pub_cnt >= MQTT_PUB_PERIOD_MS / ANIM_FRAME_MS) {
mqtt_pub_cnt = 0;
if (da16200_is_connected()) {
char payload;
/* Publish temperature and humidity as one JSON payload */
snprintf(payload, sizeof(payload),
"{\"temperature\":%d,\"humidity\":%d}",
(int)sht.temperature, (int)sht.humidity);
da16200_mqtt_publish(DA16200_MQTT_TOPIC, payload);
}
}
```
实际发布示例:
```json
{"temperature":2867,"humidity":7517}
```
**数值格式**:直接发布 SHT30 的 ×100 定点整数(2867 = 28.67 ℃,7517 = 75.17 %RH),无浮点、无歧义,平台侧除以 100 即可。如需浮点格式,自行改为 `%d.%02d` 拼接。
未联网时 `da16200_is_connected()` 为 false,直接跳过本轮发布,主循环不受任何影响。
MQTTx接收效果:
!(https://www.eefocus.com/forum/data/attachment/forum/202607/31/234323yc7qf9ff9zckskf0.png)
---
## 5. API
```c
/* da16200.h */
int da16200_mqtt_publish(const char *topic, const char *payload);
```
| 返回值 | 含义 |
|--------|------|
| `0` | 发布成功(模块回 `OK`) |
| `-ENOTCONN` | WiFi 未连接或 MQTT 尚未就绪,消息被丢弃 |
| `-ETIMEDOUT` | AT 层失败(串口会打印模块原始回复) |
---
## 6. 注意事项与排错
| 现象 | 原因 | 处理 |
|------|------|------|
| `no match for AT+NWMQMSG...` + `got: ERROR:-6` | **-6 = Not connected**:模块与 broker 没有连接 | 最常见:broker 地址/用户名/密码没填或填错(占位符 `192.168.1.100`)。检查 broker 可达性、端口、认证方式 |
| `MQTT ready` 但发布报 -6 | `NWMQCL=1` 的 `OK` 只是受理,broker 连接实际没建立 | 同上,查 broker 配置;模块连上 broker 时会打印 `+NWMQCL:1` |
| `no match for AT+NWMQBR/...` | 建立流程某步被拒 | 看 `got:` 后的错误码:-4 参数错(检查 IP/端口格式)、-1 命令不支持(固件裁剪) |
| broker 收不到但 MCU 无报错 | QoS 0 无确认,或主题拼写不一致 | 在 broker 侧 `mosquitto_sub -t 'sensor/#' -v` 确认主题路径 |
| 断网期间的发布 | 自动丢弃(`-ENOTCONN`) | 属预期;重连后 MQTT 自动重建,下一轮周期恢复发布 |
验证方法(broker 侧):
```bash
mosquitto_sub -h <broker> -t 'sensor/tab5_203634/temperature' -v
# 每 10 秒一条:
# sensor/tab5_203634/temperature {"temperature":2867,"humidity":7517}
```
---
## 参考
- UM-WI-003《DA16200 AT Command User Manual》—— `NWMQBR/NWMQQOS/NWMQLI/NWMQCID/NWMQCL/NWMQMSG` 命令定义、JSON 单引号规则、错误码表
- Renesas FSP 示例 `RA6M4_DA16200_MQTT_CLIENT`(`mqtt_con_routine()`)—— 建立流程来源
页:
[1]