ZIGBEE事件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(bytetask_id,UINT16events),可见调用此函数将传递两个参数,task_id任务号和events事件类号;事件处理函数首先根据事件类号来判断是何种类型事件,然后根据任务号得到消息指针pMsg,最后根据消息指针结构里的事件号pMsg-event来具体处理事件,event为8bit的常量,系统event在ZComDef.h里定义。在ZigBee协议栈中,任何通信数据都是利用帧的格式来组织的,协议栈的每一层都有特定的帧结构;AF定义了两种帧类型,键值对(KeyValuePair,KVP)和报文(Message,MSG);KVP消息主要用于传输一些较为简单的变量格式;但由于Zigbee的很多应用领域中的消息较为复杂并不适用KVP格式,因此Zigbee协议规划定义了MSG类型。MSG对数据格式不作要求,适合任何格式的数据传输,因此可以用于传送数据量大的消息。下面对系统event说明(其中AF_代表应用框架,ZDO_代表设备对象):1、AF_DATA_CONFIRM_CMD:Dataconfirmation数据收到确认;A设备发送数据,B设备收到数据后将返回应答ack给A,A收到此ack将触发AF_DATA_CONFIRM_CMD事件;F_DataRequest函数参数options如设AF_ACK_REQUEST,则要求对方设备回复ack。2、AF_INCOMING_MSG_CMD:IncomingMSGtypemessage收到报文类型的消息;A设备用AF_DataRequest函数发出报文消息,B设备收到报文消息将触发AF_INCOMING_MSG_CMD事件。3、AF_INCOMING_KVP_CMD:IncomingKVPtypemessage收到键值对类型的消息。4、AF_INCOMING_GRP_KVP_CMD:IncomingGroupKVPtypemessage收到群键值对类型的消息。5、KEY_CHANGE:KeyEvents按键触发事件。6、ZDO_NEW_DSTADDR:ZDOhasreceivedanewDstAddrforthisappZDO终端获得新地址;匹配描述符请求(MatchDescriptorRequest)响应指示(例如:自动匹配);如A设备加入绑定后,A设备触发ZDO_NEW_DSTADDR事件。7、ZDO_STATE_CHANGE:ZDOhaschangedthedevice'snetworkstateZDO网络状态改变;当A设备的网络状态改变时,A就会触发此消息,如SampleApp_NwkState=DEV_INIT也会触发(我理解,不知对不对)。8、ZDO_MATCH_DESC_RSP_SENT:ZDOmatchdescriptorresponsewassentZDO描述符匹配响应发送;A设备发送ZDP_MatchDescReq函数请求描述符匹配绑定,B设备收到后发送ZDP_MatchDescRsp函数响应,B设备发送响应函数后触发ZDO_MATCH_DESC_RSP_SENT事件。9、ZDO_CB_MSG:ZDOincomingmessagecallback收到ZDO反馈消息;A设备用函数ZDO_RegisterForZDOMsg注册了特定消息,A设备才能用ZDO_CB_MSG消息接收解析此特定消息;应用绑定例子:A设备发送绑定请求,B设备收到后发送匹配响应,A设备收到响应触发ZDO_CB_MSG事件