SampleApp_SPI_SendData_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_SPI_SendData_DstAddr.addr.shortAddr = 0xFFFF; }
else//其它设备类型则用单播 {
SampleApp_SPI_SendData_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; SampleApp_SPI_SendData_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_SPI_SendData_DstAddr.addr.shortAddr = 0x0000; }
if ( AF_DataRequest ( &SampleApp_SPI_SendData_DstAddr,
(endPointDesc_t *)&SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID, len, buf,
&SampleApp_TransID, 0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {
osal_mem_free( rbuf ); //必须释放内存,不然造成溢出! } else {
osal_mem_free( rbuf ); //必须释放内存,不然造成溢出! } }
在函数SampleApp_SPI_SendData()中根据设备的类型确定了地址为广播地址还是单播地址,因为我们现在梳理的是协调器到路由器的数据流程,所示devStartMode == MODE_HARD,即将地址设置为广播地址,串口数据被以广播的形式发送到网络中的所有设备。
4、数据的接收
当协调器的串口接收到数据后将信息以广播的形式发送到网络中所有设备,网络中的路由器接收到来自空中的信息时会触发事件AF_INCOMING_MSG_CMD,具体程序如下。
程序代码
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) {
if ( events & SYS_EVENT_MSG )//判断任务(一个任务可以有多个事件) {
while ( MSGpkt )//对比事件 {
switch ( MSGpkt->hdr.event ) {
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt ); break;
6
……
}
当触发事件AF_INCOMING_MSG_CMD时,协议中中调用了函数SampleApp_MessageMSGCB()对来自空中的信息包进行进一步的处理。
5、数据处理函数SampleApp_MessageMSGCB()
当路由器接收到来自协调器空中的信息后,触发事件AF_INCOMING_MSG_CMD并调用了函数SampleApp_MessageMSGCB()对其处理,函数SampleApp_MessageMSGCB()具体代码如下。
程序代码
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) {
switch ( pkt->clusterId ) {
uint8 *pointer1;
case SAMPLEAPP_PERIODIC_CLUSTERID: break;
case SAMPLEAPP_FLASH_CLUSTERID:
pointer1=&pkt->cmd.Data[1]; //接收数据指针,指向数据
HalUARTWrite(0,pointer1,pkt->cmd.Data[0]);//cmd.Data[0]是数据的大小 break; } }
7