蓝牙Sig Mesh 概念入门⑤——Mesh通信消息格式详解
文章目录
- 一、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 |
觉得好,就一键三连呗(点赞+收藏+关注)
蓝牙Sig Mesh 概念入门⑤——Mesh通信消息格式详解相关推荐
- 蓝牙Sig Mesh 概念入门④——Mesh的专业术语及其操作流程
文章目录 一. States 二.Bound states 三.Messages 四.Node & Elements 五.Publish & Subscribe 六.Security ...
- SIP消息格式详解(基于XML消息体)
SIP消息分为请求和响应,格式由一个请求行/状态行.几个标题头.一个空行和一个消息体(可选)组成,之间使用回车换行符表示终结,即使消息中未包含消息体,空行也不能省略: 1.请求行/状态行 <1& ...
- 蓝牙Sig Mesh 概念入门①——简单介绍
文章目录 一.前言 二.Mesh组网怎么选 2.1 WiFi Mesh (插电的用WiFi) 2.2 蓝牙 Sig Mesh (需要与手机互动的) 3.3 ZigBee Mesh (其他) 三.蓝牙模 ...
- LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用
LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...
- python编程入门与案例详解-Pythony运维入门之Socket网络编程详解
Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...
- 小白入门!网络安全基础知识详解(附知识问答)
小白入门!网络安全基础知识详解(附知识问答) 一.引论 提到网络安全,一般人们将它看作是信息安全的一个分支,信息安全是更加广义的一个概念:防止对知识.事实.数据或能力非授权使用.误用.篡改或拒绝使用所 ...
- Elastic search入门到集群实战操作详解(原生API操作、springboot整合操作)-step1
Elastic search入门到集群实战操作详解(原生API操作.springboot整合操作)-step2 https://blog.csdn.net/qq_45441466/article/de ...
- JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- 窗口发送消息参数详解
窗口发送消息参数详解 // 窗口.发送消息 函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg ...
最新文章
- 微软小冰从上海音乐学院音工系毕业,师从于阳、陈世哲
- java 对象转json json转对象
- centos7下nginx配置
- MetaMask以太坊钱包插件
- .NET中的命名规则
- php返回成功信息msg_PHP进化史 — 从v5.6到v8.0(可收藏)
- PHP找出专题下重复的商品数据
- Spark学习笔记(一)
- (转载)RAID技术全解图解-RAID0、RAID1、RAID5、RAID100
- ALTER TABLE 语句
- 大数据分析助迈凯轮车队角逐F1
- 首席新媒体运营黎想教程:活动运营推广入门全攻略及进阶
- 基于Python web信息旅游管理系统
- 机器人操作系统ROS Indigo 入门学习(18)——ROS wiki导航
- 断更1周,因特殊情况,预计断更1周左右
- 算法 树2 List Leaves
- Python 使用7z压缩解压 安装、使用、报错
- VCSA 7.0 重置root密码
- 自己搭建了一个美团饿了么外卖cps红包的小程序裂变分销公众号
- facebook网络环境模拟工具atc