//串口發送接收流程 main: //主函數 ->osal_init_system(); //操作系統初始化 ->osalInitTasks(); //任務初始化 -->ZDApp_Init(taskID++); //該函數初始化后,協調器建立網絡、終端將加入網絡 -->ZDOInitDevice(0); //設備初始化 -->ZDAPP_NetworkInit(extendedDelay); //網絡初始化 -->osal_start_timeEx(....,ZDO_NETWORK_INIT,..) //發送消息 -->ZDApp_event_loop() //事件 -->ZDO_StartDevice((uint8)ZDO_Config.............) //開始設備 -->NLME_NetworkDiscoveryRequest() 建立網絡 -->ZDO_NetworkFormationConfirmCB() //給予ZDO層發聵信息 -->osal_set_event(..,ZDO_NETWORK_START)啟動網絡事件 協調器 -->ZDApp_NetworkStartEvt(); //處理網絡啟動事件 -->osal_set_event(....,ZDO_STATE_CHANGE_EVT); //設置網絡狀態改變事件 -->ZDAPP_event_loop(); //網絡改變事件函數 -->ZDApp_SendMsg(....,ZDO_NWK_DISC_CNF,...); //終端、路由器, -->ZDApp_ProcessOSALMsg() //請求加入 -->ZDO_JoinConfirmCB() //終端設備加入網絡 -->ZDApp_SendMsg(...,ZDO_NWK_JOIN_IND,..); 將ZDO_NWK_JOIN_IND事件發生給ZDO層 -->ZDApp_ProcessOSALMsg() -->ZDApp_ProcessNetworkJoin(); //設備加入網絡 -->osal_set_event(...,ZDO_STATE_CHANGE_EVT); //終端設備 -->NLME_StartRouteRequest(0,0,false); //路由器 -->osal_set_event(...,ZDO_ROUTER_START); ->osal_start_system(); //此時開始執行操作系統,不斷檢測操作系統是否有事件發生,有則跳去執行 zigbee中afIncomingMSGPacket_t結構體描述的是什么? typedef struct { osal_event_hdr_t hdr; /* OSAL Message header *///OSAL消息頭 uint16 groupId; /* Message's group ID - 0 if not set *///消息組ID uint16 clusterId; /* Message's cluster ID *///消息族ID afAddrType_t srcAddr; /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP, it's an InterPAN message *///源地址類型 uint16 macDestAddr; /* MAC header destination short address *///MAC物理地址 uint8 endPoint; /* destination endpoint */ //目的端點 uint8 wasBroadcast; /* TRUE if network destination was a broadcast address *///廣播地址 uint8 LinkQuality; /* The link quality of the received data frame */ //接收數據幀的鏈路質量 uint8 correlation; /* The raw correlation value of the received data frame *///接收數據幀的未加工相關值。 int8 rssi; /* The received RF power in units dBm *///接收的射頻功率。 uint8 SecurityUse; /* deprecated *///棄用 uint32 timestamp; /* receipt timestamp from MAC *///收到時間標記。 afMSGCommandFormat_t cmd; /* Application Data */應用程序數據 } afIncomingMSGPacket_t; //無線數據包格式結構體 typedef struct { uint8 event; uint8 status; } osal_event_hdr_t; // Generalized MSG Command Format typedef struct { uint8 TransSeqNumber; uint16 DataLength; // Number of bytes in TransData uint8 *Data; } afMSGCommandFormat_t; HalLedBlink(HAL_LED_1, 0, 50, 500); //0是閃爍次數,但是0表示的是一直閃,不是不閃,50是百分之五十,就是亮滅各一半。500是周期,就是0.5s。 建立網絡、加入網絡流程分析 協調器節點:在1-10 實驗8 網絡通信實驗2 組播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO_STATE_CHANGE: //建立網絡后,設置事件 GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//??????? if(GenericApp_NwkState==DEV_ZB_COORD)//把該節點已初始化為協調器,則執行下面的 { HalLedBlink(HAL_LED_2,0,50,500); //LED2 閃爍 aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group); //建立網路后,加入組。 osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000); } 路由器節點: 在1-10 實驗8 網絡通信實驗2 組播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO_STATE_CHANGE: //加入網絡后,加入族中 GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型 if(GenericApp_NwkState==DEV_ROUTER) { aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group); //加入組中 } break; 終端節點:1-5 實驗4 串口通信2 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO_STATE_CHANGE: GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型 if(GenericApp_NwkState==DEV_END_DEVICE) { //當中斷節點加入網絡后使用osal_set_envent()函數設置SEND_DATA_EVENT事件,當事件發生時,執行事件處理函數 osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//?????????????????????????? } break; 而上面的 GenericApp_NwkState是devStates_t GenericApp_NwkState;這樣定義的,用於//保存節點狀態 [cpp] view plain copy typedef enum { DEV_HOLD, // Initialized - not started automatically DEV_INIT, // Initialized - not connected to anything DEV_NWK_DISC, // Discovering PAN's to join DEV_NWK_JOINING, // Joining a PAN DEV_NWK_REJOIN, // ReJoining a PAN, only for end devices DEV_END_DEVICE_UNAUTH, // Joined but not yet authenticated by trust center DEV_END_DEVICE, // Started as device after authentication DEV_ROUTER, // Device joined, authenticated and is a router DEV_COORD_STARTING, // Started as Zigbee Coordinator DEV_ZB_COORD, // Started as Zigbee Coordinator DEV_NWK_ORPHAN // Device has lost information about its parent.. } devStates_t; 剛開始時,都是在GenericApp_Init()函數中將GenericApp_NwkState=DEV_INIT。然后再通過哪幾步轉到為上面三種情況DEV_ZB_COORD、DEV_ROUTER、DEV_END_DEVICE中的一種。 TI協議棧是半開源的,網絡層代碼並不開源。運行於端口0的ZDO負責應用層用戶程序和網絡層之間的通信。 網絡層的建立過程是由ZDO來實現的。網絡建立后應用層會接受到ZDO_STATE_CHANGE消息。使用下面語句就可以讀取當前網絡的狀態。 GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型