zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)
一.ZigBee 協議棧簡介
有問題發送郵件至468078841@qq.com
什么是ZigBee 協議棧呢?它和ZigBee 協議有什么關系呢?協議是一系列的通信標準,通信雙方需要共同按照這一標準進行正常的數據發射和接收。協議棧是協議的具體實現形式,通俗點來理解就是協議棧是協議和用戶之間的一個接口,開發人員通過使用協議棧來使用個協議的,進而實現無線數據收發。
ZigBee 的協議分為兩部分,IEEE 802.15.4 定義了PHY(物理層)和MAC(介質訪問層)技術規范;ZigBee 聯盟定義了NWK(網絡層)、APS(應用程序支持子層)、APL(應用層)技術規范。ZigBee 協議棧就是將各個層定義的協議都集合在一直,以函數的形式實現,并給用戶提供API(應用層),用戶可以直接調用。
Z-Stack協議棧體系結構二.如何使用ZigBee 協議棧
協議棧是協議的實現,可以理解為代碼,函數庫,供上層應用調用,協議較底下的層與應用是相互獨立的。你需要關心的就是你的應用邏輯,數據從哪里到哪里,怎么存儲,處理;還有系統里的設備之間的通信順序什么的.至于初始化等等工作不需要我們考慮。我們只需要調用相關的API函數就可以了。
三.了解zigbee協議棧的應用文件夾
安裝好zigbee協議棧,打開目錄Texas Instruments
(一)Components:顧名思義這個是放我們的庫的文件夾,里面放了一些我們用到的ZDO,driver,hal,zcl 等庫的代碼
(二)Documents:這里放的是TI 的開發文檔的,里面很多都是講述協議棧的API
(三)Projects:這個文件夾放的是TI 協議棧的例子程序。
(四)Tools:這個文件夾是放TI 的例子程序的一些上位機之類的程序,作為工具使用。
接下來介紹的東西均需要打開示例工程在這里我們打開\ZStack-CC25302.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB進入zigbee的協議棧中
為了確保程序沒問題我們在這里重新編譯一下協議棧。
這是我們協議棧的匯總目錄
這里是我們zigbee的文件夾,里面寫好的代碼都分為很多的group
(一)APP:應用層目錄,這里用戶可以創建不同的工程目錄,這里包含項目工程主要內容
(二)HAL:硬件層目錄,包含有與硬件相關的配置和驅動及操作函數。
(三)MAC: MAC 層目錄,包含了MAC 層的參數配置文件及其MAC 的LIB 庫的函數接口文件。
(四)MT:實現通過串口可控各層,于各層進行直接交互。
(五)NWK:網絡層目錄,含網絡層配置參數文件及網絡層庫的函數接口文件,APS 層庫的函數接口
(六)OSAL:協議棧的操作系統。
(七)Profile: AF層目錄,包含AF 層處理函數文件。
(八)Security:安全層目錄,安全層處理函數,比如加密函數等。
(九)Services:地址處理函數目錄,包括著地址模式的定義及地址處理函數。
(十)Tools:工程配置目錄,包括空間劃分及ZStack 相關配置信息。
(十一)ZDO: ZDO目錄。
(十二)ZMac: MAC 層目錄,包括MAC 層參數配置及MAC 層LIB 庫函數回調處理函數。
(十三)Output:輸出文件目錄,這個EW8051 IDE 自動生成的。
點擊DemoEB可以進行設備類型工作空間選擇,必須要選好,不然不可以使用。
CoordinatorEB:為協調器的工作空間。
ROuterEB:為路由器的工作空間。
EndDeviceEB:為無線終端的設備選擇。
四.zigbee協議棧的工作流程
在我們這個版本的來說在我們使用者的路徑流程是:main()---> osal_init_system()---> osalInitTasks()---> SampleApp_Init()
(一)打開ZMain.c 找到main 函數
學過C語言的都知道,C語言函數是在一直執行main文件里面的內容,首先我們先查看main.c的內容
我們接著看一下osal_start_system在這里我們可以點擊選中然后goto到函數里面查看。
接著繼續goto osal_run_system這個是任務系統輪詢的主要函數。他會查找發生的事件然后調用相應的事件執行函數, 如果沒有事件登記要發生那就將進入睡眠模式。在協議棧中,所有將要處理的內容定義為事件,這個函數就是查找事件的函數,每個事件都有自己的事件號,根據事件號大小判斷優先級,一個一個執行,例如按鍵按鍵,就觸發按鍵事件,這個現在知道就可以,在后面我們會介紹。
在這里我們知道了協議棧一直執行事件掃面函數,那我們如何根據需求開發呢,我們要做的就是設置一個自己要監測的事件,然后寫交互邏輯。 // 一個任務可以有多個事件
我們接下來進行事件的初始設置。在前面main函數中 osalInitTasks(); 為初始化系統任務,我們需要將自己的需求加入其中就可以達到目的。 goto一下進入函數 //osalInitTasks這個是設置任務的函數,然后任務里面也定義了很多事件
void osalInitTasks( void ) {uint8 taskID = 0;// 分配內存,返回指向緩沖區的指針tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);// 設置所分配的內存空間單元值為0osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));// 任務優先級由高向低依次排列,高優先級對應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為用戶創建任務,我們需要在這里進行任務的添加 現在進入函數我們查看一下SampleApp_Init( taskID ); // taskID 5 }在這里我們看一下用戶應用任務的事件處理函數進入SampleApp_ProcessEvent函數在這里我們可以看到在協議棧初始的時候定義的事件,和處理函數,在后面我們再詳細介紹如何使用。
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 );//類型轉換while ( MSGpkt ){switch ( MSGpkt->hdr.event ){// Received when a key is pressedcase KEY_CHANGE: //如果是按鍵按下進入下面這個函數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: //如果網絡狀態改變,這個絕壁進入,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釋放消息占用的內存osal_msg_deallocate( (uint8 *)MSGpkt );// Next - if one is available// 返回while ( MSGpkt )重新處理事件,直到緩沖區沒有等待處理事件為止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 事件進入這里 這里是網絡狀態改變之后標志位值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; }了解以上的流程我們就可以了解到協議棧的整體運行機制了。并且大概的概念。
下面我們介紹本節涉及zigbee協議棧的函數;
函數名:osal_start_timerEx
函數聲明uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
這是一個定時器的函數,將在timeout_value毫秒之后將任務號為taskID的任務,事件號為event_id的事件標志位置為1.這個時候就可以通過evens&進行判斷
有問題請發郵件至468078841@qq.com
zigbee協議棧串口收發 From zigbee菜鳥筆記(十 二)點擊進入
總結
以上是生活随笔為你收集整理的zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.3寸OLED 12864 sh110
- 下一篇: 用python下载ts视频