ZStack通信(Zigbee协议栈通信)

    技术2024-06-24  76

    ZStack通信-Zigbee协议栈通信

    一、注册端点二、发送数据函数三、接收数据

    一、注册端点

    应用都是建立在端点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;

    二、发送数据函数

    AF_DataRequest( afAddrType_t *dstAddr,//目标地址 endPointDesc_t *srcEP,//源端点 uint16 cID, //簇命令ID,对于接收方可以通过该命令来区分数据包 uint16 len, //发送数据的长度 uint8 *buf, //发送数据的起始地址 uint8 *transID,//事务ID, 可以是包计数器, 用于信息确认 uint8 options, //告知AF层做的一些预处理,一般为AF_DISCV_ROUTE uint8 radius //转发数据最多经过的路由深度(AF_DEFAULT_RADIUS) )

    发送消息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); }
    Processed: 0.009, SQL: 10