指令响应
概述
ESP RainMaker 的指令响应 (Command-Response) 框架是替代参数设置工作流的方案,用于从客户端(如手机应用)向设备发送数据。该功能可供管理员和终端用户使用。
使用场景
在 ESP RainMaker 系统中,指令响应可作为断电恢复的容错机制。例如:一个通过 ESP RainMaker 控制的智能灯泡通常依赖云端实时指令运行。若设备遭遇断电重启,可能会丢失最后状态。通过指令响应框架,设备重启时可主动查询云端最后接收的指令,确保恢复正确的灯光设置(如亮度、色彩),而非默认关闭状态。这能保障运行连续性,避免电力中断后的异常行为。
框架优势:
- 可靠地获取任意请求的状态。
- 可设置请求有效期,即使设备离线仍能触发。
- 提供更完善的权限控制——节点知晓触发命令的用户角色(超级管理员用户、主要用户、次要用户)。
前置说明
下图展示了指令响应的工作流程。
客户端
客户端与云端通过 JSON 格式的 REST API 通信。触发指令需调用 POST API,载荷示例如下:
JSON 载荷(展开/收起)
{
"node_ids": [
"6jyMKuFuAq3xxxxxxxxyBQ"
],
"cmd": 1,
"data": {
"brightness": 10
},
"timeout": 30
}
- node_ids: 目标设备节点 ID 列表。
- cmd: 指令 ID。
- data: 指令数据载荷。
- timeout: 指令有效期(以秒计)。
传输二进制数据,需转换为 base64 字符串。
添加 is_based64
标识。例如:
JSON 载荷(展开/收起)
: {
"node_ids": [
"6jyMKuFuAq3xxxxxxxxyBQ"
],
"cmd": 1,
"data": "YWJjZAo="
"timeout": 30,
"is_base64": true
}
云端后台会分配请求 ID 并返回如下响应:
JSON 载荷(展开/收起)
{
"request_id": "6jyMKuFxxxxxxxxStTKyBQ",
"status": "success"
}
客户端可通过 GET API 查询请求状态,将上述 request_id
作为查询参数。可能的状态包括:
状态 |
---|
requested |
in_progress |
success |
timed_out |
failure |
提示
对于 success
和 failure
状态,将同步返回对应的响应值。
设备端
设备与云端采用 TLV8 编码通信(基于 TLV 的 8 位长度字段变体)。这种通信方式具有较强的灵活性,支持 JSON、XML、二进制等多种应用数据格式。
类型
类型值 | 代码宏定义 | 说明 | 长度 |
---|---|---|---|
1 | ESP_RMAKER_TLV_TYPE_REQ_ID | 请求 ID | 可变长度字符串(最长 32 字符) |
2 | ESP_RMAKER_TLV_TYPE_USER_ROLE | 用户角色 | 1 字节 |
3 | ESP_RMAKER_TLV_TYPE_STATUS | 状态 | 1 字节 |
4 | ESP_RMAKER_TLV_TYPE_TIMESTAMP | 时间戳 | 待定(暂未使用) |
5 | ESP_RMAKER_TLV_TYPE_CMD | 指令 | 2 字节(小端序) |
6 | ESP_RMAKER_TLV_TYPE_DATA | 数据 | 可变长度 |
角色
角色定义采用位映射方式。
值 | 代码宏定义 | 说明 |
---|---|---|
1 | ESP_RMAKER_USER_ROLE_SUPER_ADMIN | 超级管理员用户 |
2 | ESP_RMAKER_USER_ROLE_PRIMARY_USER | 主要用户 |
4 | ESP_RMAKER_USER_ROLE_SECONDARY_USER | 次要用户 |
状态值定义
值 | 代码宏定义 | 说明 |
---|---|---|
0 | ESP_RMAKER_CMD_STATUS_SUCCESS | 成功 |
1 | ESP_RMAKER_CMD_STATUS_FAILED | 通用失败 |
2 | ESP_RMAKER_CMD_STATUS_CMD_INVALID | 无效指令 |
3 | ESP_RMAKER_CMD_STATUS_AUTH_FAIL | 鉴权失败 |
4 | ESP_RMAKER_CMD_STATUS_NOT_FOUND | 未找到指令 |