蓝牙Sig Mesh 概念入门⑤——Mesh通信消息格式详解
标签: 蓝牙Sig Mesh 概念入门⑤——Mesh通信消息格式详解 Python博客 51CTO博客
2023-04-21 18:24:18 249浏览
文章目录
- 一、Access Layer
- 二、Transport layer
- 三、Network layer
- 3.1 Address
- 3.2 Network PDU
- 3.3 Network transmit count / interval ( 重传次数和重传间隔的定义)
- 3.4 Reliable retry( 发包重试次数)
- 四、mesh beacon
- 五、IV Update procedure
- 六、heartbeat
- 七、Health

一、Access Layer
Access layer 包含 op code 和 parameter,最大支持 380 byte。
Filed Name |
Size |
Notes |
op code |
1,2 or 3 |
operation code |
Parameters |
0 to 379 |
Application Parameters |
op code 有三种类型,1byte,2byte 和 3byte。
- 1byte,2byte 是 SIG 定义的命令。
- 3byte是 vendor 自定义的命令
- 其中 2 个 byte 是 vendor ID(CID)
- 整个 mesh 网络中,一个 vendor id 最多支持 64 个 vendor opcode
Opcode Format |
Notes |
0xxx xxxx(排除0111 1111) |
1-octet Opcode,SIG定义 |
10xx xxxx xxxx xxxx |
2-octet Opcode,SIG定义 |
10xx xxxx zzzz zzzz zzzz zzzz |
3-octet Opcode,vendor定义,z代表vendor id |
二、Transport layer
- 目前为了兼容 BLE4.2 等不支持长广播包的设备,所以都统一设定 adv 的最大 payload 为31byte
- 去掉一些数据包的通讯协议需要占用的部分,单包的有效 payload 是 11byte
- 当Access layer 超过 11byte 后,就需要分包
- 对于 vendor op code 来说,当 parameters 大于 8 个 byte(8=11-3)
- 分包的时候,mesh 协议栈就会自动执行分包发送,用户不需要介入
三、Network layer
3.1 Address
Values |
Address Type |
Description |
0b0000 0000 0000 0000 |
Unassigned Address |
0,未分配地址 |
0b0xxx xxxx xxxx xxxx |
Unicast Address |
element address |
0b11xx xxxx xxxx xxxx |
Group Address |
分组地址,用于组控,以及publish/subcribe |
0b10xx xxxx xxxx xxxx |
Virtual Address |
暂时用不到 |
3.2 Network PDU

Field Name |
Length |
Notes |
IVI |
1 |
IV Index最低有效位 |
NID |
7 |
netkey 相关 |
CTL |
1 |
标记是否是control message |
TTL |
7 |
Time to Live |
SEQ |
24 |
Sequence Number |
SRC |
16 |
Source Address |
DST |
16 |
Destination Address |
TransportPDU |
8 to 128 |
Transport Protocol Data Unit |
NetMIC |
32 or 64 |
Message Integrity Check for Network,完整性校验 |
3.3 Network transmit count / interval ( 重传次数和重传间隔的定义)
network transmit count是指发送一个命令,需要重传的次数
- 这些重传的 rf packet 是一模一样的,包括 sno 等。
- 我们的 SDK 协议栈默认重发 5 次,即 TRANSMIT_CNT_DEF(5),总共发发送次数是 n+1 =6 个。
network transmit interval是指重传的两个包之间的发送间隔
- 我们 SDK 默认在 30-40ms之间,由 TRANSMIT_INVL_STEPS_DEF(2) 决定,计算方式是 ((TRANSMIT_INVL_STEPS_DEF +1)*10 + (0–10))ms。”
network transmit count、transmit interval 还可以通过 SIG 定义的标准 config 命令CFG_NW_TRANSMIT_SET 来配置。
3.4 Reliable retry( 发包重试次数)
Reliable retry 是指应用层的重试,用于有 status 回复的命令,比如 generic ONOFF。
- 当发送一个 network packet 后(包含 network transmit),会判断是否收到 status
- 如果没有收到,我们会进行 retry,network packet 里面的 sequence number 会变化
- 我们默认最多重试两次。
四、mesh beacon
下图是 unprovisioned device beacon 的 PDU。

Device UUID 可以唯一识别 node。因为有些手机,比如 IOS 不能获取 mac,以及在未来的remote provision 中无法获得 mac,所以在 SIG mesh 中是通过 Device UUID 来唯一识别 node,而不是通过 mac。unprovisioned beacon 通过 non-connectable ADV 的 packet 来发送,用于 PB-ADVprovision 模式。
- 在未组网时,会发送 unprovision beacon,通过
unprov_beacon_send()来发送。发送周期由beacon_send.inter = MAX_BEACON_SEND_INTERVAL来定义,默认是 2 秒。 - 在组网后,会发送 security beacon,通过
mesh_tx_sec_nw_beacon()来发送。 -
CFG_BEACON_SET定义发送使能。 -
SEC_NW_BC_INV_DEF_100MS定义发送周期 ,默认是 10 秒。
五、IV Update procedure
network layer和access layer的加解密过程都需要用到iv index。
- mesh网络要求network PDU的sequence number要一直累加
- sequence number 才 3 byte,当使用很长一段时间后,sequence number 接近最大值的时候
- 就需要考虑更新 iv index,否则 sequence number 就会归 0,导致接收端认为是一个无效的message
- 从某种程度上,可以理解 iv index 为 sequence number 的扩展位。
iv index update flow 是节点自行发起,自行 update 的过程。
目前 SDK,当节点检测自己的mermaid sequenceDiagram number超过了IV_UPDATE_START_SNO(0xC00000) 后,会主动发起 iv updatefolw。每次 Iv update 后,iv index 会加 1。
六、heartbeat
mesh的心跳包,可以配置周期发送。
- 可以用于做在线离线检测(周期 publish 机制也可以做在线离线检测)
- 可以用于hops 的计算,即计算 heartbeat message 经过多少跳之后,才被接收到
经过统计一定时间内收到的 heartbeat 的个数(count),并计算得到每个 heartbeat 的 hops
的值,得到 min hops 和 max hops,进而了解整个网络的布局,以及每一个节点的 message
传输的可靠程度。不过每次配置 heartbeat subscription 只能监听和统计一个节点的状态。
hops 计算方式是:hops = InitTTL - RxTTL +1。
- InitTTL:是 heartbeat publish set 里面的 TTL 参数。
- RxTTL:是收到的 message 的 network PDU 里面的 TTL。
节点默认不发送 heartbeat,具体配置方式。
七、Health
Health model 相关的 message 是用来反映节点的 warning 或者 error 状态。
Value |
Description |
0x00 |
No Fault |
0x01 |
Battery Low Warning |
0x02 |
Bettery Low Error |
0x03 |
Supply Voltage Too Low Warning |
0x04 |
Supply Voltage Too Low Error |
0x05 |
Supply Voltage Too High Warning |
0x06 |
Supply Voltage Too High Error |
0x07 |
Power Supply Interrupted Warning |
0x08 |
Power Supply Interrupted Error |
0x09 |
No Load Warning |
0x0A |
No Load Error |
0x0B |
Overload Warning |
0x0C |
Overload Error |
0x0D |
Overheat Warning |
0x0E |
Overheat Error |
0x0F |
Condensation Warning |
0x10 |
Condensation Error |
0x11 |
Vibration Warning |
0x12 |
Vibration Error |
0x13 |
Configuration Warning |
0x14 |
Configuration Error |
0x15 |
Element Not Calibrated Warning |
0x16 |
Element Not Calibrated Error |
0x17 |
Memory Warning |
0x18 |
Memory Error |
0x19 |
Self-Test Warning |
0x1A |
Self-Test Error |
0x1B |
Input Too Low Warning |
0x1C |
Input Too Low Error |
0x1D |
Input Too High Warning |
0x1E |
Input Too High Error |
0x1F |
Input No Change Warning |
0x20 |
Input No Change Error |
0x21 |
Actuator Blocked Warning |
0x22 |
Actuator Blocked Error |
0x23 |
Housing Opened Warning |
0x24 |
Housing Opened Error |
0x25 |
Tamper Warning |
0x26 |
Tamper Error |
0x27 |
Device Moved Warning |
0x28 |
Device Moved Error |
0x29 |
Device Dropped Warning |
0x2A |
Device Dropped Error |
0x2B |
Overflow Warning |
0x2C |
Overflow Error |
0x2D |
Empty Warning |
0x2E |
Empty Error |
0x2F |
Internal Bus Warning |
0x30 |
Internal Bus Error |
0x31 |
Mechanism Jammed Warning |
0x32 |
Mechanism Jammed Error |
0x33-0X7F |
Reserved for Future Use |
0x80-0XFF |
Vendor Specific Warning / Error |
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论


