Ble Mesh技术(十)之Heartbeat

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

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)来决定两个节点之间的链路质量。
跳数计算如下:
h o p s = I n i t T T L − R x T T L + 1 hops = InitTTL-RxTTL+1 hops=InitTTLRxTTL+1
其中 I n i t T T L InitTTL InitTTL为发送心跳端的初始TTL值,在心跳数据包里面的InitTTL字段, R x T T L RxTTL RxTTL为接收到的消息的当前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: C o u n t = 2 ( C o u n t L o g − 1 ) Count=2^{(CountLog-1)} Count=2(CountLog1)
0x12-0xFE:无效值
0xFF:无限制发送
PeriodLog1两次连续心跳消息的间隔时间。
PeriodLog和Period的对应值如下:
0x00:不会周期发送心跳消息
0x01-0x11: P e r i o d = 2 ( P e r i o d L o g − 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
PeriodLog1 P e r i o d = 2 ( P e r i o d L o g − 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接收心跳消息的次数区间。 c o u n t = [ 2 ( C o u n t L o g − 1 ) , 2 C o u n t L o g ) count=[2^{(CountLog-1)},2^{CountLog}) count=[2(CountLog1),2CountLog)
MinHops1接收心跳消息的最小跳数。取值范围为:0x01-0x7F
MaxHops1接收心跳消息的最大跳数。取值范围为:0x01-0x7F
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值