CSMA協(xié)議原理 Contiki協(xié)議棧的設(shè)計
ConTIki由幾個獨立的模塊組成,是一個開放源碼、多任務(wù)事件驅(qū)動的嵌入式網(wǎng)絡(luò)專用操作系統(tǒng),微輕量級的控制器,無線傳感網(wǎng)絡(luò)協(xié)議棧Rime。整個應(yīng)用包括kernel、libraries、user code,對于一些周期性的操作或者網(wǎng)絡(luò)協(xié)議很有幫助。
一.協(xié)議棧總體框架ConTIki系統(tǒng)為了支持多種硬件平臺和軟件協(xié)議設(shè)計了如圖1.1所示的層次框架,通過conTIki-conf.h的宏定義用戶可以靈活地選擇協(xié)議類型,如:
#define NETSTACK_CONF_NETWORK rime_driver
#define NETSTACK_CONF_MAC csma _driver
#define NETSTACK_CONF_RDC cxmac_driver
#define NETSTACK_CONF_RADIO sx1278_radio_driver
#define NETSTACK_CONF_FRAMER framer_nullmac
圖1.1協(xié)議棧層次
ConTIki V2.7支持的各層次協(xié)議類別如圖1.2所示,其中NETSTACK_MAC是一個概念層次,真正處理MAC邏輯是由NETSTACK_RDC(Radio Duty Cycling)完成的;而NETSTACK_RADIO層支持的射頻驅(qū)動,用戶可以自由擴展。
圖1.2 Contiki V2.7支持的協(xié)議類型
二.收發(fā)Radio Packet的調(diào)用與時序1. 接收Radio Packet
圖2.1顯示了接收Radio Packet的調(diào)用邏輯與時序,當射頻硬件接收到數(shù)據(jù)包時ISR通知rf_process,rf_process自底向頂調(diào)用:RDC-》MAC-》NETWORK協(xié)議棧的接收函數(shù),最后將數(shù)據(jù)包提交給應(yīng)用程序綁定的進程。
圖2.1接收Radio Packet
2. 發(fā)送Radio Packet
如圖2.2所舉例,process_i需要發(fā)送abc(Anonymous best-effort local area Broad Cast)數(shù)據(jù)包,進程自頂向底調(diào)用:MAC-》RDC-》RADIO協(xié)議棧的發(fā)送函數(shù),最后通過射頻硬件以無線電方式傳輸。
圖2.2發(fā)送Radio Packet
三.CSMA(Carrier Sense Multiple Access)協(xié)議原理CSMA協(xié)議提供相對可靠的MAC層傳輸,每次調(diào)用RDC層發(fā)送數(shù)據(jù)包后,它根據(jù)反饋信息判斷是否需要緩存并重傳該數(shù)據(jù)包。
CSMA的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)如圖3.1所示,struct neighbor_queue根據(jù)不同的接收地址緩存數(shù)據(jù)包;struct rdc_buf_list將同一個接收地址的不同PACKETBUF_ATTR_MAC_SEQNO的數(shù)據(jù)包進行鏈接;struct queuebuf保存需要重傳的數(shù)據(jù)包頭和數(shù)據(jù)實體;struct qbuf_metadata存儲回調(diào)函數(shù)指針等信息。
圖3.1 csma關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
CSMA根據(jù)RDC層發(fā)送數(shù)據(jù)包的反饋信息選擇相應(yīng)邏輯動作:
MAC_TX_OK:發(fā)送成功,回收緩存數(shù)據(jù)結(jié)構(gòu)和善后工作;
MAC_TX_NOACK:啟動ctimer,隨機延時后重傳,直到發(fā)送次數(shù)超過MAX;
MAC_TX_COLLISION:繼續(xù)重傳,且發(fā)送次數(shù)不受限。
一個CSMA的典型時序如圖3.2所示,當RDC層發(fā)送完數(shù)據(jù)包后,CSMA的回調(diào)函數(shù)packet_sent()根據(jù)發(fā)送結(jié)果選擇動作(見上面邏輯描述),如果需要重傳則根據(jù)重傳次數(shù)選擇一個隨機時間設(shè)置ctimer,當ctimer定時器超時后再次發(fā)送該緩存的數(shù)據(jù)包。
圖3.2 csma邏輯與時序