ZIGBEE事件有兩類。系統定義事件和使用者定義事件。
系統類事件是協議棧已定義好的。使用者類事件是我們使用者層面來定義的。
事件類號採用一個16bit的常量,使用獨熱碼編碼,獨熱碼是僅僅有一個bit為1,其它全為0的一種碼制,採用獨熱碼的長處是操作方便,能夠使用簡單的位操作指令實現,如:提取系統類事件用events & SYS_EVENT_MSG。清除系統類事件用events ^ SYS_EVENT_MSG;因為事件類號是16bit,也就是說zigbee事件類僅僅有16個。系統類事件SYS_EVENT_MSG使用0x8000,故自己定義事件類僅僅有15個。可採用0x4000至0x0001。
事件處理函式為:app_ProcessEvent( byte task_id, UINT16events ),可見呼叫此函式將傳遞兩個引數,task_id任務號和events事件類號;事件處理函式首先依據事件類號來推斷是何種型別事件。然後依據任務號得到訊息指標pMsg,最後依據訊息指標結構裡的事件號pMsg->event來詳細處理事件,event為8bit的常量,系統event在ZComDef.h裡定義。
在ZigBee協議棧中,不論什麼通訊資料都是利用幀的格式來組織的,協議棧的每一層都有特定的幀結構;AF定義了兩種幀型別,鍵值對(Key Value Pair,KVP)和報文(Message,MSG)。KVP訊息主要用於傳輸一些較為簡單的變數格式;但因為Zigbee的非常多應用領域中的訊息較為複雜並不適用KVP格式。因此Zigbee協議規劃定義了MSG型別。MSG對資料格式不作要求。適合不論什麼格式的傳輸資料。因此能夠用於傳送資料量大的訊息。
以下對系統event說明(當中AF_代表應用框架,ZDO_代表裝置物件):
1、AF_DATA_CONFIRM_CMD:Data confirmation資料收到確認;A裝置傳送資料,B裝置收到資料後將返回應答ack給A。A收到此ack將觸發AF_DATA_CONFIRM_CMD事件;F_DataRequest函式引數options如設AF_ACK_REQUEST,則要求對方裝置回覆ack。
2、AF_INCOMING_MSG_CMD:Incoming MSG type message收到報文型別的訊息;A裝置用AF_DataRequest函式發出報文訊息,B裝置收到報文訊息將觸發AF_INCOMING_MSG_CMD事件。
3、AF_INCOMING_KVP_CMD:Incoming KVP type message收到鍵值對型別的訊息。
4、AF_INCOMING_GRP_KVP_CMD:Incoming Group KVP type message收到群鍵值對型別的訊息。
5、KEY_CHANGE:Key Events按鍵觸發事件。
6、ZDO_NEW_DSTADDR:ZDO has received a new DstAddr for this app ZDO終端獲得新地址。匹配描寫敘述符請求(Match Descriptor Request)響應指示(比如:自己主動匹配)。如A裝置增加繫結後。A裝置觸發ZDO_NEW_DSTADDR事件。
7、ZDO_STATE_CHANGE:ZDO has changed the device's network state ZDO網路狀態改變;當A裝置的網路狀態改變時,A就會觸發此訊息。如SampleApp_NwkState = DEV_INIT也會觸發(我理解。不知對不正確)。
8、ZDO_MATCH_DESC_RSP_SENT:ZDO match descriptor response was sent ZDO描寫敘述符匹配響應傳送;A裝置傳送ZDP_MatchDescReq函式請求描寫敘述符匹配繫結,B裝置收到後傳送ZDP_MatchDescRsp函式響應,B裝置傳送響應函式後觸發ZDO_MATCH_DESC_RSP_SENT事件。
9、ZDO_CB_MSG:ZDO incoming message callback 收到ZDO反饋訊息;A裝置用函式ZDO_RegisterForZDOMsg註冊了特定訊息,A裝置才幹用ZDO_CB_MSG訊息接收解析此特定訊息;應用繫結樣例:A裝置傳送繫結請求,B裝置收到後傳送匹配響應,A裝置收到響應觸發ZDO_CB_MSG事件。
///////////////////////未完待續