eefocus_3914144 发表于 2026-7-31 23:43:57

【瑞萨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]
查看完整版本: 【瑞萨RA-eco-RA6M4评测】Zephyr MQTT物联网监测系统