蓝牙Sig Mesh 概念入门⑤——Mesh通信消息格式详解


在这里插入图片描述

一、Access Layer

op code 有三种类型,1byte,2byte 和 3byte。1byte,2byte 是 SIG 定义的命令。3byte
是 vendor 自定义的命令,其中 2 个 byte 是 vendor ID(CID),整个 mesh 网络中,一个 vendor
id 最多支持 64 个 vendor opcode。

Access layer 包含 op code 和 parameter,最大支持 380 byte。

二、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

在这里插入图片描述

  • IVI: iv index(即 SDK 的 iv_idx_st.tx[3]这个 byte 的最低 bit, 目前 SDK 的 iv index 按 big endian 存储)。
  • NID:和 network key 相关
  • CTL:标记是否是 control message

3.3 Network transmit count/ / interval ( ( 重传 次数 和 重传间隔的定义) )

network transmit count 是指发送一个命令,需要重传的次数,这些重传的 rf packet 是一模一样的,包括 sno 等。重传的目的是为了提升接收成功率。假如当网络中只有两个 mesh 节点,只发送一次的成功率是 80%,即丢包率是 20%,那么,理论上,发送 6 次的丢包率是 20%的 6 次方,即 0.0064%,即收包成功率是 99.993%,当然这个是理论分析。和 RF 环境等还有一定的关系。
我们的 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 来配置。

综上所述,我们 SDK 默认发送一个 network packet,比如 generic ONOFF no ack 命令(该命令不需要分包),需要的时间大概是 40 * 6 = 240ms。

3.4 Reliable retry( 发包 重试次数) )

Reliable retry 是指应用层的重试,用于有 status 回复的命令,比如 generic ONOFF。当发送一个 network packet 后(包含 network transmit),会判断是否收到 status,如果没有收到,我们会进行 retry,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-ADV
provision 模式。

Oob info 及 URI Hash 请参考 spec 《3.9.2 Unprovisioned Device beacon》在未组网时,会发送 unprovision beacon,通过 unprov_beacon_send()来发送。发送周期由”beacon_send.inter = MAX_BEACON_SEND_INTERVAL”来定义,默认是 2 秒。在组网后,会发送 security beacon,通过 mesh_tx_sec_nw_beacon()来发送。另外还可以通过 CFG_BEACON_SET 命令打开或者关闭这个发送使能开关。请参考本文章节《4.4 控制对应的节点》““SecNwBc”按钮”的操作。发送周期由 SEC_NW_BC_INV_DEF_100MS 来定义,默认是 10 秒。

五、IV Update procedure

即iv index的update flow。network layer和access layer的加解密过程都需要用到iv index。

前面提到,mesh网络要求network PDU的sequence number要一直累加,而sequence number
是 3byte 表示。当使用很长一段时间后,sequence number 接近最大值的时候,就需要考虑更
新 iv index,否则 sequence number 就会归 0,导致接收端认为是一个无效的 message。从某
种程度上,可以理解 iv index 为 sequence number 的扩展位。

iv index update flow 是节点自行发起,自行 update 的过程。目前 SDK,当节点检测自己
的sequence number超过了IV_UPDATE_START_SNO (0xC00000) 后,会主动发起 iv update
folw。每次 Iv update 后,iv index 会加 1.
详细的 iv update flow 请查阅 spe 相关章节: SPEC V1.0 《3.10.5 IV Update procedure》。

六、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,具体配置方式,详见“5.6 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

觉得好,就一键三连呗(点赞+收藏+关注)

猜你喜欢

转载自blog.csdn.net/kangweijian/article/details/115278864