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

  本文由嵌入式企鵝圈原創團隊成員黃鑫供稿。微信

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

1、應用ui

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

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

2、單位接口

       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時信號是不可靠的。cmd

  從這裏,咱們也能夠看出,在安卓上利用BLE接口得到的RSSI值都是負數的,是由於它獲取的就是以dbm爲單位的。源碼

  可是,爲何咱們從藍牙單芯片(如NRF52832,DA14580,或者TI 2541)平臺來講,咱們得到的RSSI數值確實正數的呢?

3、信號等級

       得到正數是由於各個藍牙廠商本身根據自身的信道和信號經驗值來給出信號等級。比如,咱們手機用戶只須要知道電池電量是多個格就行了,無需知道電池電壓值。

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

4、如何得到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,攜帶的參數是:

       struct llc_rd_rssi_cmd_complete

{

    ///Status for command reception

    uint8_t status;

    ///Connection handle

    uint16_t conhdl;

    ///RSSI value

    uint8_t rssi;

};

  RSSI對於上層的開發知識就這麼多,若是你想繼續研究發篇高水平的論文也是能夠的,例如根據RSSI的變化來調整發射功率,來達到節省功耗的目的。

          歡迎掃碼關注微信公衆號:嵌入式企鵝圈,獲取上百篇物聯網原創技術分享,資深工程師力做

相關文章
相關標籤/搜索