ZStack通信(Zigbee协议栈通信)

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);
    }

你可能感兴趣的:(物联网,物联网)