BLE Mesh 控制指令格式 (ble_in)
hapi 下发的控制指令为十六进制字符串,整体结构:
53 {msgType} {cmdLen} {naddr_le} {opcode} {data} {xor}| 字段 | 长度 | 说明 |
|---|---|---|
53 | 1 字节 | 固定帧头 |
| msgType | 1 字节 | 消息类型(30=控制, 32=查询, 0c=登录, 04=Mesh配置) |
| cmdLen | 1 字节 | 负载长度 |
| naddr_le | 2 字节 | 网络地址(小端序),广播地址=bcc0 |
| opcode | 1 字节 | 操作码 |
| data | 可变 | 指令参数 |
| xor | 1 字节 | 全帧异或校验和 |
详细的 genCommand 指令对照表(含 cmdLen、参数格式、hex 示例)见附录 BLE Mesh 指令帧。
开关控制
| 操作 | opcode | hex 示例 | 说明 |
|---|---|---|---|
| 开 | 02 | 533004{naddr}02{status_byte}{xor} | status_byte 见下方编码 |
| 关 | 02 | 533004{naddr}02{status_byte}{xor} | |
| 插卡取电开关 | 02 | 533004{naddr}02{status_byte}{xor} | cmdLen=04,同开关格式 |
status_byte 编码(4 路,msgType=02):
bit 7 6 5 4 3 2 1 0
[4][3][2][1] 每路 2 bit: 10=开, 01=关, 00=不变8 路开关(oe=true)使用 cmdLen=05、msgType=45,额外一个字节编码 5-8 路。
亮度控制
| 操作 | opcode | cmdLen | 参数 | 说明 |
|---|---|---|---|---|
| 设置亮度 | 03 | 04 | <val> | val: 00-64 (0-100%) |
| 增加亮度 | 2f | 04 | <val> | 增量 |
| 降低亮度 | 30 | 04 | <val> | 减量 |
| 设置子灯亮度 | 9c | 05 | <index><val> | 按子灯索引设置 |
| 增加子灯亮度 | a1 | 05 | <index><val> | |
| 降低子灯亮度 | a2 | 05 | <index><val> |
色温控制
| 操作 | opcode | cmdLen | 参数 | 说明 |
|---|---|---|---|---|
| 设置色温 | 04 | 04 | <val> | val: 00-64 |
| 增加色温 | 31 | 04 | <val> | |
| 降低色温 | 32 | 04 | <val> | |
| 设置子灯色温 | 9d | 05 | <index><val> | |
| 增加子灯色温 | a5 | 05 | <index><val> | |
| 降低子灯色温 | a6 | 05 | <index><val> |
窗帘控制
| 操作 | opcode | cmdLen | 参数 | hex 示例 |
|---|---|---|---|---|
| 开窗帘 | 05 | 04 | 01 | 533004{naddr}0501{xor} |
| 关窗帘 | 05 | 04 | 02 | 533004{naddr}0502{xor} |
| 停窗帘 | 05 | 04 | 03 | 533004{naddr}0503{xor} |
| 开窗帘到位置 | 06 | 04 | <pos> | 533004{naddr}0632{xor} (pos=50) |
| 关窗帘到位置 | 06 | 04 | <pos> | 同开窗帘到位置 |
空调控制
| 操作 | opcode | cmdLen | 参数 | 说明 |
|---|---|---|---|---|
| 开空调 | 02 | 04 | 02 | status=02 |
| 关空调 | 02 | 04 | 01 | status=01 |
| 设置模式 | 1d | 04 | <mode> | 1=cold, 2=warm, 3=fan, 4=auto |
| 设置温度 | 1b | 04 | <val> | 温度值(16-30) |
| 增加温度 | 33 | 04 | <val> | |
| 降低温度 | 34 | 04 | <val> | |
| 设置风速 | 1c | 04 | <speed> | 1=high, 2=middle, 3=low, 4=auto |
| 增加风速 | 35 | 04 | 01 | |
| 降低风速 | 36 | 04 | 01 |
空调组合指令 (setACAdv)
一次性设置模式+温度+风速,cmdLen 根据参数动态计算:
53 30 {cmdLen} {naddr} 02 02 [1d {mode}] [1b {temp}] [1c {speed}] {xor}红外控制
| 操作 | opcode | cmdLen | 参数 | 说明 |
|---|---|---|---|---|
| 红外发射 | 8f | 07 | <ir_data> | ir_data 见下方格式 |
ir_data 格式:
<study><cmd_id><delay><reserved>| 字段 | 长度 | 说明 |
|---|---|---|
| study | 1 字节 | 00=发送,01=学习 |
| cmd_id | 1 字节 | 红外指令码(见下表) |
| delay | 1 字节 | 延时(单位 100ms) |
| reserved | 1 字节 | 保留 |
红外指令码对照:
| 动作 | TV | 机顶盒 |
|---|---|---|
| turn_on | 0d | 2f |
| turn_off | 0d | 2f |
| increase_volume | 04 | 26 |
| decrease_volume | 0e | 30 |
| set_volume_mute | 00 | 22 |
| increase_channel | 05 | 27 |
| decrease_channel | 0f | 31 |
切换频道(特殊格式):
<type><channel_le><reserved>| 字段 | 说明 |
|---|---|
| type | 02=TV, 03=机顶盒 |
| channel_le | 频道号(2 字节小端序) |
| reserved | 00 |
其他指令
| 操作 | opcode | cmdLen | 参数 | 说明 |
|---|---|---|---|---|
| 设置 RGB | 4c | 06 | <rgb_hex> | 6 字节 RGB 颜色 |
| 禁用设备 | bcc0 | 04 | 26<01|00> | 01=禁用, 00=启用(广播地址) |
| 透传 | 15 | 动态 | <raw_hex> | 原始 hex 数据透传 |
场景执行
genExecuteScene(id) → 53 30 04 bc c0 01 <id> <sign>| 字段 | 说明 |
|---|---|
53 | 帧头 |
30 | 控制指令 |
04 | 数据长度 |
bc c0 | 场景指令标识(广播地址) |
01 | 固定 |
<id> | 场景 ID(1 字节 hex) |
<sign> | 签名 |
naddr 编码
encodeNaddr(naddr) 将设备的网络地址编码为 2 字节小端序 hex:
javascript
const str = naddr.toString(16).padStart(4, '0');
return str.substring(2, 4) + str.substring(0, 2);naddr 是 BLE Mesh 中的单播地址,范围 0x0001-0x7FFF。广播地址为 bcc0。
签名
signCommand(cmd) 对整个命令体(含帧头)计算异或校验和,附加在末尾:
javascript
let xor = 0;
for (let i = 0; i < cmd.length; i += 2) {
xor ^= parseInt(cmd.substring(i, i + 2), 16);
}
return xor.toString(16).padStart(2, '0');网关收到指令后会验证签名,签名不匹配的指令将被丢弃。
