心跳消息也是上层传输层定义的控制消息之一。用于监控节点是否处于网络中,节点之间的距离。
1. Heartbeat PDU
Field | Size(bits) | Notes |
---|---|---|
RFU | 1 | Reserved for Future Use |
InitTTL | 7 | 该消息的初始TTL值 取值范围:0x00-0x7F |
Features | 16 | 该节点正在使用的feature |
Features参数域bit位如下:
Field | Notes |
---|---|
Relay | 0:未使用中继特性 1:使用中继特性 |
Proxy | 0:未使用代理特性 1:使用代理特性 |
Friend | 0:未使用Friend特性 1:使用Friend特性 |
Low Power | 0:未使用低功耗特性 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=InitTTL−RxTTL+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,参数域如下:
Parameters | Size(octets) | Notes |
---|---|---|
Destination | 2 | 心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。 |
CountLog | 1 | 心跳消息的数量,每发送一次心跳,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(CountLog−1) 0x12-0xFE:无效值 0xFF:无限制发送 |
PeriodLog | 1 | 两次连续心跳消息的间隔时间。 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(PeriodLog−1) 0x12-0xFF:无效值 |
TTL | 1 | 发送心跳使用的TTL值,即心跳消息的InitTTL段 |
Features | 2 | 哪些特性被被改变时需要触发心跳信息程序 tu bit位设置为1:表示该特性被改表需要触发心跳程序 |
NetKeyIndex | 2 | NetKeyIndex,由NetKey生成,由配置客户端统一管理 |
被配置端响应的Status消息的Opcode为0x06,参数域如下:
Parameters | Size(octets) | Notes |
---|---|---|
Status | 1 | 请求消息的状态码,表示操作成功与否。 |
Destination | 2 | 心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。 |
CountLog | 1 | 心跳消息的数量,每发送一次心跳,Count值减1,为0时则停止发送。 |
PeriodLog | 1 | 两次连续心跳消息的间隔时间。 |
TTL | 1 | 发送心跳使用的TTL值,即心跳消息的InitTTL段 |
Features | 2 | 哪些特性被被改变时需要触发心跳信息程序 |
NetKeyIndex | 2 | NetKeyIndex,由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,参数域如下:
Parameters | Size(octets) | Notes |
---|---|---|
Source | 2 | 设置当前要监听的心跳消息的源地址,只能为unsigned address或者单播地址 |
Destination | 2 | 设置监听源心跳消息的目的地址,只有源地址和目的地址都匹配的心跳消息才能被接收,只能为unsigned address或者节点的首元素地址或者group address。 |
PeriodLog | 1 | P e r i o d = 2 ( P e r i o d L o g − 1 ) Period=2^{(PeriodLog-1)} Period=2(PeriodLog−1)。设置当前的心跳接收的窗口,Period随时间减少,当为0时,停止心跳接收。 |
心跳的发布订阅地址和正常消息的发布订阅不是同一套系统,心跳消息都靠配置客户端设置的心跳Pub/Sub来进行收发和过滤。这样就能使设置了黑白名单的被代理节点也能收到心跳消息??P149
被配置端响应的Status消息的Opcode为0x803C,参数域如下:
Parameters | Size(octets) | Notes |
---|---|---|
Status | 1 | 请求消息的状态码,表示操作成功与否。 |
Source | 2 | 设置当前要监听的心跳消息的源地址。 |
Destination | 2 | 设置监听源心跳消息的目的地址。 |
PeriodLog | 1 | 监听心跳消息的窗口剩余时间。 |
CountLog | 1 | 接收心跳消息的次数区间。 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(CountLog−1),2CountLog) |
MinHops | 1 | 接收心跳消息的最小跳数。取值范围为:0x01-0x7F |
MaxHops | 1 | 接收心跳消息的最大跳数。取值范围为:0x01-0x7F |