IV Update就是指IV Index Update。是為了解決序列號(hào)SeqNumber耗盡的問題。
1.什么是IV Index
IV Index 是一個(gè) 32 位的值,它是共享網(wǎng)絡(luò)資源(即,mesh網(wǎng)絡(luò)中的所有節(jié)點(diǎn)共享相同的 IV Index 值并將其用于它們所屬的所有子網(wǎng))。
IV 索引從 0x00000000 開始,并在 IV 更新過程中遞增。值增加的時(shí)間不必精確,因?yàn)樽畹陀行辉诿總€(gè)網(wǎng)絡(luò) PDU 內(nèi)進(jìn)行通信。由于 IV Index 值是 32 位值,因此在 IV Index 結(jié)束之前,mesh網(wǎng)絡(luò)可以運(yùn)行大約 5 萬億年。
IV 索引通過安全網(wǎng)絡(luò)信標(biāo)(Secure Network beacon)在網(wǎng)絡(luò)內(nèi)共享。在子網(wǎng)上收到的 IV Update被處理并傳播到該子網(wǎng)。設(shè)備通過給特定子網(wǎng)傳輸具有 IV Update Index的 Secure Network beacons來進(jìn)行傳播。如果主子網(wǎng)上的設(shè)備接收到主子網(wǎng)上的更新,它應(yīng)將 IV 更新傳播到所有其他子網(wǎng)。如果主子網(wǎng)上的設(shè)備在任何其他子網(wǎng)上收到 IV 更新,則應(yīng)忽略更新。
如果一個(gè)節(jié)點(diǎn)在一段時(shí)間內(nèi)不在mesh網(wǎng)絡(luò)中,它可以掃描安全網(wǎng)絡(luò)信標(biāo)或使用 IV 索引恢復(fù)過程。
2.藍(lán)牙m(xù)esh安全網(wǎng)絡(luò)信標(biāo)
安全網(wǎng)絡(luò)信標(biāo)(Secure Network beacon)是藍(lán)牙Mesh beacons 的一種, Mesh beacons 是由節(jié)點(diǎn)和未配網(wǎng)設(shè)備周期性發(fā)出的廣播數(shù)據(jù)包。
2.1.安全網(wǎng)絡(luò)信標(biāo)(Secure Network beacon)
節(jié)點(diǎn)使用安全網(wǎng)絡(luò)信標(biāo)來識(shí)別子網(wǎng)及其安全狀態(tài)。格式以及各字段的含義如下:

| 字段(按順序) | 長度(字節(jié)) | 注釋 |
|---|---|---|
| Beacon Type | 1 | Secure Network beacon (0x01) |
| Flags | 1 | Contains the Key Refresh Flag and IV Update Flag |
| Network ID | 8 | Contains the value of the Network ID |
| IV Index | 4 | Contains the current IV Index |
| Authentication Value | 8 | Authenticates security network beacon |
第二個(gè)字節(jié)Flags的定義如下:
| 位數(shù) | 定義 |
|---|---|
| 0 | Key Refresh Flag |
| 1 | IV Update Flag |
| 2~7 | 保留供以后使用 |
Network ID: 在包含多個(gè)網(wǎng)絡(luò)時(shí),每個(gè)網(wǎng)絡(luò)都有一個(gè)唯一的id.
Authentication Value 字段的計(jì)算定義如下:
Authentication Value = AES-CMAC (Flags || Network ID || IV Index) [0–7],使用BeaconKey。

2.2.安全網(wǎng)絡(luò)信標(biāo)行為(behavior)
當(dāng)在已知子網(wǎng)上接收到安全網(wǎng)絡(luò)信標(biāo)并通過身份驗(yàn)證時(shí),節(jié)點(diǎn)應(yīng)監(jiān)視 IV 索引更新和密鑰刷新過程。為了驗(yàn)證安全網(wǎng)絡(luò)信標(biāo),節(jié)點(diǎn)計(jì)算驗(yàn)證值A(chǔ)uthentication Value并檢查它是否等于接收到的安全網(wǎng)絡(luò)信標(biāo)中的驗(yàn)證值A(chǔ)uthentication Value字段。
可以為節(jié)點(diǎn)所屬的每個(gè)子網(wǎng)發(fā)送安全網(wǎng)絡(luò)信標(biāo),以識(shí)別子網(wǎng)并通知 IV 索引更新和密鑰刷新過程。
Relay 和 Friend 節(jié)點(diǎn)建議發(fā)送信標(biāo),其他節(jié)點(diǎn)之間可以看情況發(fā)送信標(biāo)。發(fā)送兩個(gè)連續(xù)信標(biāo)之間的時(shí)間稱為信標(biāo)間隔。一個(gè)實(shí)現(xiàn)可以定義信標(biāo)間隔和一個(gè)回退過程,以防止其他節(jié)點(diǎn)因過多的信標(biāo)而使網(wǎng)絡(luò)過載。 預(yù)期的行為是每個(gè)節(jié)點(diǎn)大約每 10 秒收到一個(gè)給定子網(wǎng)的信標(biāo)。
對(duì)于每個(gè)子網(wǎng),為了確定信標(biāo)間隔,節(jié)點(diǎn)應(yīng)連續(xù)觀察信標(biāo),并在給定觀察期內(nèi)保持子網(wǎng)信標(biāo)數(shù)量的滾動(dòng)計(jì)數(shù)。 信標(biāo)間隔應(yīng)使用以下公式確定:
Beacon Interval = Observation Period * (Observed Number of Beacons + 1) / Expected Number of Beacons
如果計(jì)算出的 Beacon Interval 小于 10 秒,則應(yīng)將其設(shè)置為 10 秒。 如果計(jì)算的 Beacon Interval 大于 600 秒,則應(yīng)將其設(shè)置為 600 秒。
以秒為單位的觀察周期(Observation Period)通常應(yīng)該是典型信標(biāo)間隔的兩倍。 每個(gè)子網(wǎng)都有一個(gè)單獨(dú)的安全網(wǎng)絡(luò)信標(biāo),因此,每個(gè)子網(wǎng)的預(yù)期信標(biāo)數(shù)(Expected Number of Beacons)、觀察到的信標(biāo)數(shù)(Observed Number of Beacons)和觀察周期可能不同。
Observed Number of Beacon 是在觀察期內(nèi)為此子網(wǎng)觀察到的信標(biāo)數(shù)量。
預(yù)期的信標(biāo)數(shù)量是觀察周期除以 10 秒。
2.3.App端發(fā)送安全網(wǎng)絡(luò)信標(biāo)
手機(jī)App作為配網(wǎng)器節(jié)點(diǎn),怎么實(shí)現(xiàn)發(fā)送Secure Network beacon?手機(jī)端是通過代理協(xié)議實(shí)現(xiàn)藍(lán)牙m(xù)esh協(xié)議棧,手機(jī)端是主機(jī)角色,沒法以從機(jī)身份向外發(fā)廣播。好在代理協(xié)議本就支持mesh beacons消息,而不用手機(jī)發(fā)送。
代理協(xié)議(
proxy protocol)使節(jié)點(diǎn)能夠通過面向連接的承載器發(fā)送和接收網(wǎng)絡(luò) PDU、mesh beacons、代理配置消息和配網(wǎng) PDU。例如,一個(gè)節(jié)點(diǎn)可以支持 GATT,但不能廣播 。 該節(jié)點(diǎn)將與另一個(gè)同時(shí)支持 GATT 承載器和廣播承載器的節(jié)點(diǎn)建立 GATT 連接,使用 Proxy 協(xié)議在這些承載器之間轉(zhuǎn)發(fā)消息。
2.3.1開啟或關(guān)閉節(jié)點(diǎn)的安全網(wǎng)絡(luò)信標(biāo)
ConfigBeaconGet是一個(gè)確認(rèn)消息,沒有參數(shù),用于獲取節(jié)點(diǎn)當(dāng)前的安全網(wǎng)絡(luò)信標(biāo)狀態(tài)。返回消息是ConfigBeaconStatus。
ConfigBeaconSet是一個(gè)確認(rèn)消息,用于設(shè)置節(jié)點(diǎn)的安全網(wǎng)絡(luò)信標(biāo)狀態(tài)。返回消息是ConfigBeaconStatus。包含一個(gè)參數(shù):新的安全網(wǎng)絡(luò)信標(biāo)狀態(tài)。
3.IV Update procedure
3.1概述
IV 索引為應(yīng)用層和網(wǎng)絡(luò)層中用于認(rèn)證加密 (AES-CCM) 的隨機(jī)數(shù)提供熵。 因此,必須經(jīng)常更改它以避免在nonce中重復(fù)使用sequence numbers。 IV 更新過程由作為主子網(wǎng)成員的任何節(jié)點(diǎn)啟動(dòng)。 當(dāng)節(jié)點(diǎn)認(rèn)為它有耗盡其序列號(hào)的風(fēng)險(xiǎn)時(shí),或者它確定另一個(gè)節(jié)點(diǎn)即將耗盡其序列號(hào)(sequence numbers)時(shí),可以這樣做。 節(jié)點(diǎn)更改其 IV 索引并向網(wǎng)絡(luò)中的其他節(jié)點(diǎn)發(fā)送 IV 索引正在更新的指示。 然后,網(wǎng)絡(luò)中的相同或某個(gè)其他節(jié)點(diǎn)會(huì)更改回正常操作。
在密鑰索引不同于 0x000 的連接子網(wǎng)上,至少一個(gè)安全網(wǎng)絡(luò)信標(biāo)狀態(tài)設(shè)置為 1 的節(jié)點(diǎn)也必須位于主子網(wǎng)上。
IV 更新程序定義了兩種操作狀態(tài):
- Normal Operation: IV Update Flag = 0
- IV Update in Progress:IV Update Flag = 1
- 在正常操作狀態(tài)期間,安全網(wǎng)絡(luò)信標(biāo)和朋友更新消息中的 IV 更新標(biāo)志應(yīng)設(shè)置為 0。
- 當(dāng)此狀態(tài)處于活動(dòng)狀態(tài)時(shí),節(jié)點(diǎn)應(yīng)使用當(dāng)前 IV Index進(jìn)行傳輸,并應(yīng)處理來自當(dāng)前 IV Index 以及當(dāng)前的 IV Index - 1的消息。
例如, IV Update Flag 設(shè)置為 0, current IV Index 等于 0x00101847 時(shí),這個(gè)節(jié)點(diǎn)發(fā)送消息的 IV Index為0x00101847,接收消息的兩種情況:
- 網(wǎng)絡(luò)層的 IVI 字段設(shè)置為 1時(shí),IV Index為0x00101847。
- 網(wǎng)絡(luò)層的 IVI 字段設(shè)置為 0時(shí),IV Index為 0x00101846 。
3.2 接收SNB處理
情況一:
如果正常操作中的節(jié)點(diǎn),接收到一個(gè)安全網(wǎng)絡(luò)信標(biāo),其 IV Index大于最后一個(gè)已知 IV Index + 1 ,它可以啟動(dòng) IV 索引恢復(fù)過程(IV Index Recovery procedure)。
情況二:
如果正常操作中的節(jié)點(diǎn),接收到一個(gè)安全網(wǎng)絡(luò)信標(biāo),其 IV Index等于最后一個(gè)已知的 IV Index +1 并且 IV 更新標(biāo)志設(shè)置為 0,則該節(jié)點(diǎn)根據(jù)
- 根據(jù)自上次 IV Update以來的時(shí)間
- 節(jié)點(diǎn)錯(cuò)過 IV update Flag設(shè)置為 1 安全網(wǎng)絡(luò)信標(biāo)的可能性
做出如下三種可能的選擇
- 可能會(huì)直接更新其 IV 而不進(jìn)入
IV Update正在進(jìn)行狀態(tài), - 或者它可能會(huì)啟動(dòng) IV 索引恢復(fù)過程,
- 或者它可能會(huì)忽略安全網(wǎng)絡(luò)信標(biāo)。
情況三:
如果正常操作中的節(jié)點(diǎn),接收到一個(gè)安全網(wǎng)絡(luò)信標(biāo),其 IV Index小于最后一個(gè)已知 IV Index或大于最后一個(gè)已知 IV Index + 42 ,則應(yīng)忽略安全網(wǎng)絡(luò)信標(biāo)。
注意:上述要求允許節(jié)點(diǎn)離開網(wǎng)絡(luò) 48 周。 必須給離開網(wǎng)絡(luò)超過 48 周的節(jié)點(diǎn)重新配網(wǎng)。
如果此節(jié)點(diǎn)是主子網(wǎng)的成員,并且在子網(wǎng)上接收到 IV Index大于主子網(wǎng)最后一個(gè)已知 IV 索引的安全網(wǎng)絡(luò)信標(biāo),則應(yīng)忽略安全網(wǎng)絡(luò)信標(biāo)。(這里可以應(yīng)用于一個(gè)場景,可以給客人開一個(gè)子網(wǎng)絡(luò),客人用完后,刷新IV Index。)
3.3其他規(guī)定:
節(jié)點(diǎn)啟動(dòng) IV Update過程的頻率不得超過每 192 小時(shí)一次。
在正常操作中運(yùn)行 96 小時(shí)后,節(jié)點(diǎn)可以通過轉(zhuǎn)換到 IV 更新進(jìn)行中狀態(tài)來啟動(dòng) IV 更新過程。 當(dāng)節(jié)點(diǎn)從正常操作狀態(tài)轉(zhuǎn)換到 IV 更新進(jìn)行中狀態(tài)時(shí),節(jié)點(diǎn)上的 IV 索引應(yīng)增加 1。
從正常操作狀態(tài)到 IV 更新進(jìn)行中狀態(tài)的轉(zhuǎn)換必須在序列號(hào)用完之前至少 96 小時(shí)發(fā)生。
處于正常操作狀態(tài)的節(jié)點(diǎn)接收并接受 IV 更新標(biāo)志設(shè)置為 1 的安全網(wǎng)絡(luò)信標(biāo)(指示 IV 更新進(jìn)行中狀態(tài))應(yīng)盡快轉(zhuǎn)換到 IV 更新進(jìn)行中狀態(tài)。
-
在 IV 更新進(jìn)行中狀態(tài)期間,安全網(wǎng)絡(luò)信標(biāo)和好友更新消息中的 IV 更新標(biāo)志應(yīng)設(shè)置為 1。當(dāng)此狀態(tài)處于活動(dòng)狀態(tài)時(shí),節(jié)點(diǎn)應(yīng)使用當(dāng)前 IV Index - 1 進(jìn)行傳輸,并處理接收消息 從current IV index - 1 以及current IV index。
例如,如果在從 Normal Operation 狀態(tài)轉(zhuǎn)換到 IV Update in Progress 狀態(tài)之前 IV Index 為 0x00101847,則轉(zhuǎn)換后 ,IV Update Flag 將為 1,當(dāng)前 IV Index 將為 0x00101848。節(jié)點(diǎn)應(yīng)使用 IV 索引 0x00101847 進(jìn)行發(fā)送,并接收如下兩種情況的消息:
(1)在網(wǎng)絡(luò)層中的 IVI 字段設(shè)置為 1 時(shí),使用 IV 索引 0x00101847 接收消息;
(2)當(dāng)網(wǎng)絡(luò)層中的 IVI 字段設(shè)置為 0 時(shí),使用 IV 索引 0x00101848 接收消息。
這允許所有處于正常操作狀態(tài)的節(jié)點(diǎn)使用舊的 IV 索引向該節(jié)點(diǎn)發(fā)送消息,該節(jié)點(diǎn)向那些尚未轉(zhuǎn)換的節(jié)點(diǎn)發(fā)送消息。
-
在 IV Update in Progress 狀態(tài)下運(yùn)行 96 小時(shí)至 144 小時(shí)之間時(shí),節(jié)點(diǎn)應(yīng)轉(zhuǎn)換回 IV Normal Operation 狀態(tài)并且不更改 IV Index。 在轉(zhuǎn)換點(diǎn),節(jié)點(diǎn)應(yīng)將序列號(hào)重置為 0x000000。
例如,當(dāng)轉(zhuǎn)換回正常操作狀態(tài)時(shí),IV 更新標(biāo)志將為 0,當(dāng)前 IV 索引將為 0x00101848,節(jié)點(diǎn)應(yīng)使用 IV 索引 0x00101848 發(fā)送,并接收如下兩種情況的消息:
(1)當(dāng)網(wǎng)絡(luò)層中的 IVI 字段設(shè)置為 1 時(shí),使用 IV 索引 0x00101847 接收的消息
(2)當(dāng)網(wǎng)絡(luò)層中的 IVI 字段設(shè)置為 0時(shí),使用 IV 索引0x00101848接收的消息。
這允許節(jié)點(diǎn)向網(wǎng)絡(luò)中的所有節(jié)點(diǎn)發(fā)送消息,無論它們是否也處于正常操作狀態(tài)或處于 IV 更新進(jìn)行中狀態(tài)。 它還允許節(jié)點(diǎn)從處于正常操作狀態(tài)或 IV 更新進(jìn)行狀態(tài)的所有節(jié)點(diǎn)接收消息。
下表提供了 IV 更新程序的摘要:
IV Index Flag Procedure State Accepted transmitting n 0 Normal n-1, n n n+1 1 In Progress n,n+1 n n+1 0 Normal n,n+1 n+1
-
處于 IV 更新進(jìn)行中狀態(tài)的節(jié)點(diǎn),接收并接受了 IV 更新標(biāo)志設(shè)置為 0(指示正常操作狀態(tài))的安全網(wǎng)絡(luò)信標(biāo),應(yīng)盡快轉(zhuǎn)換到正常操作狀態(tài)。
當(dāng)節(jié)點(diǎn)已發(fā)送分段訪問消息或分段控制消息而未接收到相應(yīng)的分段確認(rèn)消息時(shí),節(jié)點(diǎn)應(yīng)將狀態(tài)更改從進(jìn)行中的 IV 更新推遲到正常操作,如本程序所定義。當(dāng)收到適當(dāng)?shù)亩未_認(rèn)消息或達(dá)到此消息傳遞的超時(shí)時(shí)間時(shí),應(yīng)執(zhí)行延遲的狀態(tài)更改。
注意:此要求是必要的,因?yàn)樵谕瓿?IV 更新過程后,序列號(hào)將重置為 0x000000,并且 SeqAuth 值將無效。
當(dāng)一個(gè)節(jié)點(diǎn)被添加到網(wǎng)絡(luò)中時(shí),該節(jié)點(diǎn)被賦予一個(gè) IV 索引。如果在網(wǎng)絡(luò)處于正常運(yùn)行狀態(tài)時(shí)將節(jié)點(diǎn)添加到網(wǎng)絡(luò),則它應(yīng)在正常運(yùn)行狀態(tài)下運(yùn)行至少 96 小時(shí)。如果在網(wǎng)絡(luò)處于 IV Update in Progress 狀態(tài)時(shí)將節(jié)點(diǎn)添加到網(wǎng)絡(luò),則應(yīng)賦予該節(jié)點(diǎn)新的 IV Index 值并在正常操作中運(yùn)行至少 96 小時(shí)。
3.4 天貓精靈在IV Index Update的約定
天貓精靈藍(lán)牙m(xù)esh基礎(chǔ)規(guī)范

4 IV Update test mode
為了實(shí)現(xiàn) IV 更新過程的有效測試,節(jié)點(diǎn)應(yīng)支持 IV 更新測試模式,用于與藍(lán)牙認(rèn)證過程相關(guān)的測試。 測試模式的激活應(yīng)在本地執(zhí)行(通過硬件或軟件接口)。 IV Update 測試模式僅取消了 96 小時(shí)的限制; 設(shè)備的所有其他行為應(yīng)保持不變。
IV 更新測試模式中定義了兩個(gè)信號(hào): ? Transit to IV Update in Progress 信號(hào) ? 轉(zhuǎn)為正常信號(hào) 當(dāng)接收到 Transit to IV Update in Progress 信號(hào)時(shí),節(jié)點(diǎn)應(yīng)在 進(jìn)度狀態(tài),忽略 96 小時(shí)限制。 當(dāng)接收到 Transit to Normal 信號(hào)時(shí),節(jié)點(diǎn)應(yīng)轉(zhuǎn)換到 Normal 狀態(tài),忽略 96 小時(shí)限制。
5 IV Index Recovery procedure
一個(gè)節(jié)點(diǎn)應(yīng)該支持IV索引恢復(fù)過程,因?yàn)橐粋€(gè)節(jié)點(diǎn)長時(shí)間遠(yuǎn)離網(wǎng)絡(luò)可能會(huì)錯(cuò)過IV更新過程,在這種情況下它不能再與其他節(jié)點(diǎn)通信。為了恢復(fù) IV 索引,節(jié)點(diǎn)必須偵聽安全網(wǎng)絡(luò)信標(biāo),其中包含網(wǎng)絡(luò) ID 和當(dāng)前 IV 索引。在接收并成功驗(yàn)證其 IV 索引比當(dāng)前已知 IV 索引高 1 或更多的主子網(wǎng)的安全網(wǎng)絡(luò)信標(biāo)后,節(jié)點(diǎn)應(yīng)根據(jù)此安全網(wǎng)絡(luò)中的值設(shè)置其當(dāng)前 IV 索引及其當(dāng)前 IV 更新過程狀態(tài)信標(biāo)。
注意:在 IV 指數(shù)恢復(fù)程序更新 IV 指數(shù)后,改變 IV 更新程序狀態(tài)的 96 小時(shí)時(shí)間限制(如 IV 更新程序中定義)不適用。
鑒于節(jié)點(diǎn)每 10 秒集體傳輸一次安全網(wǎng)絡(luò)信標(biāo),低占空比節(jié)點(diǎn)將必須平均偵聽 5 秒以在傳輸和接收網(wǎng)格消息之前恢復(fù)當(dāng)前的 IV 索引。如果 Low Power 節(jié)點(diǎn)沒有足夠的電量來監(jiān)聽 5 秒,那么它必須通過至少每 96 小時(shí)輪詢一次它的 Friend 節(jié)點(diǎn)來保持與當(dāng)前 IV 索引的最新狀態(tài)。
節(jié)點(diǎn)在 192 小時(shí)內(nèi)不得執(zhí)行超過一次的 IV 索引恢復(fù)。