ZigBee协议栈(一)--协议栈介绍
1、Zigbee協(xié)議棧簡(jiǎn)介
協(xié)議是一系列的通信標(biāo)準(zhǔn),通信雙方需要按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)發(fā)射和接收。協(xié)議棧是協(xié)議的具體實(shí)現(xiàn)形式,通俗講協(xié)議棧就是協(xié)議和用戶之間的一個(gè)接口,開發(fā)人員通過使用協(xié)議棧來使用這個(gè)協(xié)議,進(jìn)而實(shí)現(xiàn)無線數(shù)據(jù)收發(fā)。
如圖1所示:Zigbee協(xié)議分為兩部分,IEEE 802.15.4定義了PHY(物理層)和MAC(介質(zhì)訪問層)技術(shù)規(guī)范;Zigbee聯(lián)盟定義了NWK(網(wǎng)絡(luò)層)、APS(應(yīng)用程序支持層)、APL(應(yīng)用層)技術(shù)規(guī)范。Zigbee協(xié)議棧就是將各個(gè)層定義的協(xié)議都集合在一起,以函數(shù)的形式實(shí)現(xiàn),并給用戶提供API(應(yīng)用層),用戶可以直接調(diào)用。
圖1 ZigBee無線網(wǎng)絡(luò)協(xié)議層的架構(gòu)圖
?
2、如何理解Zigbee協(xié)議棧
協(xié)議棧是協(xié)議的實(shí)現(xiàn),可以理解為代碼,庫(kù)函數(shù),供上層應(yīng)用調(diào)用,協(xié)議較底下的層與應(yīng)用是相互獨(dú)立的。商業(yè)化的協(xié)議棧只提供你接口(其實(shí)和互聯(lián)網(wǎng)行業(yè)的API模式很像)。就像你調(diào)用地圖API時(shí)不需要關(guān)心底層地圖是怎么根據(jù)位置或坐標(biāo)繪制的,你也不用關(guān)心協(xié)議棧底層的實(shí)現(xiàn),除非你想做協(xié)議研究。每個(gè)廠家的協(xié)議棧是有區(qū)別的,比如TI的BLE協(xié)議棧和nordic的BLE協(xié)議棧就有很大的不同(多說一點(diǎn),TI的BLE協(xié)議棧更像是安卓的BLE結(jié)構(gòu),所以會(huì)安卓藍(lán)牙的人可能能看懂TI的代碼)。
?
3、如何使用Zigbee協(xié)議棧
以簡(jiǎn)單的無線數(shù)據(jù)通信為例,其一般步驟為:
① 組網(wǎng):調(diào)用協(xié)議棧組網(wǎng)函數(shù)、加入網(wǎng)絡(luò)函數(shù),實(shí)現(xiàn)網(wǎng)絡(luò)的建立和節(jié)點(diǎn)的加入
② 發(fā)送:發(fā)送節(jié)點(diǎn)調(diào)用協(xié)議棧的發(fā)送函數(shù),實(shí)現(xiàn)數(shù)據(jù)無線發(fā)送
③ 接收:接收節(jié)點(diǎn)調(diào)用協(xié)議棧的無線接收函數(shù),實(shí)現(xiàn)無線數(shù)據(jù)接收
由于協(xié)議棧都把這些函數(shù)都封裝好了,因此我們用起來比較方便。下面是協(xié)議棧無線發(fā)送函數(shù):
如果想更好的應(yīng)用協(xié)議棧就需要對(duì)協(xié)議棧提供的這些函數(shù)及其參數(shù)的具體作用和意義進(jìn)行細(xì)致的了解,這個(gè)在接下來中會(huì)詳細(xì)介紹。
?
4、安裝Zigbee協(xié)議棧
從我百度共享的所有本系列資料中下載004解壓并安裝:
圖2 ZigBee協(xié)議棧下載路徑
?
安裝好之后在win7開始按鈕下會(huì)有如下文件結(jié)構(gòu):
? ? ? ? ? ? ? ? ??圖3 ZigBee協(xié)議安裝完成后的文件結(jié)構(gòu)
其中:
?
5、基于協(xié)議棧的無線收發(fā)控制LED工程講解(一)
從網(wǎng)盤下載ZStack-2.3.1a壓縮文件:
? 圖4 工程源碼所在云盤目錄
用IAR打開..?\ZStack-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB目錄下的工程文件,注意不要把001Stack-2.5.1a放在比較深的文件夾內(nèi),否則IAR打開工程時(shí)可能一直卡打不開,也最好不要有中文!打開后工程及結(jié)構(gòu)如下:(有點(diǎn)眼花繚亂,不要緊,后面會(huì)結(jié)合源碼一步步分析)
圖5 工程整體架構(gòu)
?
6、基于協(xié)議棧的無線收發(fā)控制LED工程講解(二)
在IAR中選擇XXXXEB,第一遍要rebuild all,下載好協(xié)調(diào)器之后,再切換到EndDeviceEB編譯下載到另一個(gè)板子做終端設(shè)備:
圖6 編譯工程
?
兩個(gè)節(jié)點(diǎn)程序下載好之后上電會(huì)看到:組網(wǎng)成功后D1閃爍。
圖7 實(shí)驗(yàn)現(xiàn)象
?
7、基于協(xié)議棧的無線收發(fā)控制LED工程講解(三)
main code:
1 int main( void ) 2 { 3 osal_int_disable( INTS_ALL );// Turn off interrupts 關(guān)中斷 4 HAL_BOARD_INIT();// Initialization for board related stuff such as LEDs 5 zmain_vdd_check();// Make sure supply voltage is high enough to run 檢查芯片是否上電正常 6 InitBoard( OB_COLD );// Initialize board I/O 初始化I/O,LED,Timer等 7 HalDriverInit();// Initialze HAL drivers 初始化硬件抽象層驅(qū)動(dòng)模塊 8 osal_nv_init( NULL );// Initialize NV System 初始化flash存儲(chǔ)器 9 znpTestRF();// Initialize and check the ZNP RF Test Mode NV items. 10 ZMacInit();// Initialize the MAC 初始化MAC層 11 zmain_ext_addr();// Determine the extended address 確定IEEE64位地址 12 13 #if defined ZCL_KEY_ESTABLISH 14 zmain_cert_init();// Initialize the Certicom certificate information. 15 #endif 16 17 zgInit();// Initialize basic NV items 初始化非易失變量 18 19 #ifndef NONWK 20 afInit();// Since the AF isn't a task, call it's initialization routine 21 #endif 22 23 osal_init_system();// Initialize the operating system 初始化OS(重點(diǎn)介紹1) 24 osal_int_enable( INTS_ALL );// Allow interrupts 使能中斷 25 InitBoard( OB_READY );// Final board initialization 最終板載初始化 26 zmain_dev_info();// Display information about this device 顯示設(shè)備信息(這里有LCD屏幕) 27 28 #ifdef LCD_SUPPORTED/* Display the device info on the LCD 將信息顯示在LCD上*/ 29 zmain_lcd_init(); 30 #endif 31 32 #ifdef WDT_IN_PM1 33 WatchDogEnable( WDTIMX );/* If WDT is used, this is a good place to enable it. */ 34 #endif 35 36 osal_start_znp(); // No Return from here 執(zhí)行操作系統(tǒng)(重點(diǎn)介紹2) 37 38 return 0; // Shouldn't get here. 39 } // main()代碼有點(diǎn)難懂,核心是執(zhí)行初始化工作,包括硬件抽象層、網(wǎng)絡(luò)層、任務(wù)等。然后執(zhí)行osal_start_znp() ,進(jìn)入一個(gè)死循環(huán),不斷對(duì)任務(wù)進(jìn)行遍歷執(zhí)行。這里我們需要重點(diǎn)了解兩個(gè)函數(shù):
?
?
① 操作系統(tǒng)初始化函數(shù)
在操作系統(tǒng)初始化中需重點(diǎn)關(guān)注的是操作系統(tǒng)任務(wù)初始化osalInitTasks函數(shù),操作系統(tǒng)初始化函數(shù)中主要來創(chuàng)建任務(wù),taskID是任務(wù)ID,每增加一個(gè)任務(wù)ID++,同時(shí)ID越小表示該任務(wù)優(yōu)先級(jí)越高!其中藍(lán)框內(nèi)的函數(shù)是要根據(jù)系統(tǒng)想完成的任務(wù)做修改的地方,其他都是官方提供的基本不用變的任務(wù)。
?
② 操作系統(tǒng)啟動(dòng)函數(shù)
?
執(zhí)行OS的函數(shù)就是個(gè)大循環(huán),不斷取出當(dāng)前優(yōu)先級(jí)最高的待處理事件進(jìn)行處理,處理的核心思想在osal_run_task函數(shù)內(nèi):通過調(diào)用一個(gè)函數(shù)指針來遠(yuǎn)程調(diào)用一個(gè)事件處理函數(shù)!
?
8、小結(jié)
至此,我們講到任務(wù)如何建立、如何處理等,其中有一個(gè)環(huán)節(jié)沒有講——如何從events=(tasksArr[idx])(idx,event)關(guān)聯(lián)到每個(gè)具體任務(wù)的事件處理函數(shù)的?這個(gè)其實(shí)我在CC2540/CC2541的前兩篇中已有詳細(xì)介紹:[接下來會(huì)針對(duì)具體通信梳理流程!]
1、CC2541藍(lán)牙4.0芯片中級(jí)教程——基于OSAL操作系統(tǒng)的運(yùn)行流程了解+定時(shí)器和串口例程了解
2、CC2541芯片中級(jí)教程-OSAL操作系統(tǒng)(進(jìn)一步了解-OLED && 普通按鍵和5方向按鍵-中斷!!!)這個(gè)系統(tǒng)驅(qū)動(dòng)層和應(yīng)用層不一樣~
3、CC2541芯片中級(jí)教程-OSAL操作系統(tǒng)(ADC光敏電阻和修改串口波特率)
4、CC2541芯片中級(jí)教程-OSAL操作系統(tǒng)(簡(jiǎn)單AT指令實(shí)現(xiàn)+IIC軟件和硬件實(shí)現(xiàn)驅(qū)動(dòng)MPU6050)
5、CC2541芯片中級(jí)教程-OSAL操作系統(tǒng)(PWM+看門狗)
?
?
總結(jié)
以上是生活随笔為你收集整理的ZigBee协议栈(一)--协议栈介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机多媒体技术广泛应用于各个领域,新时
- 下一篇: 【多媒体技术】多媒体技术期末复习题