無線接收信號強度(RSSI)那些事兒

本文所述的原理適用於所有無線傳輸技術,只是用藍牙來舉例。應該說,嵌入式企鵝圈更加偏重於嵌入式和物聯網、安卓技術原理方面的知識分享和傳播,其次纔是實踐,儘管很多開發者都很浮躁地希望能夠立刻獲得例程源碼。本人一直都認爲,只有通曉理論,才能把實踐做得更好,才能成爲真正的專家級工程師,否則就永遠都是碼農一枚。

一、應用

無線接收信號強度(RSSI)在距離測算方面的應用中需要用到。咱們不說室內定位了,換個例子:學生考勤,由於獲取的RSSI只有絕對值,沒有方向性,所以需要在校門口的外面和裏面各裝一個AP接入點。假如是隻有一個接入點,那就不知道這個學生到底是進入學校還是離開學校。

現在有兩個接入點,那它們可能同時檢測到一個學生手環,但明顯,如果是進入學校,那當學生在校外時,校外的AP獲得的RSSI肯定會高過校內的RSSI。當學生進入校內時,校內的AP獲得的RSSI肯定會高過校外的RSSI。換一種說法,校內和校外AP獲得RSSI峯值的時間點是有先有後的。比較峯值時間即可判定是進入學校或者離開學校。

二、單位

       RSSI的單位是DBm,而不是DB。DB是輸出和輸入功率的比例值,而DBm確是一個絕對值。

dbm是一個表示功率絕對值的單位,他的計算公式爲10lg(功率值/1mw)。例如如果接收到的功率爲1mw,按照dbm單位進行折算後的值應該爲10lg 1mw/1mw=0dbm。當然在實際傳輸過程中接收方是很難達到接收功率1mw的。因爲還有接收端的天線增益,所以即使接收功率是0.00001mw(即-50db)時,RF射頻的接收端也能很好地進行碼元解碼。

但是,對於某種無線接口(就是802.xx定義的規格,對於藍牙來說就是IEEE 802.15.1)來說,也是要保障接收功率在一定範圍,才能正常工作。對於無線傳感器網絡來說,低於-95db時信號是不可靠的。

從這裏,我們也可以看出,在安卓上利用BLE接口獲得的RSSI值都是負數的,是因爲它獲取的就是以dbm爲單位的。

但是,爲什麼我們從藍牙單芯片(如NRF52832,DA14580,或者TI 2541)平臺來說,我們獲得的RSSI數值確實正數的呢?

三、信號等級

       獲得正數是因爲各個藍牙廠商自己根據自身的信道和信號經驗值來給出信號等級。好比,我們手機用戶只需要知道電池電量是多個格就好了,無需知道電池電壓值。

       從這裏也可以看出,真正的RSSI信號dbm值和信號等級是廠家的自行進行映射的,而且是跟自家產品相關的,不是標準。就是說NRF52832的信號等級A和DA14580的信號等級A儘管數值一樣,但是對應的真正的dbm是可能不一樣的。

四、如何獲得RSSI

       1).一般藍牙主機在掃描到藍牙設備時,底層協議棧會給上層一個報告事件,其攜帶的參數就有一個RSSI值。例如,DA14580平臺會返回一個GAPM_ADV_REPORT_IND報告事件,其攜帶的參數是:

      

       2)當連接上設備之後,如何還想獲得RSSI的話(記住,RSSI在每次連接事件時都會發生變化的),就必須想數據鏈路層(LLC)發送查詢RSSI請求,LLC就會啓動接收功率積分電路(物理層的事),當電路工作完成並準備好數據後再給上層一個完成事件,通過攜帶的參數即可獲得RSSI。例如,DA14580平臺的請求命令是:LLC_RD_RSSI_CMD,而返回的事件是LLC_RD_RSSI_CMP_EVT,攜帶的參數是:

       structllc_rd_rssi_cmd_complete

{

    ///Status for command reception

    uint8_t status;

    ///Connection handle

    uint16_t conhdl;

    ///RSSI value

    uint8_t rssi;

};

RSSI對於上層的開發知識就這麼多,如果你想繼續研究發篇高水平的論文也是可以的,那就進入MAC(媒體接入控制)和數據鏈路層去研究吧,例如根據RSSI的變化來調整發射功率,來達到節省功耗的目的。

嗯,其實嵌入式企鵝圈一位博士成員就研究過這個的,哈哈。沒說錯,是博士!

關注微信公衆號:嵌入式企鵝圈,獲得上百篇物聯網原創技術分享!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章