zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)
一.ZigBee 協(xié)議棧簡介
有問題發(fā)送郵件至468078841@qq.com
什么是ZigBee 協(xié)議棧呢?它和ZigBee 協(xié)議有什么關系呢?協(xié)議是一系列的通信標準,通信雙方需要共同按照這一標準進行正常的數(shù)據(jù)發(fā)射和接收。協(xié)議棧是協(xié)議的具體實現(xiàn)形式,通俗點來理解就是協(xié)議棧是協(xié)議和用戶之間的一個接口,開發(fā)人員通過使用協(xié)議棧來使用個協(xié)議的,進而實現(xiàn)無線數(shù)據(jù)收發(fā)。
ZigBee 的協(xié)議分為兩部分,IEEE 802.15.4 定義了PHY(物理層)和MAC(介質(zhì)訪問層)技術(shù)規(guī)范;ZigBee 聯(lián)盟定義了NWK(網(wǎng)絡層)、APS(應用程序支持子層)、APL(應用層)技術(shù)規(guī)范。ZigBee 協(xié)議棧就是將各個層定義的協(xié)議都集合在一直,以函數(shù)的形式實現(xiàn),并給用戶提供API(應用層),用戶可以直接調(diào)用。
Z-Stack協(xié)議棧體系結(jié)構(gòu)二.如何使用ZigBee 協(xié)議棧
協(xié)議棧是協(xié)議的實現(xiàn),可以理解為代碼,函數(shù)庫,供上層應用調(diào)用,協(xié)議較底下的層與應用是相互獨立的。你需要關心的就是你的應用邏輯,數(shù)據(jù)從哪里到哪里,怎么存儲,處理;還有系統(tǒng)里的設備之間的通信順序什么的.至于初始化等等工作不需要我們考慮。我們只需要調(diào)用相關的API函數(shù)就可以了。
三.了解zigbee協(xié)議棧的應用文件夾
安裝好zigbee協(xié)議棧,打開目錄Texas Instruments
(一)Components:顧名思義這個是放我們的庫的文件夾,里面放了一些我們用到的ZDO,driver,hal,zcl 等庫的代碼
(二)Documents:這里放的是TI 的開發(fā)文檔的,里面很多都是講述協(xié)議棧的API
(三)Projects:這個文件夾放的是TI 協(xié)議棧的例子程序。
(四)Tools:這個文件夾是放TI 的例子程序的一些上位機之類的程序,作為工具使用。
接下來介紹的東西均需要打開示例工程在這里我們打開\ZStack-CC25302.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB進入zigbee的協(xié)議棧中
為了確保程序沒問題我們在這里重新編譯一下協(xié)議棧。
這是我們協(xié)議棧的匯總目錄
這里是我們zigbee的文件夾,里面寫好的代碼都分為很多的group
(一)APP:應用層目錄,這里用戶可以創(chuàng)建不同的工程目錄,這里包含項目工程主要內(nèi)容
(二)HAL:硬件層目錄,包含有與硬件相關的配置和驅(qū)動及操作函數(shù)。
(三)MAC: MAC 層目錄,包含了MAC 層的參數(shù)配置文件及其MAC 的LIB 庫的函數(shù)接口文件。
(四)MT:實現(xiàn)通過串口可控各層,于各層進行直接交互。
(五)NWK:網(wǎng)絡層目錄,含網(wǎng)絡層配置參數(shù)文件及網(wǎng)絡層庫的函數(shù)接口文件,APS 層庫的函數(shù)接口
(六)OSAL:協(xié)議棧的操作系統(tǒng)。
(七)Profile: AF層目錄,包含AF 層處理函數(shù)文件。
(八)Security:安全層目錄,安全層處理函數(shù),比如加密函數(shù)等。
(九)Services:地址處理函數(shù)目錄,包括著地址模式的定義及地址處理函數(shù)。
(十)Tools:工程配置目錄,包括空間劃分及ZStack 相關配置信息。
(十一)ZDO: ZDO目錄。
(十二)ZMac: MAC 層目錄,包括MAC 層參數(shù)配置及MAC 層LIB 庫函數(shù)回調(diào)處理函數(shù)。
(十三)Output:輸出文件目錄,這個EW8051 IDE 自動生成的。
點擊DemoEB可以進行設備類型工作空間選擇,必須要選好,不然不可以使用。
CoordinatorEB:為協(xié)調(diào)器的工作空間。
ROuterEB:為路由器的工作空間。
EndDeviceEB:為無線終端的設備選擇。
四.zigbee協(xié)議棧的工作流程
在我們這個版本的來說在我們使用者的路徑流程是:main()---> osal_init_system()---> osalInitTasks()---> SampleApp_Init()
(一)打開ZMain.c 找到main 函數(shù)
學過C語言的都知道,C語言函數(shù)是在一直執(zhí)行main文件里面的內(nèi)容,首先我們先查看main.c的內(nèi)容
我們接著看一下osal_start_system在這里我們可以點擊選中然后goto到函數(shù)里面查看。
接著繼續(xù)goto osal_run_system這個是任務系統(tǒng)輪詢的主要函數(shù)。他會查找發(fā)生的事件然后調(diào)用相應的事件執(zhí)行函數(shù), 如果沒有事件登記要發(fā)生那就將進入睡眠模式。在協(xié)議棧中,所有將要處理的內(nèi)容定義為事件,這個函數(shù)就是查找事件的函數(shù),每個事件都有自己的事件號,根據(jù)事件號大小判斷優(yōu)先級,一個一個執(zhí)行,例如按鍵按鍵,就觸發(fā)按鍵事件,這個現(xiàn)在知道就可以,在后面我們會介紹。
在這里我們知道了協(xié)議棧一直執(zhí)行事件掃面函數(shù),那我們?nèi)绾胃鶕?jù)需求開發(fā)呢,我們要做的就是設置一個自己要監(jiān)測的事件,然后寫交互邏輯。 // 一個任務可以有多個事件
我們接下來進行事件的初始設置。在前面main函數(shù)中 osalInitTasks(); 為初始化系統(tǒng)任務,我們需要將自己的需求加入其中就可以達到目的。 goto一下進入函數(shù) //osalInitTasks這個是設置任務的函數(shù),然后任務里面也定義了很多事件
void osalInitTasks( void ) {uint8 taskID = 0;// 分配內(nèi)存,返回指向緩沖區(qū)的指針tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);// 設置所分配的內(nèi)存空間單元值為0osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));// 任務優(yōu)先級由高向低依次排列,高優(yōu)先級對應taskID 的值反而小macTaskInit( taskID++ ); // taskID 0nwk_init( taskID++ ); // taskID 1Hal_Init( taskID++ ); //taskID 2 #if defined( MT_TASK )MT_TaskInit( taskID++ ); #endifAPS_Init( taskID++ ); //taskID 3 #if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ ); #endifZDApp_Init( taskID++ ); //taskID 4 #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init( taskID++ ); #endif//SampleApp_Init為用戶創(chuàng)建任務,我們需要在這里進行任務的添加 現(xiàn)在進入函數(shù)我們查看一下SampleApp_Init( taskID ); // taskID 5 }在這里我們看一下用戶應用任務的事件處理函數(shù)進入SampleApp_ProcessEvent函數(shù)在這里我們可以看到在協(xié)議棧初始的時候定義的事件,和處理函數(shù),在后面我們再詳細介紹如何使用。
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) {afIncomingMSGPacket_t *MSGpkt;(void)task_id; // Intentionally unreferenced parameterif ( events & SYS_EVENT_MSG )//如果是SYS_EVENT_MSG 這個事件進入這里{MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );//類型轉(zhuǎn)換while ( MSGpkt ){switch ( MSGpkt->hdr.event ){// Received when a key is pressedcase KEY_CHANGE: //如果是按鍵按下進入下面這個函數(shù)SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );break;// Received when a messages is received (OTA) for this endpointcase AF_INCOMING_MSG_CMD://如果是接受到RF消息進入這里SampleApp_MessageMSGCB( MSGpkt );break;// Received whenever the device changes state in the networkcase ZDO_STATE_CHANGE: //如果網(wǎng)絡狀態(tài)改變,這個絕壁進入,SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( (SampleApp_NwkState == DEV_ZB_COORD)|| (SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){// Start sending the periodic message in a regular interval.osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );}else{// Device is no longer in the network}break;default:break;}// Release the memory釋放消息占用的內(nèi)存osal_msg_deallocate( (uint8 *)MSGpkt );// Next - if one is available// 返回while ( MSGpkt )重新處理事件,直到緩沖區(qū)沒有等待處理事件為止MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}// return unprocessed events 返回未處理的事件return (events ^ SYS_EVENT_MSG);}// Send a message out - This event is generated by a timer// (setup in SampleApp_Init()).if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) //如果是 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件進入這里 這里是網(wǎng)絡狀態(tài)改變之后標志位值1的{// Send the periodic messageSampleApp_SendPeriodicMessage();// Setup to send message again in normal period (+ a little jitter)osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );// return unprocessed eventsreturn (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);}// Discard unknown eventsreturn 0; }了解以上的流程我們就可以了解到協(xié)議棧的整體運行機制了。并且大概的概念。
下面我們介紹本節(jié)涉及zigbee協(xié)議棧的函數(shù);
函數(shù)名:osal_start_timerEx
函數(shù)聲明uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
這是一個定時器的函數(shù),將在timeout_value毫秒之后將任務號為taskID的任務,事件號為event_id的事件標志位置為1.這個時候就可以通過evens&進行判斷
有問題請發(fā)郵件至468078841@qq.com
zigbee協(xié)議棧串口收發(fā) From zigbee菜鳥筆記(十 二)點擊進入
總結(jié)
以上是生活随笔為你收集整理的zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.3寸OLED 12864 sh110
- 下一篇: 编程电子书汇总