CSMA/CA組網算法淺談

一直在做物聯網這塊,前幾年只是寫應用層,對於組網的一些算法只能說知道,具體

的實現不是很瞭解。最近正好有個小型的物聯網項目,於是就自己寫了一套組網算法,

經過盡半年的測試,磕磕碰碰總算上線了,記錄下,也算是給自己的一個階段性總結

吧。

一、算法選擇

首先根據時間來劃分,分爲TDMA算法和CSMA/CA算法;根據有無中心節點,又可分

爲有AP網和無AP網絡;根據多跳路由算法,又可分爲集中式組網和分佈式組網。

考慮到我的網絡應用場景和數據速率,我首先選擇了基於CSMA/CA的分佈式組網方案,

減少網關的路由算法複雜度,根據最優父節點和下一跳算法來減少路由表大小和數據包

長度。CSMA/CA適合於小型的數據速率低,數據不頻繁的網絡。TDMA適合於高速的網

絡(個人理解)。

二、CSMA/CA算法理解

     CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) 即載波偵聽多路訪問/衝突避免。

採用該協議要求設備要主動避免衝突而非被動偵測的方式來解決衝突問題。避免衝突的方法主要有兩個: 
       1)監聽窗口機制,監聽到信道空閒時,並不是立即發送,而是等待一段時間再發送數據(本次討論重點)。 
       2)多主衝突,用RTS/CTS解決(不是本次討論重點);

協議的主要流程如下: 
      1)首先檢測信道是否有使用,如果檢測出信道空閒,則等待一段隨機時間後,才送出數據。 
      2) 接收端如果正確收到此幀,則經過一段時間間隔後,向發送端發送確認幀ACK。 
      3) 發送端收到ACK幀,確定數據正確傳輸,在經歷一段時間間隔後,再發送數據。


1、監聽窗口算法

數據要發送之前,首先設置一個監聽窗口,窗口期內如果收到數據則處理接收數據,同時從新獲取監聽窗口。

在監聽窗口結束時候,再次讀取芯片狀態,判定芯片是否正在解調一個數據包(也可以用RSSI值來判定),如

果正在接收,則放棄本次發送,等待接收完成再去獲取一個監聽窗口。這就是監聽窗口的作用,同時也是CSMA/CA

算法的核心思路。

實現:

1)要有一個隨機種子,可以用真隨機數發生器,也可以用AD採樣值也可以用上電不初始化的一塊RAM值當做

隨機種子,運用rand()函數獲得隨機數;

2)監聽窗口的單位爲能夠識別一個信號的最小週期,這個查看手冊都有這個指標,窗口時間=rand()*一個窗口單位時間;

3)在衝突比較嚴重時候,可以開啓兩個窗口,第一個監聽窗口長一些,第二個監聽窗口短一些;

4)以上只是解決了單向發送數據問題,如果數據是雙向的,還可以根據業務層去劃分競爭窗口的優先級;

2、應用注意點

1、在接收時候,注意過濾掉接收緩存隊列重複數據包;

2、在發送時候,過濾掉髮送緩存隊列的的重複數據包;

3、發送時候可以增加退避算法,就是如果上次發送成功,則本次發送增加退避窗口;如果上次發送失敗,則本次不增加

退避窗口;如果更加智能,則可以實時統計發送成功率,然後根據發送成功率判定是否增加退避窗口;主要是爲了解決同

一個傳感器數據連續上報成功,其它傳感器數據上不來情況;

4、增加發送失敗維護邏輯,防止射頻端死機;

5、增加接收失敗維護邏輯,防止射頻端死機;

6、單次通信失敗,不能作爲從新組網依據,否則在多個傳感器時候,會有大量的上線/掉線情況;要做冗餘設計;

7、如果發送間隔設置很短,可以去掉ACK機制;如果間隔時間長,增加ACK機制(程序可以根據設定間隔,自動改變)。

3、SX1278

1、測試發現,在信號良好情況下,一次通信成功率大概在97~99%;

2、測試發現0x18寄存器提示正在解調數據,但是有8%左右的概率是誤收,並不能解調出數據;

3、監測RSSI發現,會偶爾出現一個很小的值,官方解釋是把干擾當做信號解調了;

4、監測發現,不同的頻點,在距離近的時候,能夠收到數據;

5、如果射頻前端打靜電,則RF不能收也不能發,但是SPI可以抄讀寄存器,讀取RSSI值是一個很小的定值;只能復位芯片

    才能恢復。

 

 

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