VLen六路水族排插 - 机智云WiFi类设备接入协议文档(MCU方案)

产品名称
VLen六路水族排插
产品类型
电工/排插/自定义多路排插
生成日期
2023-06-20

本页为 MCU 与 WiFi 通讯模组的串口通讯协议(机智云标准接入协议 v4.3.1)的 **单页 MediaWiki** 版。完整覆盖 1~4 章,字段逐条展开,并在各命令下以表格列出“字段名 / 字节长度 / 说明”。

1. 设备通讯信息

  • 通讯方式:UART
  • 波特率:9600
  • 数据位:8
  • 奇偶校验:无
  • 停止位:1
  • 数据流控:无
  • 供电:3.3V,电流(Max)150 mA

2. 约定

2.1 传输字节序

默认采用 **大端** 编码(高字节在前,低字节在后)。

2.2 通信交互形式

  • 采用 **一问一答**;每条命令需要接收方给出 ACK 确认;
  • 超时时间 **200 ms**,超时后重发;最多 **重发 3 次**;其后丢弃该包。

2.3 协议格式

指令总体结构

  • 包头(2B)= `0xFFFF`。注意:**非包头部分**如出现 `0xFF`,发送方需在其后**插入** `0x55`;接收方检测到非包头的 `0xFF 55` 需要**移除**该 `0x55`。该填充字节**不计入**包长度及校验和。
  • 包长度(2B):**从命令开始**至**校验和**的字节数(含命令与校验和)。
  • 命令(1B)。
  • 包序号 SN(1B):由发起方给出,自 0 递增,超过 255 后回绕;ACK 回复需回填收到的 SN。
  • Flags(2B):高字节为**通用标记**(跨命令),低字节为**命令内私有标记**(仅本命令意义)。
  • 有效负载:由产品数据点/业务定义。
  • 校验和(1B):对 **[包长度…有效负载]** 做逐字节求和,再取 **mod 256**。

3. 基本通讯协议(必须)

3.1 获取设备信息

WiFi 模组上电后向 MCU 查询设备信息,成功后方可正常工作。

WiFi → MCU(请求)

序号 字段名称 长度(B) 内容说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x01
4 包序号 1 0x##
5 flags 2 0x0000
6 校验和 1 0x##

MCU → WiFi(应答)

# 字段名称 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x02
4 包序号 1 回填请求 SN
5 flags 2 0x0000
6 通用串口协议版本号 8 字符串,如 “00000004”
7 业务协议版本号 8 字符串,如 “00000002”
8 硬件版本号 8 字符串
9 软件版本号 8 字符串
10 产品标识码 ProductKey 32 字符串
11 可绑定状态失效时间 2 秒(大端)。0=随时可绑定;>0 为进入可绑定后的失效秒数
12 设备属性 attributes 8 bit0…bit63 定义(见下)
13 产品秘钥 ProductSecret 32 Hex 字符串
14 DataLen 2 环境参数长度;0=无 Data
15 Data DataLen 环境参数字符串(键值对,见下)
16 校验和 1 0x##
设备属性 attributes(bit0→bit63,自右向左)
  • bit0=1:设备是**中控**;
  • bit1=1:**自动化生成代码**;
  • bit2~bit5(当 bit0=1 生效):中控重置范围:
    • 0000:中控重置
    • 0001:中控重置 + **所有子设备**重置
    • 0010:中控重置 + **所有子设备与用户绑定关系**
    • 0011:中控重置 + **部分子设备**重置(与该中控有关联的子设备)
    • 0100:**所有子设备**重置
    • 0101:**所有子设备与用户绑定关系**
    • 0110:**部分子设备**重置
    • 0111:**部分子设备与用户绑定关系**
  • bit6=1:UDP **加密**;
  • bit7=1:**变长数据点**;
  • bit8=1:设备是**网关**;
  • bit9~bit12(当 bit8=1 生效):网关重置范围:
    • 0000:网关重置
    • 0001:网关重置 + 所有子设备重置
    • 0010:所有子设备重置
  • bit13=1:**低功耗**产品;
  • bit14~bit63:**预留**(保持 0 以免影响云端连接)。
环境参数 Data(key=value,用‘&’连接;示例:
 "wechatId=...&server=...&port=...&apName=...&apPwd=...&m2mKeepAL=...&m2mHT=...&tz=...&LocalHT=...&LocalAckT=...&nwcName=...&cfgMode=...&tScanNum=...&tCon=...&runMode=...")
  1. wechatId:设备微信设备公众号 ID
  2. server:默认服务器域名
  3. port:默认服务器端口
  4. apName:SoftAP 热点名,**后缀追加 4 位 MAC**
  5. apName0:SoftAP 热点名,**不追加 MAC**
  6. apPwd:SoftAP 热点密码;为空=Open
  7. m2mKeepAL:M2M keepalive 秒
  8. m2mHT:M2M 心跳秒
  9. tz:默认时区
  10. LocalHT:串口心跳秒
  11. LocalAckT:串口等待 ACK 基础时间(毫秒)
  12. nwcName:网卡名,例 "eth0"
  13. cfgMode:初始化运行模式(1=SoftAP,2=AirLink)
  14. tScanNum:初始化扫描热点次数(默认 2)
  15. tCon:产测是否连路由(0=否,1=是(默认))
  16. runMode:运行模式(1=单通道(默认);2=双通道,如 Wi‑Fi+BLE/4G+BLE)

3.2 WiFi 模组控制设备

WiFi → MCU,命令 `0x03`,`action=0x11`;MCU 回复 `0x04`(ACK)。

帧格式

# 字段 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x03
4 包序号 1 0x##
5 flags 2 0x0000
6 action 1 0x11
7 attr_flags 6 **是否设置标志位位图**(见下)
8 attr_vals Max 249 **按位顺序紧凑排列**的数据值(见下)
9 校验和 1 0x##
规则
  • `attr_flags` 中**某位=1**,表示 `attr_vals` 中**对应字段**的**数值存在且有效**;为 0 表示该字段**忽略**。
  • `attr_vals` 的字段顺序与 `attr_flags` 的位定义一一对应,按**从低位到高位**、从**bool → 标量 → binary** 的**固定顺序**连续排列。

attr_flags 位定义(共 48 位,bit0→bit47)

字段 类型 / 说明
bit0 switch_1 bool(开关 1)
bit1 switch_2 bool(开关 2)
bit2 switch_3 bool(开关 3)
bit3 switch_4 bool(开关 4)
bit4 switch_5 bool(开关 5)
bit5 switch_6 bool(开关 6)
bit6 power bool(总电源)
bit7 High_temperature_alarm bool
bit8 Low_temperature_alarm bool
bit9 High_Humidity_alarm bool
bit10 Low_Humidity_alarm bool
bit11 High_tds_alarm bool
bit12 Low_tds_alarm bool
bit13 High_ph_alarm bool
bit14 Low_ph_alarm bool
bit15 humidity uint8(0..100,y=1*x+0)
bit16 ph_value uint8(0..140,**y=0.1*x**)
bit17 switch_mode_1 uint8(0..10)
bit18 switch_mode_2 uint8(0..10)
bit19 switch_mode_3 uint8(0..10)
bit20 switch_mode_4 uint8(0..10)
bit21 switch_mode_5 uint8(0..10)
bit22 switch_mode_6 uint8(0..10)
bit23 Temperature_alarm_max uint8(0..100)
bit24 Temperature_alarm_min uint8(0..100)
bit25 Humidity_alarm_max uint8(0..100)
bit26 Humidity_alarm_min uint8(0..100)
bit27 ph_alarm_max uint8(0..140,y=0.1*x)
bit28 ph_alarm_min uint8(0..140,y=0.1*x)
bit29 temp_current_1 uint16(0..1200,**y=1*x-200**)
bit30 temp_current_2 uint16(0..1200,**y=1*x-200**)
bit31 Total_dissolved_solids uint16(0..5000)
bit32 current_voltage uint16(0..5000)
bit33 Current_power uint16(0..10000)
bit34 tds_alarm_max uint16(0..5000)
bit35 tds_alarm_min uint16(0..5000)
bit36 urt_value uint32(0..600000)
bit37 Current_current uint32(0..100000)
bit38 cur_timestamp uint32(Unix 秒)
bit39 cycle_mode_set binary(24B,数组 [1,2,3…])
bit40 temperature_mode_set binary(12B)
bit41 humidity_mode_set binary(12B)
bit42 time_mode_set_1 binary(30B)
bit43 time_mode_set_2 binary(30B)
bit44 time_mode_set_3 binary(30B)
bit45 time_mode_set_4 binary(30B)
bit46 time_mode_set_5 binary(30B)
bit47 time_mode_set_6 binary(30B)
attr_vals 编码顺序与示例(节选)
  • bool 组合位(byte0):`switch_1…switch_6` + `power` + 各报警位,**bit0→bit7**;
  • 接着是 `switch_mode_1…6`(6×uint8)→ `Temperature_alarm_max/min`(2×uint8)→ `Humidity_alarm_max/min`(2×uint8)→ `ph_alarm_max/min`(2×uint8,y=0.1x)→ `tds_alarm_max/min`(2×uint16)→ `cur_timestamp`(uint32)→ `cycle/temperature/humidity_mode_set`(binary)→ `time_mode_set_1…6`(各 30B)。

MCU → WiFi(ACK)

# 字段 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x04
4 包序号 1 回填请求 SN
5 flags 2 0x0000
6 校验和 1 0x##
实施建议
  • 无论状态是否改变,**执行控制后建议立即上报一次**最新设备状态(参见 3.4 上报)。

3.3 WiFi 模组读取设备的当前状态

WiFi → MCU:命令 `0x03`,`action=0x12`;MCU → WiFi:命令 `0x04`,`action=0x13`。

请求

# 字段 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x03
4 包序号 1 0x##
5 flags 2 0x0000
6 action 1 0x12
7 attr_flags 6 与控制命令一致(筛选需要返回的状态)
8 校验和 1 0x##

应答(含 dev_status)

# 字段 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x04
4 包序号 1 0x##
5 flags 2 0x0000
6 action 1 0x13
7 attr_flags 6 与控制命令一致
8 dev_status Max 270 **设备状态**(字段顺序/类型与 3.2 对应)
9 校验和 1 0x##
dev_status 字段说明
  • 位/字段定义与 3.2 `attr_flags` 一致,**编码顺序**与 3.2 的 `attr_vals` 相同;
  • 定标公式:同 3.2 中各字段(例如 `ph_value`、`ph_alarm_*` 为 0.1x;温度 current_* 为 1*x-200)。

3.4 设备 MCU 主动上报当前状态

MCU → WiFi:命令 `0x05`,`action=0x14`,负载为 `dev_status`。

# 字段 长度(B) 说明
1 固定包头 2 0xFFFF
2 包长度 2 len(命令…校验和)
3 命令 1 0x05
4 包序号 1 0x##
5 flags 2 0x0000
6 action 1 0x14
7 attr_flags 6 按需设置(哪些状态有效即置位)
8 dev_status Max 270 状态体(字段/顺序同 3.2/3.3)
9 校验和 1 0x##
上报策略(建议)
  • 接收到“控制设备”命令后,**立即上报**被控制后的数据点组合;
  • 因用户手动或环境变化导致设备状态改变时,仅上报**发生变化**的数据点组合;
  • 可设置**定期上报**(例如每 10 分钟一次)。

3.5 心跳

  • WiFi → MCU:`0x07`;MCU → WiFi:`0x08`。

3.6 通知 WiFi 模组进入配置模式

  • 命令:`0x09`(请求)/ `0x0A`(应答);支持 SoftAP / AirLink / BLE 等。

3.7 重置 WiFi 模组

  • 命令:`0x0B`(请求)/ `0x0C`(应答);清除 SSID/密码/DID/Passcode,恢复出厂。

3.8 推送 WiFi 模组工作状态

  • 命令:`0x0D`(WiFi 状态上报)/ `0x0E`(ACK);状态包含 SoftAP/Station/Onboarding/绑定状态/RSSI/蓝牙模式等。

3.9 非法数据包通知

  • 命令:`0x11`(WiFi→MCU)/ `0x12`(MCU→WiFi);
  • 错误码:1=校验和错误;2=命令不可识别;3=其他错误;4=文件类型不匹配。

3.10 MCU 通知 WiFi 模组进入可绑定模式

  • 命令:`0x15`(请求)/ `0x16`(应答);倒计时(可绑定失效秒)见 3.1 字段。

3.11 MCU 重启通讯模组

  • 命令:`0x29`(请求)/ `0x2A`(应答);ACK 成功后模组再重启。

4. 扩展通讯协议(可选)

4.1 重启 MCU

  • WiFi → MCU:`0x0F`(请求);MCU → WiFi:`0x10`(应答)。
  • 注意:MCU **在回复 ACK 后等待 ~600 ms** 再重启,避免 WiFi 端未收到 ACK 而重复请求。

4.2 MCU 请求 WiFi 模组进入产测模式

  • MCU → WiFi:`0x13`;WiFi → MCU:`0x14`。

4.3 MCU 请求获取网络时间

  • MCU → WiFi:`0x17`;WiFi → MCU:`0x18`(返回本地时区时间 + NTP 秒)。
字段 长度(B) 说明
year 2 年(大端),如 2015
month 1
day 1
hour 1
minute 1
second 1
ntp 4 NTP 秒计数

4.4 大数据下发:发起者请求

  • WiFi → MCU:`0x19`;MCU → WiFi:`0x1A`。

负载含:**数据大小**、**文件类型**、**MD5**。

4.5 大数据下发:接收者确认

  • MCU → WiFi:`0x1B`;WiFi → MCU:`0x1C`。

负载含:**分片大小**(建议 128B)。

4.6 大数据下发:分片传输

  • WiFi → MCU:`0x1D`;MCU → WiFi:`0x1E`。
字段 长度(B) 说明
total_packets 2 总分片数
packet_index 2 当前分片号(0 起)
data N 分片数据
  • Flags.bit1 = 1 表示**最后一包**。

4.7 大数据下发:发起者取消

  • WiFi → MCU:`0x1F`;MCU → WiFi:`0x20`。

4.8 大数据下发:接收者取消

  • MCU → WiFi:`0x27`;WiFi → MCU:`0x28`。

4.9 MCU 获取通讯模组信息

  • MCU → WiFi:`0x21`;WiFi → MCU:`0x22`。
# 字段 长度(B) 说明
1 module_type 8 模组类型(字符串)
2 protocol_version 8 协议版本(字符串)
3 hardware_version 8 硬件版本(字符串)
4 software_version 8 软件版本(字符串)
5 mac max 13 以 '\\0' 结尾的字符串,例如 "5CF9388AE8F0\\0"
6 ip max 16 以 '\\0' 结尾的字符串,例如 "192.168.100.254\\0"
7 attributes 8 模组属性(预留)
8 校验和 1 0x##

A. 附录:数据点/字段的缩放与边界

  • `ph_value`、`ph_alarm_*`:**y=0.1*x**;
  • `temp_current_1/2`:**y=1*x-200**(原始 0..1200);
  • `humidity`、`Temperature/Humidity_alarm_*`:**y=1*x+0**;
  • `Total_dissolved_solids`、`tds_alarm_*`:uint16(0..5000);
  • `current_voltage`:uint16(0..5000);`Current_power`:uint16(0..10000);
  • `urt_value`:uint32(0..600000);`Current_current`:uint32(0..100000);
  • `cur_timestamp`:uint32(Unix 秒)。

B. 附录:布尔组合位(byte0)编码

  • bit0…bit5 = `switch_1…switch_6`;bit6=`power`;bit7..bit14=各报警位(高温/低温/高湿/低湿/高 TDS/低 TDS/高 pH/低 pH)。