任务描述
终端和路由往协调器发送数据,协调器的短地址为0x0000,端点为20。
终端和路由操作过程
1、用户任务事件初始化
串口初始化
MT_UartInit();
MT_UartRegisterTaskID(task_id);
点播:端点参数配置
SampleApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//传输模式:点播传输
SampleApp_P2P_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;//端点
SampleApp_P2P_DstAddr.addr.shortAddr = 0x0000; //协调器地址,发送给协调器
其他源描述符不变,向AF层登记描述符,登记所有按键事件,把组添加到APS层中,初始化完成。
2、首先启动周期定时器任务,周期执行SampleApp_P2P_Message(); //点播发送函数
由于协调器只是接受,故不需要周期性任务事件。
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
//if ( (SampleApp_NwkState == DEV_ZB_COORD)//实验中协调器只接收数据所以取消发送事件
if ( (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx(SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);
}
周期性任务事件处理,点播发送函数。
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// SampleApp_SendPeriodicMessage();
//SampleApp_SendFlashMessage(0);
SampleApp_P2P_Message(); //点播
// Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
// return unprocessed events 返回未处理的事件
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
void SampleApp_P2P_Message(void)
{
#if 1
byte dat[8]=" Router";
#else
byte dat[8]="edPoint";
#endif
HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
if(AF_DataRequest(&SampleApp_P2P_DstAddr, //发送目的地址+端点地址(端点号)+传送模式:目的端
&SampleApp_epDesc, //终端描述,源EP :源端
SAMPLEAPP_P2P_CLUSTERID, //被Profile指定的有效集群号
7, //发送的数据长度
dat, //发送的数据缓冲区
&SampleApp_TransID, //任务ID
AF_DISCV_ROUTE, //有效位掩码的发送选项
AF_DEFAULT_RADIUS)==afStatus_SUCCESS)//传送跳数,通常设置AF_DEFAULT_RADIUS
{
}
else
{
//Error occurred in request to send
}
}
这样就完成了终端和路由周期性向协调器节点发送数据。
协调器接收数据过程
1、系统消息事件SYS_EVENT_MSG的接收数据事件AF_INCOMING_MSG_CMD,执行SampleApp_MessageMSGCB()函数。
2、该函数的点对点集群ID是SAMPLEAPP_P2P_CLUSTERID,执行接收代码,并上传到PC串口助手上。
注:由于此段代码未加限制,如果终端和路由接收到发送到该集群ID的消息,那么终端和路由也会上传数据到PC串口助手上。
case SAMPLEAPP_P2P_CLUSTERID: //收到点对点数据
osal_memset(buf, 0 , 32);
osal_memcpy(buf, pkt->cmd.Data, 7);
HalUARTWrite(0,buf,7);
HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
pbuf[0] = '\r';
pbuf[1] = '\n';
HalUARTWrite(0,pbuf,2);
HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);
break;
总结
实验结果可知,该点播实验只有协调器接收到数据并上传了数据,其他终端、路由并未有接收到数据。由此可知,点播发送数据时,只与目的地址和点播传输方式有关,且使用的是短地址。同一网络下其他短地址接收不到发送节点发送的消息。