mesh心跳包用來干嘛的?
Heartbeat is used to monitor nodes on a network and discover how far nodes are apart from each other.
The Heartbeat message can be used for two main functions. The first function is the determination that a node is still active within a mesh network . The second function is the determination of how far a node is away.
可以確定節(jié)點(diǎn)是否在網(wǎng),還可以根據(jù)心跳消息的到達(dá)時(shí)間,來判斷網(wǎng)絡(luò)狀況是否良好。
心跳包操作的Model模型
The Heartbeat message is sent periodically, as configured by the Configuration Server model。 每個(gè)節(jié)點(diǎn)必須包含Configuration Server model,模型ID: 0x0000。
六個(gè)指令
操作心跳功能的前提是節(jié)點(diǎn)綁定了AppKey。因?yàn)樾奶δ軐儆诨A(chǔ)模型中配置模型的功能,所以不需要給模型綁定APPKey的步驟。
1.先獲取節(jié)點(diǎn)的初始心跳訂閱和發(fā)布信息,通過ConfigHeartbeatPublicationGet和ConfigHeartbeatSubscriptionGet這兩個(gè)消息獲取。
- 發(fā)送
ConfigHeartbeatPublicationGet(opcode: 0x8038, parameters: 0x),收到ConfigHeartbeatPublicationStatus(opcode: 0x 6, parameters: 0x00000000000000000000) - 發(fā)送
ConfigHeartbeatSubscriptionGet(opcode: 0x803A, parameters: 0x),收到ConfigHeartbeatSubscriptionStatus(opcode: 0x803C, parameters: 0x000000000000000000)
2.配置訂閱ConfigHeartbeatSubscriptionSet(source: 1, destination: 6, periodLog: 4)
返回確認(rèn)消息ConfigHeartbeatSubscriptionStatus(status: Success, source: 1, destination: 6, periodLog: 4, countLog: 0, minHops: 127, maxHops: 0)
- 配置客戶端發(fā)送Config Heartbeat Subscription Get/Set消息來獲取/設(shè)置節(jié)點(diǎn)的心跳訂閱狀態(tài)。
- 節(jié)點(diǎn)收到后響應(yīng)Config Heartbeat Subscription Status。
- 配置客戶端發(fā)送的Get消息的Opcode為0x803A。
- 配置客戶端發(fā)送的Set消息的Opcode為0x803B。
- 配置端響應(yīng)的Status消息的Opcode為0x803C
3.啟動(dòng)發(fā)布ConfigHeartbeatPublicationSet(networkKeyIndex: 0, destination: 1, countLog: 4, periodLog: 4, ttl: 5, features: [])
返回確認(rèn)消息ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 1, countLog: 4, periodLog: 4, ttl: 5, features: [])
- 心跳發(fā)布的Get/Set消息的Opcode是2個(gè)字節(jié),而響應(yīng)的Status消息是1個(gè)字節(jié)。
- 配置客戶端發(fā)送的Get消息的Opcode為0x8038。
- 配置客戶端發(fā)送的Set消息的Opcode為0x8039。
- 配置端響應(yīng)的Status消息的Opcode為0x06
心跳發(fā)布Publication參數(shù)
表一
count與count log之間的關(guān)系,傳遞的參數(shù)是count log。
| count log值 | 實(shí)際count值 |
|---|---|
| 0x01 | 0x0001 |
| 0x02 | 0x0002 ~ 0x0003 |
| 0x03 | 0x0004 ~ 0x0007 |
| 0x04 | 0x0008 ~ 0x000F |
| 0x05 | 0x0010 ~ 0x001F |
| 0x06 | 0x0020 ~ 0x003F |
| 0x07 | 0x0040 ~ 0x007F |
| 0x08 | 0x0080 ~ 0x00FF |
| 0x09 | 0x0100 ~ 0x01FF |
| 0x0A | 0x0200 ~ 0x03FF |
| 0x0B | 0x0400 ~ 0x07FF |
| 0x0C | 0x0800 ~ 0x0FFF |
| 0x0D | 0x1000 ~ 0x1FFF |
| 0x0E | 0x2000 ~ 0x3FFF |
| 0x0F | 0x4000 ~ 0x7FFF |
| 0x10 | 0x8000 ~ 0xFFFF |
心跳發(fā)布目標(biāo)地址
Heartbeat Publication Destination是一個(gè) 16 位值,決定 Heartbeat 消息的目標(biāo)地址。
- 未分配的地址:說明目標(biāo)地址無效,這個(gè)心跳消息不會(huì)發(fā)送。
- 單播地址:除操作節(jié)點(diǎn)的其他所有節(jié)點(diǎn)。節(jié)點(diǎn)給自己發(fā)布心跳沒有意義。
- 組地址:所有組。
- 特殊地址的表示方式:All Proxys : 0xFFFC,All Friends:0xFFFD,All Relays:0xFFFE,All Nodes:0xFFFF,一共四種。
- 所有其他值都是禁止的。
心跳發(fā)布次數(shù)
Heartbeat Publication Count是一個(gè) 16 位的值,用于控制要發(fā)送的 Heartbeat 消息的數(shù)量。
| 值 | 描述 |
|---|---|
| 0x00 | 心跳消息無效,或者停止 |
| 0x01–0x11 | 心跳次數(shù)為2的(n-1)次冪 |
| 0x12-0xFE | 禁止使用 |
| 0xFF | 一直發(fā)心跳消息 |
心跳發(fā)布周期
Heartbeat Publication Period Log是一個(gè) 8 位值,用于控制周期性 Heartbeat 消息的間隔時(shí)間。
| 值 | 描述 |
|---|---|
| 0x00 | 心跳消息無效,或者停止 |
| 0x01–0x11 | 心跳間隔為2的(n-1)次冪秒 |
| 0x12-0xFE | 禁止使用 |
心跳發(fā)布Features
Heartbeat Publication Features 狀態(tài)決定了在更改時(shí)觸發(fā)發(fā)送 Heartbeat 消息的功能。16位的值。
| Bit | Feature | Notes |
|---|---|---|
| 0 | Relay | Relay特性改變觸發(fā)心跳消息: 0 = False, 1 = True |
| 1 | Proxy | Proxy特性改變觸發(fā)心跳消息: 0 = False, 1 = True |
| 2 | Friend | Proxy特性改變觸發(fā)心跳消息: 0 = False, 1 = True |
| 3 | Low Power | Low Power特性改變觸發(fā)心跳消息: 0 = False, 1 = True |
| 4~15 | RFU | 保留 |
在心跳訂閱時(shí),至多只能選擇一種進(jìn)行訂閱。
在心跳發(fā)布時(shí),可以不選或者選擇4種全部觸發(fā)。
熟悉的參數(shù)
Heartbeat Publication NetKey Index狀態(tài)決定了用于發(fā)送 Heartbeat 消息的 NetKey 的全局 NetKey Index。16位的值。
Heartbeat Publication TTL心跳消息的TTL。8位的值。
心跳訂閱Subscription參數(shù)
心跳訂閱源地址
Heartbeat Subscription Source心跳訂閱源地址確定節(jié)點(diǎn)應(yīng)處理的心跳消息的源地址。應(yīng)為未分配地址或單播地址,所有其他值均禁止。2字節(jié)。
- 兩種情況:未分配地址或單播地址。
- 訂閱地址這里沒有包含組地址。因?yàn)橹辉试S給節(jié)點(diǎn)某個(gè)模型設(shè)置訂閱消息,節(jié)點(diǎn)就是來源,節(jié)點(diǎn)地址就是源地址。
如果 Heartbeat Subscription Source 設(shè)置為未分配的地址,則不處理 Heartbeat 消息。
注意:原則上單播地址不包含正在操作的當(dāng)前節(jié)點(diǎn),因?yàn)闆]有意義。在程序中,獲取的是除本節(jié)點(diǎn)外的其他節(jié)點(diǎn),包括配網(wǎng)器節(jié)點(diǎn),取節(jié)點(diǎn)的單播地址。
心跳訂閱目標(biāo)地址
Heartbeat Subscription Destination 決定 Heartbeat 消息的目標(biāo)地址。2字節(jié)。
- Heartbeat Subscription Destination 應(yīng)該是未分配的地址、節(jié)點(diǎn)的單播地址或組地址,所有其他值都是禁止的。
- 如果 Heartbeat Subscription Destination 設(shè)置為未分配的地址,則不會(huì)處理 Heartbeat 消息。
節(jié)點(diǎn)可以使用它來配置代理過濾器,以允許它們接收心跳消息,例如,使用 GATT 承載或友誼連接的節(jié)點(diǎn)。
特別注意:
1.目標(biāo)地址的單播地址,給哪個(gè)節(jié)點(diǎn)添加訂閱,限定只能選當(dāng)前節(jié)點(diǎn)的單播地址。(The Heartbeat Subscription Destination shall be the unassigned address, the primary unicast address of the node, or a group address, all other values are Prohibited.)
2.還有一類特殊地址,一共是4種:All Proxys,All Friends,All Relays,All Nodes。
單播地址和組地址直接可以獲取。特殊地址的表示方式:
All Proxys : 0xFFFC
All Friends:0xFFFD
All Relays:0xFFFE
All Nodes:0xFFFF
心跳訂閱周期與周期計(jì)數(shù)
-
Heartbeat Subscription Count是一個(gè) 16 位計(jì)數(shù)器。 -
Heartbeat Subscription Count Log是一個(gè) 8 位計(jì)數(shù)器。1字節(jié),實(shí)際傳輸數(shù)據(jù)。 - 用于控制自最后一次執(zhí)行 Config Heartbeat Subscription Set 消息后,接收到的 Heartbeat 消息的數(shù)量。
- 計(jì)數(shù)器在 0xFFFF 處停止計(jì)數(shù)。
-
Heartbeat Subscription Count Log是Heartbeat Subscription Count值的表示。Count Log的 0xFF與Count的0xFFFF等價(jià)。
| Count Log值(1字節(jié)) | 描述 |
|---|---|
| 0x00 | 不會(huì)處理心跳消息 |
| 0x01–0x11 | 根據(jù)2的(n-1)次冪,對(duì)照在上方表一 |
| 0x12-0xFF | 禁止使用 |
心跳訂閱Min Hops與Max Hops
Heartbeat Subscription Min Hops 是自 Config Heartbeat Subscription Set 消息最后一次修改后,在接收 Heartbeat 消息時(shí)注冊(cè)的最小跳數(shù)。
Heartbeat Subscription Max Hops指最大跳數(shù)。
- 0x00 指沒收到心跳消息。
- 0x80–0xFF 禁止使用。
- 0x01–0x7F 有效的范圍。
目前程序中設(shè)置 maxHops 為 0;minHops為0x7F。實(shí)際計(jì)算中,會(huì)用
//與接收的heartbeat消息中的跳數(shù)做計(jì)算
minHops = min(minHops, heartbeat.hops)
maxHops = max(maxHops, heartbeat.hops)
所以這個(gè)最大值和最小值跟我們?nèi)粘@斫獾南喾础?/p>
mesh心跳業(yè)務(wù)邏輯
心跳是基于訂閱和發(fā)布來實(shí)現(xiàn)。與發(fā)布和訂閱強(qiáng)關(guān)聯(lián)的是目標(biāo)地址。若一個(gè)模型所在的元素訂閱了目標(biāo)地址,則該元素可以收到任何發(fā)送到目標(biāo)地址的消息。若一個(gè)模型配置了狀態(tài)發(fā)布,則該元素需要把模型狀態(tài)變化的消息發(fā)布到對(duì)應(yīng)的目標(biāo)地址。
心跳與模型訂閱有一些區(qū)別,比如:
- 模型數(shù)據(jù)是保存在Element的Model數(shù)據(jù)中,但心跳的訂閱和發(fā)布是直接保存在節(jié)點(diǎn)的數(shù)據(jù)中。
- 模型的可以訂閱多個(gè)組,但是心跳訂閱只能訂閱一個(gè)。
一個(gè)新的節(jié)點(diǎn)沒有關(guān)于心跳訂閱和發(fā)布的數(shù)據(jù),因?yàn)樵谂渚W(wǎng)時(shí)沒有對(duì)這個(gè)部分做處理。這也就意味著,如果有需要一直檢測設(shè)備是否在線的需求,可以在設(shè)備配網(wǎng)后的config階段對(duì)心跳做處理。
心跳訂閱與發(fā)布在節(jié)點(diǎn)的位置

訪問層確認(rèn)消息重發(fā)時(shí)間
需要確認(rèn)的消息,會(huì)在訪問層創(chuàng)建定時(shí)器監(jiān)聽消息,如果沒有收到消息確認(rèn),在一段時(shí)間之后,將會(huì)重發(fā)。訪問層的重發(fā),數(shù)據(jù)不會(huì)改變。
訪問層邏輯,重發(fā)時(shí)間間隔的計(jì)算,涉及如下3個(gè)參數(shù):
- 程序中可以設(shè)置確認(rèn)消息時(shí)間間隔
acknowledgmentMessageInterval。 - 節(jié)點(diǎn)的TTL或者網(wǎng)絡(luò)的TTL。
- 確認(rèn)消息的段數(shù)segmentsCount
計(jì)算公式:(max是取兩個(gè)數(shù)中的最大值)
int firstTime = max( acknowledgmentMessageInterval, 2.0) + ttl*0.05 + segmentCount*0.05
如上:第一次重發(fā)的時(shí)間是firstTime,單位是秒。
后一次重發(fā)時(shí)間間隔是上一次的2倍。
比如第二次的時(shí)間間隔是第一次發(fā)送數(shù)據(jù)后的2*firstTime秒。第三次是第二次發(fā)送數(shù)據(jù)后的4*firstTime秒。
定時(shí)器超時(shí)會(huì)取消監(jiān)聽,默認(rèn)超時(shí)時(shí)間是30秒,可以設(shè)置更長時(shí)間。
新增一個(gè)心跳訂閱
使用ConfigHeartbeatSubscriptionSet消息進(jìn)行心跳訂閱。
- 屬于需要確認(rèn)的消息類型。
- 屬于config消息類型。
- 如下例,當(dāng)前操作節(jié)點(diǎn)0x0007,在模型層是兩個(gè)參數(shù)message和node,無論消息內(nèi)容是什么,該消息會(huì)發(fā)送到0x0007節(jié)點(diǎn)進(jìn)行處理。
例:這個(gè)消息的3個(gè)參數(shù):Source,Destination,PeriodLog。分別選擇:
Source:0x000A
Destination:0x0007
PeriodLog:4
模型層:ConfigHeartbeatSubscriptionSet(source: 10, destination: 7, periodLog: 4)
經(jīng)過訪問層PDU處理后:Access PDU (opcode: 0x803B, parameters: 0x0A00070004)(iOS是小端模式)
經(jīng)過上層傳輸層處理后:transportPdu :"2FC6B857B3AFCE07EFE77B" (無需分包)
經(jīng)過底層傳輸層處理后,封裝成Access Message (akf: 0, szmic: 0, data: 0x2FC6B857B3AFCE07EFE77B)
經(jīng)過網(wǎng)絡(luò)層處理后,Network PDU (ivi: 0, nid: 0x1A, ctl: 0, ttl: 5, seq: 470, src: 0001, dst: 0007, transportPdu: 0xB3D7817FAAA58F951D7F2591, netMic: 0xA7197688)
交給承載器發(fā)送:0x001A1D91D598773CE3E472251D991283EDA904DEBBB1434F4EFB。
訂閱設(shè)置的響應(yīng)指令
收到:0x001AB6FBDA9BEC28292A8C98894625C5EC61F299DE1D83DEC27F007DEC48
網(wǎng)絡(luò)層識(shí)別:Network PDU (ivi: 0, nid: 0x1A, ctl: 0, ttl: 5, seq: 2066, src: 0007, dst: 0001, transportPdu: 0x8C98894625C5EC61F299DE1D83DEC27F, netMic: 0x007DEC48)
底層傳輸層識(shí)別為分段消息,Segmented Access Message (akf: 0, szmic: 0, seqZero: 2065, segO: 0, segN: 1, data: 0x36B682A4519BB663249A8F96)
一共兩端消息(segN=1),收到的是第一段(segO: 0),發(fā)送消息確認(rèn)Sending ACK (seqZero: 2065, blockAck: 0x00000001)
保存這段數(shù)據(jù),等待消息完整后再做處理。
<font color = #FF00FF size=3>(期間有多條重復(fù)數(shù)據(jù))</font>
收到:0x001A1DAEDEB3F9745B8347ADEBED904699F63561FB
網(wǎng)絡(luò)層識(shí)別:Network PDU (ivi: 0, nid: 0x1A, ctl: 0, ttl: 5, seq: 2067, src: 0007, dst: 0001, transportPdu: 0x47ADEBED904699, netMic: 0xF63561FB)
底層傳輸層識(shí)別為分端消息:Segmented Access Message (akf: 0, szmic: 0, seqZero: 2065, segO: 1, segN: 1, data: 0xDEFDA2)
一共兩段消息,收到的是第二段。發(fā)送消息確認(rèn)Sending ACK (seqZero: 2065, blockAck: 0x00000003)
底層傳輸層判斷出消息完整,合并兩端消息數(shù)據(jù),得到完整訪問消息:Access Message (akf: 0, szmic: 0, data: 0x36B682A4519BB663249A8F96DEFDA2)
消息向上層傳輸層傳遞,處理:Upper Transport PDU (encrypted data: 0x36B682A4519BB663249A8F, transMic: 0x96DEFDA2)
訪問層生成訪問PDU:Access PDU (opcode: 0x803C, parameters: 0x000A00070001007F00)
根據(jù)下方心跳訂閱狀態(tài)消息格式解析消息parameters字段。
模型層識(shí)別并解析出參數(shù):ConfigHeartbeatSubscriptionStatus(status: Success, source: 10, destination: 7, periodLog: 1, countLog: 0, minHops: 127, maxHops: 0)
將心跳訂閱參數(shù)保存到節(jié)點(diǎn)對(duì)應(yīng)的本地網(wǎng)絡(luò)數(shù)據(jù)。
<font color = #FF0000 size=3>為什么設(shè)置的periodLog無效 ???</font>
響應(yīng):心跳訂閱狀態(tài)
Config Heartbeat Subscription Status 是一條非確認(rèn)消息,用于報(bào)告節(jié)點(diǎn)的 Heartbeat Subscription 狀態(tài)
| Parameters | Size (octets) | Notes |
|---|---|---|
| Status | 1 | 請(qǐng)求消息的狀態(tài)碼,0x00 表示成功,0x01 ~0x11為失敗 |
| Source | 2 | 源地址 |
| Destination | 2 | 目標(biāo)地址 |
| PeriodLog | 1 | Remaining Period for processing Heartbeat messages |
| CountLog | 1 | Number of Heartbeat messages received |
| MinHops | 1 | Minimum hops when receiving Heartbeat messages |
| MaxHops | 1 | Maximum hops when receiving Heartbeat messages |
新增一個(gè)心跳發(fā)布
使用ConfigHeartbeatPublicationSet消息進(jìn)行心跳發(fā)布。
- 屬于需要確認(rèn)的消息類型。
- 屬于config消息類型。
- 如下例,當(dāng)前操作節(jié)點(diǎn)0x0007,在模型層是兩個(gè)參數(shù)message和node,無論消息內(nèi)容是什么,該消息會(huì)發(fā)送到0x0007節(jié)點(diǎn)進(jìn)行處理。
例:這個(gè)消息的6個(gè)參數(shù):Destination,CountLog,PeriodLog,TTL,F(xiàn)eatures,NetKeyIndex。分別選擇:
Destination:0x000A
CountLog:10
PeriodLog:7
TTL:5
Features:[]
NetKeyIndex:0
模型層ConfigHeartbeatPublicationSet(networkKeyIndex: 0, destination: 10, countLog: 10, periodLog: 7, ttl: 5, features: [])
訪問層Access PDU (opcode: 0x8039, parameters: 0x0A000A070500000000)
上層傳輸層Upper Transport PDU (encrypted data: 0x33348E9C6A8D31680EAC17, transMic: 0x3677F938)(無需分包)
底層傳輸層生成Access Message (akf: 0, szmic: 0, data: 0x33348E9C6A8D31680EAC173677F938)
網(wǎng)絡(luò)層Network PDU (ivi: 0, nid: 0x1A, ctl: 0, ttl: 5, seq: 490, src: 0001, dst: 0007, transportPdu: 0x665E8B80589AC134417E43EA1235F2B8, netMic: 0xFDDFBA01)
發(fā)給承載器發(fā)送-> 0x001A4ACC7F19206993DF665E8B80589AC134417E43EA1235F2B8FDDFBA01
心跳發(fā)布的響應(yīng)指令
ConfigHeartbeatPublicationStatus響應(yīng)流程類似心跳訂閱:
第一段數(shù)據(jù)0x001A2BE08892A34E66D783899B27DADC3F1A2F084F4C78BF7D225F34FB24
第二段數(shù)據(jù)0x001A4B2702D732AE9752E125C797B7C2B716E5C2EF
最終生成訪問層消息Access PDU (opcode: 0x 6, parameters: 0x000A000A070500000000)
模型層解析ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 10, countLog: 10, periodLog: 7, ttl: 5, features: [])
將心跳發(fā)布參數(shù)保存到節(jié)點(diǎn)對(duì)應(yīng)的本地網(wǎng)絡(luò)數(shù)據(jù)。
| 參數(shù) | 長度(字節(jié)) | 注釋 |
|---|---|---|
| Status | 1 | Status Code for the requesting message |
| Destination | 2 | Destination address for Heartbeat messages |
| CountLog | 1 | Number of Heartbeat messages remaining to be sent |
| PeriodLog | 1 | Period for sending Heartbeat messages |
| TTL | 1 | TTL to be used when sending Heartbeat messages |
| Features | 2 | Bit field indicating features that trigger Heartbeat messages when changed |
| NetKeyIndex | 2 | NetKey Index |
心跳消息
實(shí)例:目前網(wǎng)絡(luò)中是3個(gè)節(jié)點(diǎn)加手機(jī)App配網(wǎng)器,3個(gè)節(jié)點(diǎn)和配網(wǎng)器均在一米范圍內(nèi),配網(wǎng)器不確定連接的是哪個(gè)節(jié)點(diǎn)。
在開啟心跳發(fā)布后,收到心跳消息,流程如下:
承載層收到0x001AD72A7656276E06C7270ED41C19086A5A95435DC6
網(wǎng)絡(luò)層生成Network PDU (ivi: 0, nid: 0x1A, ctl: 1, ttl: 126, seq: 2654, src: 0007, dst: 0001, transportPdu: 0x270ED41C, netMic: 0x19086A5A95435DC6)
底層傳輸層識(shí)別Control Message (opCode: 0x0A, data: 0x7F0007)
上層傳輸層判斷出是Heartbeat Message (initial TTL: 127, received TTL: 126, hops: 2, features: Relay, Proxy, Friend)
<font color = #0000FF size=3>間隔一個(gè)心跳周期后,會(huì)收到下個(gè)包</font>
承載層收到0x001A46FC18E205EE783BD698D2E37AE903084E061D75
網(wǎng)絡(luò)層生成Network PDU (ivi: 0, nid: 0x1A, ctl: 1, ttl: 125, seq: 2655, src: 0007, dst: 0001, transportPdu: 0xD698D2E3, netMic: 0x7AE903084E061D75)
底層傳輸層識(shí)別Control Message (opCode: 0x0A, data: 0x7F0007)
上層傳輸層判斷出是Heartbeat Message (initial TTL: 127, received TTL: 125, hops: 3, features: Relay, Proxy, Friend)
<font color = #0000FF size=3>間隔一個(gè)心跳周期后,會(huì)收到下個(gè)包</font>
承載層收到0x001A0D3A0FE5CE5A461F0ACE35ADD06F697603831682
網(wǎng)絡(luò)層生成Network PDU (ivi: 0, nid: 0x1A, ctl: 1, ttl: 126, seq: 2656, src: 0007, dst: 0001, transportPdu: 0x0ACE35AD, netMic: 0xD06F697603831682)
底層傳輸層識(shí)別Control Message (opCode: 0x0A, data: 0x7F0007)
上層傳輸層Heartbeat Message (initial TTL: 127, received TTL: 126, hops: 2, features: Relay, Proxy, Friend)
| 參數(shù) | 長度(字節(jié)) | 含義 |
|---|---|---|
| source | 2 | 心跳消息來源地 |
| destination | 2 | 心跳消息目的地 |
| features | 2 | 特征值位 |
| initialTtl | 1 | 心跳消息TTL初始值 |
| receivedTtl | 1 | 收到心跳消息時(shí)的TTL值 |
| hops | 1 | 跳數(shù) |
TTL初始值,減去收到心跳消息時(shí)的TTL值,就能算出心跳消息經(jīng)過了幾次轉(zhuǎn)發(fā)。
當(dāng)源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)直接通信時(shí),receivedTtl還是127,hops為1。
當(dāng)源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)經(jīng)過一次轉(zhuǎn)發(fā)通信時(shí),receivedTtl是126,hops為2。
當(dāng)源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)經(jīng)過二次轉(zhuǎn)發(fā)通信時(shí),receivedTtl是125,hops為3。
總結(jié)
在App端,接收到心跳消息后,判斷節(jié)點(diǎn)的目標(biāo)地址是否是配網(wǎng)器節(jié)點(diǎn)。如果是,才會(huì)在App端做處理。
在APP端,接收到心跳訂閱狀態(tài)或者心跳發(fā)布狀態(tài)消息后,判斷節(jié)點(diǎn)的目標(biāo)地址是否是配網(wǎng)器節(jié)點(diǎn)。如果不是,才會(huì)在App端本地?cái)?shù)據(jù)中做修改。
在如果需要一直判斷設(shè)備是否在線的場景下,可以通過這個(gè)配網(wǎng)器節(jié)點(diǎn)接收心跳包的時(shí)間間隔判斷設(shè)備是否在線。根據(jù)hops值和網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),能判斷出網(wǎng)絡(luò)通信狀態(tài)是否正常。
清除一個(gè)心跳訂閱
ConfigHeartbeatSubscriptionSet(source: 0, destination: 0, periodLog: 0)
新增或修改心跳訂閱
ConfigHeartbeatSubscriptionSet(source: 1, destination: 15, periodLog: 3)
ConfigHeartbeatSubscriptionStatus(status: Success, source: 1, destination: 15, periodLog: 3, countLog: 0, minHops: 127, maxHops: 0)作用是什么?
獲取心跳訂閱
ConfigHeartbeatSubscriptionGet()
ConfigHeartbeatSubscriptionStatus(status: Success, source: 1, destination: 15, periodLog: 0, countLog: 0, minHops: 127, maxHops: 0) 此時(shí)心跳發(fā)布已經(jīng)完成或者沒有開始心跳發(fā)布。
新增一個(gè)心跳發(fā)布
ConfigHeartbeatPublicationSet(networkKeyIndex: 0, destination: 1, countLog: 1, periodLog: 8, ttl: 5, features: []) 發(fā)布一次 間隔2分8秒后
ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 1, countLog: 1, periodLog: 8, ttl: 5, features: [])
Heartbeat Message (initial TTL: 127, received TTL: 127, hops: 1, features: Relay, Proxy, Friend)
ConfigHeartbeatPublicationSet(networkKeyIndex: 0, destination: 1, countLog: 4, periodLog: 6, ttl: 5, features: []) 發(fā)布八次 間隔32秒。 (設(shè)備收到心跳發(fā)布后,開始定時(shí)器計(jì)時(shí),第一次心跳發(fā)布在定時(shí)器啟動(dòng)32秒后。)
ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 1, countLog: 4, periodLog: 6, ttl: 5, features: [])
Heartbeat Message (initial TTL: 127, received TTL: 127, hops: 1, features: Relay, Proxy, Friend)
獲取心跳發(fā)布消息
ConfigHeartbeatPublicationGet()
ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 1, countLog: 1, periodLog: 0, ttl: 5, features: []) 此時(shí)一次心跳發(fā)布已完畢。
ConfigHeartbeatPublicationStatus(status: Success, networkKeyIndex: 0, destination: 1, countLog: 4, periodLog: 0, ttl: 5, features: []) 發(fā)布過8次消息后countLog值發(fā)生變化。
手機(jī)APP要怎么看到心跳包?需要在配網(wǎng)器節(jié)點(diǎn)上,給指定地址發(fā)送一條訂閱消息,不做的話,在收到心跳包之后也不會(huì)處理。在訂閱時(shí)設(shè)置的時(shí)間參數(shù)表示,在發(fā)送指令起,Heartbeat Publication Period Log時(shí)間內(nèi)會(huì)處理發(fā)給配網(wǎng)器節(jié)點(diǎn)的心跳包,超過時(shí)間后,就不會(huì)再處理。目前NRFSDK在收到心跳包后,只會(huì)將數(shù)據(jù)寫入到本地,并不會(huì)傳到界面上。所以需要修改NRFSDK的上層傳輸層代碼,將心跳數(shù)據(jù)傳到APP界面上。