BLE-NRF51822-实现简单扫描器
在sdk目錄
XXX:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_Examples\9.0.0\ble_central? 下有官方提供的主從連接的demo.
官方的demo中實現的是主機通過名字來判斷 周圍的設備是否是自己要尋找的設備,如果是就發起來接。 并且連接建立后可以繼續保持偵聽,一共可以連接8個設備。 連接上后,從機可以通過按鍵button1 來讓主機的對應的led亮。這個例子是要在官方板pca10028上才可以看到現象的,其他的板子如果不兼容需要自己修改button和led的引腳。
?
這里就在這個 central的例子上做一個簡單的偵聽器。
?
官方demo里面的main函數很簡單如下圖所示
?
app_trace_init用來初始化打印模塊,工程默認是關閉打印宏的,所以這個函數你右擊找到的定義是空的。需要通過定義ENABLE_DEBUG_LOG_SUPPORT 來打開打印功能。
?
然后就是LED初始化,按鍵初始化(這個按鍵初始化是用來設置一個從深度睡眠中喚醒的引腳)。 協議棧初始化。
Client_handling_init初始化主要是用來注冊自己想要找到的服務。比如你注冊了服務A和對應的處理函數, 那么等主從機連接上后,并且服務發現完成后,就會判斷發現的服務中是否有你之前注冊的想要找的服務A有就會執行對應的回調處理函數。這個例子中我們沒有用到,暫時不用關心。
Device_manager_init 用來初始化設備管理了,管理綁定信息之類的,這里也不需要用到
初始化完成后,調用 scan_start就可以進行廣播了。
?
前面一部分是判斷 是否有正在處理的flash訪問操作。如果有就暫時不啟動廣播,沒有才會啟動廣播。? 如果前面真的做了flash訪問操作,并且沒有完成豈不是不能廣播了?
如果真有,廣播會在flash操作完成后進行。相關代碼如下
Flash操作完成首先會進入下面代碼
?
在判斷到flash訪問完成后,清除正在訪問flash的標志,并且調用啟動廣播函數scan_start。
scan_start最終調用如下協議棧API
| uint32_t sd_ble_gap_scan_start | ( | ble_gap_scan_params_t?const *? | p_scan_params | ) |
?
找到m_scan_param參數定義
值的意義依次為:
0,表示只偵聽廣播,不主動發起scan_req請求。
0,表示偵聽所有廣播包,不做過濾。
NULL,沒有白名單
掃描間隔,和掃描窗口。(比如1s的間隔和0.5s的窗口,那么每1s就會啟動偵聽,但是只偵聽0.5s,只會休眠。等待下一個1s到來)
0,表示沒有掃描超時,即設備會一值偵聽除非主動關閉掃描
?
啟動廣播之后,設備就會不斷偵聽其他設備的廣播。
當收到廣播數據后,協議棧會上拋一個BLE_GAP_EVT_ADV_REPORT事件給上層,所以實現一個簡單的偵聽器,我們直接在事件處理中添加一個 BLE_GAP_EVT_ADV_REPORT事件的分支,并在該分支中提取收到的廣播數據就可以了。
?
官方的例子里面已經有針對 BLE_GAP_EVT_ADV_REPORT這個事件的處理了。
?
代碼中就是從廣播數據中提取了 設備名 然后判斷是不是自己要連的那個設備。
?
我們不需要動這些代碼,直接在前面添加廣播數據的打印就可以了。如圖所示
?
打印結果如圖所示
? ? 關于adv data的數據怎么解析,參考 教程 ble廣播數據解析。
?
廣播數據結構體中還有一個scan_rsp 沒有使用
這個為是用來區分 當前的廣播數據是普通廣播數據,還是收到的掃描響應數據(掃描者發送了scan_req,如果廣播者可以響應則會回復scan_rsp)。
如果需要區分自己判斷一下就行了
總結
以上是生活随笔為你收集整理的BLE-NRF51822-实现简单扫描器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE-NRF51822教程-RSSI获
- 下一篇: nrf51822-主从通信分析1