BLE-NRF51822教程15-BLE地址
51822的 BLE的設(shè)備地址 可以通過如下函數(shù)函數(shù)來獲得
地址的設(shè)置可以調(diào)用如下函數(shù)設(shè)置。
官方的demo工程中,都是沒有主動調(diào)用過 sd_ble_gap_address_set函數(shù)來設(shè)置設(shè)備地址的。所以 demo工程中使用的都是默認(rèn)地址。
這個默認(rèn)地址就是 芯片出廠是設(shè)置的,出廠時燒寫在FICR寄存器中的。
所以藍(lán)牙芯片啟動后,如果你沒有主動調(diào)用 sd_ble_gap_address_set函數(shù)來設(shè)置地址的話, 協(xié)議棧就會使用 FICR 中的寄存器DEVICEADDR 中的值來設(shè)置 BLE地址。但是并不是直接用,官方工程默認(rèn)都是使用靜態(tài)隨機(jī)地址,所以地址的最高兩位必須要是 1 1,所以協(xié)議棧會使用該寄存器中的地址,但是會將最高兩bit的值都設(shè)置為1.
?
例如: 讀取出來的
?????? DEVICEADDR[0] = 0xD104B111
??????DEVICEADDR[1] = 0x691C89CF
根據(jù)手冊說明
所以設(shè)備地址為 89 CF D1 04 B1 11
有官方demo默認(rèn)使用靜態(tài)隨機(jī)地址,所以地址的最高 兩bit需要為1.
所以協(xié)議棧將89 改為了C9
也就是最終的 BLE地址為C9 CF D1 04 B1 11
將設(shè)備隨便燒錄一個跑協(xié)議棧的程序,對比發(fā)現(xiàn) 其地址的設(shè)置就是和上面是一樣的。
?
有興趣的可以寫個裸機(jī)程序 自己讀一下這個寄存器里的值,在和BLE的廣播地址比較下看是不是區(qū)別僅僅是最高兩bit改為了1
?
明白了協(xié)議棧如何使用默認(rèn)BLE地址后,再來看如果需要自己設(shè)置一些特定的藍(lán)牙地址應(yīng)該怎么使用sd_ble_gap_address_set? 函數(shù)來設(shè)置自己的BLE地址。
?
首先需要介紹些 BLE各種設(shè)備地址的區(qū)別。
?
BLE地址主要分為兩類:
公共地址和隨機(jī)地址。
而隨機(jī)地址細(xì)分又有 靜態(tài)隨機(jī)地址和隱私地址(Private address)
而隱私地址又分為:可解析隱私地址,不可解析隱私地址。
如圖所示:
有那么多類型的地址,那么如何區(qū)分各種地址類型的呢。
廣播通道PDU數(shù)據(jù)前面有2字節(jié)的頭 格式如下
?
其中的TxAdd表示發(fā)送方的地址類型 (0為public,1為random)
RxAdd表示接收方的地址類型。
PS:這兩個域并不是一直都有效的。比如對于普通廣播來說,只有TxAdd的指示是有效的,表示廣播發(fā)送者的第一類型。? 而對于定向廣播來說。TxAdd 和RxAdd都是有效的,TxAdd表示廣播發(fā)送者的地址類型,RxAdd表示廣播接受者的地址類型。
?
所以 對于是 public類型地址還是Random類型地址,直接通過 廣播通道PDU中的的 數(shù)據(jù)頭 中的 TxAdd或者RxAdd來判斷就可以了。
?
但是這里有個問題,只是區(qū)分出了 Random地址后,又怎么知道是靜態(tài)隨機(jī)地址,還是可解析的隱私地址,或者不可解析的隱私地址呢。
這就要了解 各種地址類型的格式。
?
?
Public地址的格式比較簡單,高24位是公司標(biāo)示,低24位公司內(nèi)部自己賦值。
靜態(tài)隨機(jī)地址的格式如下圖所示,需要滿足
1:最高2位為1
2:隨機(jī)部分不能全0或者全1
另外對于靜態(tài)隨機(jī)地址,地址的設(shè)置是在設(shè)備上電初始化時進(jìn)行的,一旦設(shè)置后本次運行過程中 自己的靜態(tài)隨機(jī)地址都不能再改變,除非重新上電。
不可解析的隱私地址格式如下圖所示:需要滿足
1:最高2位為0
2:隨機(jī)部分不能為全1或全0
?
可解析的隱私地址格式如下圖所示:需要滿足
1:最高位0次高位為1
2:隨機(jī)部分不能為全0或全1
可解析的隨機(jī)地址的生成需要使用到 IRK, 地址由兩部分組成,
hansh和prand(包含最高固定2位和22位隨機(jī)部分)。
其中? hash = ah(IRK, prand) ??ah就是產(chǎn)生隨機(jī)地址的函數(shù)。
?
既然是可解析地址,那么如何解析呢? 解析的過程也是一樣的。接收方可能存在多個IRK,接收方收到一個地址類型是 隨機(jī)地址,并且最高2位是01那么,接收方就會 用他有的IRK對接收到的地址的高24位做ah(IRK, prand)運算,得到localHash,然后將localHash和接收到地址的低24位的hash對比,如果相同則認(rèn)為這個地址 和 該IRK是相關(guān)連的。
如果不同則繼續(xù) 用下一個IRK做上面的過程,知道找到一個關(guān)聯(lián)的IRK或者一個沒找到。
?
?
總結(jié)一下,當(dāng)一方收到一個地址后,對于地址的解析過程如下:
1:首先根據(jù) 收到的廣播信道PDU中的數(shù)據(jù)頭中的指示來判斷是public類型地址還是Random類型地址。
2:如果是public那么地址類型就是確定的了,
3:如果是Random,則查看地址的最高兩位,
如果是11就是靜態(tài)隨機(jī)地址,地址類型確定
如果是00表示為不可解析隱私地址,類型確定
如果是01表示為可解析的私有地址,并執(zhí)行上面說過的ah方法,找到與該可?? 解析地址相關(guān)的IRK(可能找不到)。
?
?
最后 介紹一下 51822中怎么設(shè)置各種類型的地址。
uint32_t sd_ble_gap_address_set? (uint8_t addr_cycle_mode, const ble_gap_addr_t * p_addr )
?
addr_cycle_mode 參數(shù)為:BLE_GAP_ADDR_CYCLE_MODE_AUTO:
該模式下,會忽略第二個地址參數(shù)p_addr 中給的地址addr。協(xié)議棧內(nèi)部會自動周期性根據(jù) p_addr中addr_type指定的地址類型來 生成可解析的或者不可解析的地址。
?
addr_cycle_mode 參數(shù)為:BLE_GAP_ADDR_CYCLE_MODE_NONE:
該模式下,可以使用public地址和自己設(shè)置的 static random地址。
如果第二個參數(shù)P_addr中的addr_type為staic random類型,則addr中存放的地址的最高2位必須為1,不然這個地址會被認(rèn)為無效并自動替換,51822會自動替換為藍(lán)牙m(xù)ac地址。(跟沒有調(diào)用sd_ble_gap_address_set函數(shù)的效果是一樣的,看教程最上面的說明)
?
static random address 只有在每次 重新上電后才可改變。
可解析和不可解析的地址可在正常運行過程中周期性改變
?
其他使用該函數(shù)需要注意的地方看 sdk中該函數(shù)的說明就行了
總結(jié)
以上是生活随笔為你收集整理的BLE-NRF51822教程15-BLE地址的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE蓝牙核心数据库结构解析
- 下一篇: BLE-NRF51822教程-RSSI获