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

273 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情@[TOC] 在这里插入图片描述

一、Access Layer

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

Filed NameSizeNotes
op code1,2 or 3operation code
Parameters0 to 379Application Parameters

op code 有三种类型,1byte,2byte 和 3byte。

  • 1byte,2byte 是 SIG 定义的命令。
  • 3byte是 vendor 自定义的命令
    • 其中 2 个 byte 是 vendor ID(CID)
    • 整个 mesh 网络中,一个 vendor id 最多支持 64 个 vendor opcode
Opcode FormatNotes
0xxx xxxx(排除0111 1111)1-octet Opcode,SIG定义
10xx xxxx xxxx xxxx2-octet Opcode,SIG定义
10xx xxxx zzzz zzzz zzzz zzzz3-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

ValuesAddress TypeDescription
0b0000 0000 0000 0000Unassigned Address0,未分配地址
0b0xxx xxxx xxxx xxxxUnicast Addresselement address
0b11xx xxxx xxxx xxxxGroup Address分组地址,用于组控,以及publish/subcribe
0b10xx xxxx xxxx xxxxVirtual Address暂时用不到

3.2 Network PDU

在这里插入图片描述

Field NameLengthNotes
IVI1IV Index最低有效位
NID7netkey 相关
CTL1标记是否是control message
TTL7Time to Live
SEQ24Sequence Number
SRC16Source Address
DST16Destination Address
TransportPDU8 to 128Transport Protocol Data Unit
NetMIC32 or 64Message 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 layeraccess 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 状态。

ValueDescription
0x00No Fault
0x01Battery Low Warning
0x02Bettery Low Error
0x03Supply Voltage Too Low Warning
0x04Supply Voltage Too Low Error
0x05Supply Voltage Too High Warning
0x06Supply Voltage Too High Error
0x07Power Supply Interrupted Warning
0x08Power Supply Interrupted Error
0x09No Load Warning
0x0ANo Load Error
0x0BOverload Warning
0x0COverload Error
0x0DOverheat Warning
0x0EOverheat Error
0x0FCondensation Warning
0x10Condensation Error
0x11Vibration Warning
0x12Vibration Error
0x13Configuration Warning
0x14Configuration Error
0x15Element Not Calibrated Warning
0x16Element Not Calibrated Error
0x17Memory Warning
0x18Memory Error
0x19Self-Test Warning
0x1ASelf-Test Error
0x1BInput Too Low Warning
0x1CInput Too Low Error
0x1DInput Too High Warning
0x1EInput Too High Error
0x1FInput No Change Warning
0x20Input No Change Error
0x21Actuator Blocked Warning
0x22Actuator Blocked Error
0x23Housing Opened Warning
0x24Housing Opened Error
0x25Tamper Warning
0x26Tamper Error
0x27Device Moved Warning
0x28Device Moved Error
0x29Device Dropped Warning
0x2ADevice Dropped Error
0x2BOverflow Warning
0x2COverflow Error
0x2DEmpty Warning
0x2EEmpty Error
0x2FInternal Bus Warning
0x30Internal Bus Error
0x31Mechanism Jammed Warning
0x32Mechanism Jammed Error
0x33-0X7FReserved for Future Use
0x80-0XFFVendor Specific Warning / Error

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