BLE-NRF51822教程-RSSI获取
當(dāng)手機(jī)和設(shè)備連接上后,設(shè)備端可以通過獲取RSSI來 在一定程度上判斷手機(jī)離設(shè)備的相對(duì)距離的遠(yuǎn)近。
?
獲取函數(shù)很簡單直接調(diào)用sd_ble_gap_rssi_get 接口函數(shù)就行了,傳入連接句柄和buff就能獲取到 最近一次連接事件中的 接收信號(hào)強(qiáng)度。
?
調(diào)用該函數(shù)之前需要先調(diào)用sd_ble_gap_rssi_start ?函數(shù),該函數(shù)有三個(gè)參數(shù),第一個(gè)為連接句柄,第二個(gè)為 改變閾值, 第三個(gè)為忽略次數(shù)。
?
該函數(shù)有兩種用法, 一種就是 將閾值參數(shù)設(shè)置為BLE_GAP_RSSI_THRESHOLD_INVALID, 忽略次數(shù)參數(shù)設(shè)置為0。那么每次直接調(diào)用sd_ble_gap_rssi_get 函數(shù)獲取最近一次連接事件中的RSSI值就行了。
如下圖所示
?
另一種使用方式是, 設(shè)置第二個(gè)參數(shù)為一個(gè)有效的域值, 當(dāng)rssi與上一次收到的rssi差值大于等于這個(gè)閾值時(shí)就會(huì)?BLE_GAP_EVT_RSSI_CHANGED 事件,同時(shí)也可設(shè)置第三個(gè)閾值來防抖動(dòng),即忽略次數(shù),比如設(shè)置 閾值為5,忽略次數(shù)為3。如果前一次收到的rssi 為1 ,那么只有rssi差值大于等于5超過 三次,第四次才會(huì)產(chǎn)生BLE_GAP_EVT_RSSI_CHANGED 事件
如圖所示
?
?
下面實(shí)際用代碼來實(shí)現(xiàn)兩種方式。
?
第一種不使用閾值和事件的簡單方式: 即直接啟動(dòng),然后調(diào)用函數(shù)主動(dòng)獲取。
?
我們?cè)O(shè)置一個(gè)定時(shí)器,在設(shè)備連接上后,啟動(dòng)定時(shí)器開始周期獲取RSSI.
在main 函數(shù)中 創(chuàng)建一個(gè)定時(shí)器
?????? app_timer_create(&rssi_timer, APP_TIMER_MODE_REPEATED, rssi_timeout_handler);
?
定時(shí)處理函數(shù)很簡單,就是 獲取RSSI
void rssi_timeout_handler(void *p_context){
?????? int8_t rssi;
?????? sd_ble_gap_rssi_get(m_conn_handle, &rssi);
?????? printf("rssi: %d\r\n",rssi);
}
?
然后在連接事件產(chǎn)生的地方添加 sd_ble_gap_rssi_start 并且啟動(dòng) 上面創(chuàng)建的定時(shí)器。
如下圖所示
?
運(yùn)行程序,當(dāng)手機(jī)連接上設(shè)備后,就能看到串口周期打印RSSI值了,手機(jī)變動(dòng)距離可以看到RSSI值的變化。
?
第二種方式: 使用閾值和事件方式
?
在on_ble_evt 事件處理函數(shù)中,添加當(dāng)收到連接事件后rssi 測(cè)量啟動(dòng)代碼,和BLE_GAP_EVT_RSSI_CHANGED事件處理代碼
代碼中我們定義rssi變化值大于5時(shí)才產(chǎn)生BLE_GAP_EVT_RSSI_CHANGED事件,然后在事件處理中打印rssi值
如下圖所示:
?
運(yùn)行程序查看輸出打印可以發(fā)現(xiàn) RSSI的差值都是大于等于5的
總結(jié)
以上是生活随笔為你收集整理的BLE-NRF51822教程-RSSI获取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE-NRF51822教程15-BLE
- 下一篇: BLE-NRF51822-实现简单扫描器