BLE 配對綁定與綁定信息丟失問題

一、概述

在 NXP BLE 產品開發中,我們通常使用的是設備端角色,而且要實現基本的配對和綁定功能,得以去完善這個通信過程。在實際情況中,因為 FLASH 存儲空間的有限性,所以綁定有添加信息固然就有刪除信息,因此 BLE主機或從機綁定信息的丟失問題也是需要我們去關心的。

二、應用場景

基本所有的藍牙設備都默認帶有配對綁定功能,這點毋庸置疑。我們需要處理的問題情況有 BLE 主機端丟失綁定信息或從機端丟失綁定信息的情況,因為某些產品它並不像手機這麼方便能夠觀測到藍牙連接狀態,所以更多時候要依靠藍牙協議棧具有相對應的機制去底層處理。

三、NXP BLE 配對綁定功能開啟

配對和綁定是實現藍牙射頻通信安全的一種機制,執行配對步驟去建立密鑰,然後用於加密鏈路,執行特定於傳輸的密鑰分發來共享密鑰,這些密鑰可用於加密連接,在未來的重連、驗證簽名數據和隨機地址解析中具有重要作用。而綁定則是配對過程中生成一個長期密鑰 LTK,如果配對的兩個設備把這個 LTK 存儲起來放到 FLASH 中,那麼這兩台設備再次重連的時候,就可以跳過之前的配對流程,直接使用這個 LTK 去對藍牙通信鏈路進行加密。


圖一

因為配對是一個三階段的過程,階段一是配對特性交換,配對開始時,配對特性交換應由發起設備發起,通常是主機端,如果響應設備不支持配對或配對不能執行,則響應設備應使用配對失敗的信息對主機端響應,配對功能交換用於交換 IO 功能、OOB 身份驗證數據可用性、身份驗證要求、密鑰大小需求和哪些需要傳輸分發的特定密鑰,用於確定階段二中使用的密鑰生成方法。

階段二包括 legacy pairing 的 STK 生成和 secure pairing 的 LTK 生成過程,連接通信過程會被 STK 加密,其中,配對的前兩個階段是必須的,經過第二階段後,BLE 通信鏈路可根據加密需求選擇加密或者不加密,如果加密,則階段三就可以生成一系列特殊作用的密鑰並分發出去,其實也就是主從機將自己的密鑰交給對方,如果不加密,則無需進行第三階段。所以配對過程中其實不存儲 LTK 也即是不分發 LTK 也是可以的,配對完成後是能通過 STK 對鏈路進行加密的,但如果兩台設備再次重連,那麼久需要再重新走一遍配對流程,否則兩者之間還是明文通信。

但一般情況下,我們會將配對綁定等同,以免混淆,畢竟只配對不綁定的設備非常少見。在 NXP BLE SDK 中,我們如果要使用藍牙配對綁定功能,那麼需要打開以下幾個宏:


圖二

gAppUseBonding_d、gAppUsePairing_d、gAppUseNvm_d 三個宏均設置為 1 即可。

其中,gAppUseNvm_d 用於打開 NVM 機制,打開後,晶片的 FLASH 部分區域將會用來存儲綁定信息,並使用的是磨損算法,具體的綁定信息存儲量需要根據具體代碼和FLASH、RAM 空間進行分配。如果gAppUseNvm_d 設置為 0,那麼所有綁定數據將存儲在 RAM 中,這意味著在晶片掉電復位或重置晶片後這部分綁定數據都會消失。

四、綁定信息丟失問題

  • 主機端刪除了綁定信息,從機端保留綁定信息:

這種情況下,通常需要主機再次發起配對請求,進行重新配對。任何一端沒有配對信息了,都需要再走一次配對流程,配對由主機發起,主機什麼時候刪除綁定信息,這對於從機來說是一種不可控的行為,在 NXP BLE 協議棧中,也沒有對應的底層處理可以去判斷主機是否還存有綁定信息。那麼當主機端再次發起配對請求時,從機端是不是會通過新的綁定信息去覆蓋原來的綁定信息呢?通過查看 NXP BLE 文檔和測試發現,在重新配對操作時,我們並不需要應用層再去對增加的白名單進行判斷,API 會主動對該部分進行處理,無需應用層進行干預,此時配對完之後,我們可以發現從機端已經添加過的記錄並不會再次添加進來。

圖三

  • 主機端保留綁定信息,從機端刪除綁定信息:

這種情況下,從機端丟失了 LTK 信息,將無法通過雙方的通信加密,在 NXP BLE 協議棧中,底層會提示 gConnEvtPairingNoLtk_c 事件以表示從機端綁定信息丟失了。


圖四

從機端調用 Gap_SendSlaveSecurityRequest API 通知對端主機請求本地安全需求,該過程具有與配對請求相同的參數,它沒有配對效果,只是通知主機端發起配對請求。而主機端如果是 IOS 手機或安卓手機,根據操作系統的區別有不同的處理方式,其中 IOS 手機只能通過手動刪除主機端綁定信息並且重新配對,安卓手機可以執行新的綁定程序,刪除掉舊的綁定信息,也即是會主動跳出一個新的配對請求窗口。

以下為測試結果:


圖五

  
圖六

我們可以發現安卓手機可以發起配對請求,而 IOS 手機不會。IOS 端並沒有相應 API 可以知道配對失敗,去讓 APP 端重啟配對過程,但是可以使用(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error,錯誤碼返回的方式進行事件處理,通過獲取系統提示錯誤碼 error = 14,去提示用戶刪除藍牙配對信息。

五、總結

 通過以上的講解,我們對配對和綁定的概念和一些基本問題也有了更多的了解,便於我們在後續的產品開發中有更清晰的處理方式。

六、參考資料

【1】Bluetooth Low Energy Application Developer Guide.pdf

【2】Core_V5.3.pdf

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論

gounie

gounie

3 個月前
ios端有什么其他办法在收到错误码之后在app程序里处理不通知用户手动删除记录的方法么?