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