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