应用都是建立在端点ZDO(Zigbee Device Object)之上的, 所以要实现通信首先要定义并注册一个端点。注册过程就是向端点应用链表epList增加一个节点。 注册函数:
afRegister( endPointDesc_t *epDesc );终端描述类型:
typedef struct { uint8 endPoint;//端点号1-240 uint8 *task_id; //当前任务ID SimpleDescriptionFormat_t *simpleDesc;//端点简单描述符 afNetworkLatencyReq_t latencyReq;//网络延迟信标设置, 一般默认参数noLatencyReqs } endPointDesc_t;端点的简单描述信息:
typedef struct { uint8 EndPoint;//端点号1-240 uint16 AppProfId;//profile应用规范ID,表示应用领域比如建筑、 农业、 家居等 uint16 AppDeviceId;//应用设备ID uint8 AppDevVer:4;//应用设备版本号 uint8 Reserved:4; //保留 uint8 AppNumInClusters;//输入簇命令个数,如打开、 关闭、 停止等操作命令 cId_t *pAppInClusterList;//输入簇命令ID列表 uint8 AppNumOutClusters;//输出簇命令个数 cId_t *pAppOutClusterList;//输出簇命令ID列表 } SimpleDescriptionFormat_t;发送消息demo:按键按下,发送点播消息
if(events & DEMO_KEYBOARD_2) { debug("AMOS-key_down\n"); //发送点播消息 AF_DataRequest( &dstAddr, &myAddr, 0x0001, //簇ID,随便填的16位 strlen("i am msg"), "i am msg", &task_id, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); events = events^DEMO_KEYBOARD_2; }1.封装所有接收到的信息到给定的消息报结构体,并通过消息(event)上报给应用层任务处理。上层任务被触发后会不断接收并处理消息,判断消息类型,并处理接收到的消息中的数据包。 afIncomingMSGPacket_t*MSGpkt; osal_msg_receive(task_ID); MSGpkt->hdr.event 无线消息类型结构体:
typedef struct { union{ uint16 shortAddr;//短地址 ZLongAddr_t extAddr;//长地址 } addr; afAddrMode_t addrMode;//地址模式 uint8 endPoint;//端点号1-240 uint16 panId; //网络ID } afAddrType_t;通信模式结构体:
typedef enum{ afAddrNotPresent,//绑定 afAddr16Bit,//短地址 afAddr64Bit,//长地址 afAddrGroup,//组播 afAddrBroadcast//广播 } afAddrMode_t;接受消息并处理demo:
else if(events & SYS_EVENT_MSG) { //获取系统消息 afIncomingMSGPacket_t *MSGpkt = NULL; MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( task_id ); while(MSGpkt) { //判断系统消息 具体是 无线消息、串口消息 switch(MSGpkt->hdr.event) { case AF_INCOMING_MSG_CMD://无线消息 //分析无线数据 uint8 data[30]; osal_memcpy(data,MSGpkt->cmd.Data,MSGpkt->cmd.DataLength); data[MSGpkt->cmd.DataLength] = 0;//变成一个字符串 debug("recv:%s\n",data); break; } osal_msg_deallocate( (uint8 *)MSGpkt ); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(my_TaskID); }