Ble Mesh技术(十)之Heartbeat

本文深入解析心跳消息在节点监控及网络通信中的作用,探讨其在维护节点间链路质量和距离评估上的具体实现,包括心跳消息的结构、周期发送机制、TTL值计算,以及心跳消息的发布与订阅状态配置。

心跳消息也是上层传输层定义的控制消息之一。用于监控节点是否处于网络中,节点之间的距离。

1. Heartbeat PDU

heartbeatpdu

FieldSize(bits)Notes
RFU1Reserved for Future Use
InitTTL7该消息的初始TTL值
取值范围:0x00-0x7F
Features16该节点正在使用的feature

Features参数域bit位如下:
feature

FieldNotes
Relay0:未使用中继特性
1:使用中继特性
Proxy0:未使用代理特性
1:使用代理特性
Friend0:未使用Friend特性
1:使用Friend特性
Low Power0:未使用低功耗特性
1:使用低功耗特性

2. 心跳消息交互

周期向四周发送心跳消息,每个节点发送的次数由配置客户端配置,可以是固定次数,也可以是无限次。
节点接收到同一地址的心跳消息的次数和收到消息的最大最小跳数(hops)来决定两个节点之间的链路质量。
跳数计算如下:
hops=InitTTL−RxTTL+1hops = InitTTL-RxTTL+1hops=InitTTLRxTTL+1
其中InitTTLInitTTLInitTTL为发送心跳端的初始TTL值,在心跳数据包里面的InitTTL字段,RxTTLRxTTLRxTTL为接收到的消息的当前TTL值。
通过hops可以得到两点之间的最优TTL值。
心跳消息的配置通过配置客户端配置,通过Configuration Model中的Heartbeat Publication state来配置心跳消息的发布周期和次数。通过Heartbeat Subscription state来配置心跳消息接收的时长和次数。

2.1. Heartbeat Publication state

配置客户端发送Config Heartbeat Publication Get/Set消息来获取/设置节点的心跳发布状态,节点收到后响应Config Heartbeat Publication Status。不同的消息类型通过Opcode进行区分。
配置客户端发送的Get消息的Opcode为0x8038,参数域为空。
配置客户端发送的Set消息的Opcode为0x8039,参数域如下:
hbset

ParametersSize(octets)Notes
Destination2心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。
CountLog1心跳消息的数量,每发送一次心跳,Count值减1,为0时则停止发送。
CountLog和Count的对应值如下:
0x00:不会周期发送心跳消息
0x01-0x11:Count=2(CountLog−1)Count=2^{(CountLog-1)}Count=2(CountLog1)
0x12-0xFE:无效值
0xFF:无限制发送
PeriodLog1两次连续心跳消息的间隔时间。
PeriodLog和Period的对应值如下:
0x00:不会周期发送心跳消息
0x01-0x11:Period=2(PeriodLog−1)Period=2^{(PeriodLog-1)}Period=2(PeriodLog1)
0x12-0xFF:无效值
TTL1发送心跳使用的TTL值,即心跳消息的InitTTL段
Features2哪些特性被被改变时需要触发心跳信息程序
tu
bit位设置为1:表示该特性被改表需要触发心跳程序
NetKeyIndex2NetKeyIndex,由NetKey生成,由配置客户端统一管理

被配置端响应的Status消息的Opcode为0x06,参数域如下:
hbstatus

ParametersSize(octets)Notes
Status1请求消息的状态码,表示操作成功与否。
Destination2心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。
CountLog1心跳消息的数量,每发送一次心跳,Count值减1,为0时则停止发送。
PeriodLog1两次连续心跳消息的间隔时间。
TTL1发送心跳使用的TTL值,即心跳消息的InitTTL段
Features2哪些特性被被改变时需要触发心跳信息程序
NetKeyIndex2NetKeyIndex,由NetKey生成,由配置客户端统一管理

可以知道响应的状态只比设置消息多了一个字节表示状态,但是多这一个字节,导致参数域为10字节,而access消息包含Opcode若超过11字节就要分段,所以为了避免分段,Status响应消息的Opcode为1字节,这就是为什么心跳发布的Get/Set消息的Opcode是2个字节,而响应的Status消息是1个字节的原因。
Set设置的参数域中的Features,表示如果那个feature被改变了,我要开始向四周广播心跳。这里为心跳程序开始的起点。若Features域的Relay bit域从0设置为1,此时心跳会被触发,向四周广播当前节点的心跳。心跳消息中的Features域表示当前节点的feature,设置中的Features域表示节点心跳的触发点

2.2. Heartbeat Subscription state

配置客户端发送Config Heartbeat Subscription Get/Set消息来获取/设置节点的心跳订阅状态,节点收到后响应Config Heartbeat Subscription Status。不同的消息类型通过Opcode进行区分。
配置客户端发送的Get消息的Opcode为0x803A,参数域为空。
配置客户端发送的Set消息的Opcode为0x803B,参数域如下:
hbsubset

ParametersSize(octets)Notes
Source2设置当前要监听的心跳消息的源地址,只能为unsigned address或者单播地址
Destination2设置监听源心跳消息的目的地址,只有源地址和目的地址都匹配的心跳消息才能被接收,只能为unsigned address或者节点的首元素地址或者group address
PeriodLog1Period=2(PeriodLog−1)Period=2^{(PeriodLog-1)}Period=2(PeriodLog1)。设置当前的心跳接收的窗口,Period随时间减少,当为0时,停止心跳接收。

心跳的发布订阅地址和正常消息的发布订阅不是同一套系统,心跳消息都靠配置客户端设置的心跳Pub/Sub来进行收发和过滤。这样就能使设置了黑白名单的被代理节点也能收到心跳消息??P149
被配置端响应的Status消息的Opcode为0x803C,参数域如下:
hbsubstatus

ParametersSize(octets)Notes
Status1请求消息的状态码,表示操作成功与否。
Source2设置当前要监听的心跳消息的源地址。
Destination2设置监听源心跳消息的目的地址。
PeriodLog1监听心跳消息的窗口剩余时间。
CountLog1接收心跳消息的次数区间。count=[2(CountLog−1),2CountLog)count=[2^{(CountLog-1)},2^{CountLog})count=[2(CountLog1),2CountLog)
MinHops1接收心跳消息的最小跳数。取值范围为:0x01-0x7F
MaxHops1接收心跳消息的最大跳数。取值范围为:0x01-0x7F
<think>嗯,用户问的是蓝牙Mesh组网的使用方法。首先,我需要确认自己对蓝牙Mesh的了解是否正确。蓝牙Mesh是基于低功耗蓝牙(BLE技术的网络协议,主要用于构建大规模设备网络,适用于智能家居、工业自动化等场景。 接下来,用户可能想知道具体的使用步骤。我应该分步骤说明,从前期准备到具体配置,再到应用开发。需要确保每个步骤清晰,并且涵盖关键点,比如网络参数配置、节点角色、配网流程等。 用户可能是开发者或者物联网爱好者,他们可能需要实际操作的指导,所以需要详细说明工具和软件,比如硬件选择、SDK、调试工具。同时,要提醒注意事项,比如网络容量限制、安全性问题,以及功耗管理。 需要检查是否有遗漏的重要概念,比如发布/订阅模型、中继功能、心跳机制等。还要注意使用中文,避免专业术语过于晦涩,必要时进行解释。例如,解释什么是Provisioning,或者什么是GATT Proxy。 可能还需要比较蓝牙Mesh与其他无线技术的区别,但用户直接问的是使用方法,所以应该集中在步骤上,而不是扩展其他内容。最后,确保回答结构清晰,步骤有序,帮助用户逐步理解和实施蓝牙Mesh组网。</think>以下是蓝牙Mesh组网的核心使用步骤及关键概念解析,采用结构化说明: --- ### 一、前期准备 1. **硬件选择** - 需使用支持BLE 4.0及以上版本的芯片(如Nordic nRF52系列、TI CC2640等) - 设备需实现**中继(Relay)、代理(Proxy)、好友(Friend)、低功耗节点(LPN)**等角色中的至少一种 2. **软件工具** - 协议栈:集成蓝牙SIG官方Mesh协议栈(如Zephyr OS内置方案) - 调试工具:nRF Connect、Telink Mesh APP等 --- ### 二、网络配置流程 #### 步骤1:初始化网络 ```c // 示例代码片段(基于Zephyr OS) static struct bt_mesh_cfg_srv cfg_srv = { /* 配置服务器参数 */ }; BT_MESH_MODEL_CFG_SRV_DEFINE(cfg_srv); // 声明配置服务器模型 ``` #### 步骤2:设备配网(Provisioning) 1. 未配网设备进入**广播状态**(发送Unprovisioned Device Beacon) 2. 使用配网器(Provisioner)扫描设备并建立安全连接 3. 分配**16位短地址**(范围0x0001-0x7FFF) 4. 传输网络密钥(NetKey)及应用密钥(AppKey) #### 步骤3:节点角色配置 | 角色类型 | 功能说明 | 典型功耗 | |---------|---------|---------| | Relay节点 | 转发消息扩展网络覆盖 | 较高 | | Low Power节点 | 依赖Friend节点存储消息 | 极低 | | Friend节点 | 为LPN缓存消息 | 中等 | --- ### 三、消息通信机制 1. **发布/订阅模型** - 设备向特定地址(单播/组播/广播)发布消息 - 订阅者通过预先绑定的地址接收数据 2. **心跳机制** - 定期发送Heartbeat消息(TTL设置决定跳数) - 用于网络拓扑监测:`hb_send(src, dst, init_ttl)` --- ### 四、典型应用开发 1. **场景实现** ```c // 创建开关控制场景 BT_MESH_MODEL_PUB_DEFINE(onoff_pub, 2, 5); // 发布参数:消息长度2字节,重传5次 struct bt_mesh_model onoff_model = { .pub = &onoff_pub, .op = { BT_MESH_MODEL_OP_2(0x82, 0x04) }, // 定义操作码 .cb = onoff_set_callback // 状态改变回调 }; ``` 2. **OTA升级** - 采用**分段传输对象模型**(Firmware Update Model) - 校验机制:CRC32 + 数字签名 --- ### 五、注意事项 1. **网络容量限制** - 单网络最大节点数:**32,767个** - 同一子网最多支持**4096个组地址** 2. **安全建议** - 启用OBR/OOB认证 - 定期更换NetKey(建议周期≤6个月) - 禁用默认IV Index(0x00000000) 3. **功耗优化** - LPN设备设置PollTimeout(建议5-30秒) - 调整广播间隔:`CONFIG_BT_MESH_ADV_INT=100`(单位ms) --- ### 六、调试技巧 1. 使用**Meshctl工具**查看网络拓扑 ```shell $ meshctl > menu config > target 0x0A01 # 选择目标节点 > netkeys # 查看网络密钥 ``` 2. **报文分析** - 抓取空中接口数据(需支持BLE Sniffer) - 解析Mesh层字段: - Network ID(6字节) - IV Index & TTL(1字节) - SEQ(3字节防重放攻击) --- 通过以上步骤可实现从基础组网到高级应用的完整开发流程,实际部署时需根据具体场景优化中继策略和功耗参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值