前面说过SampleApp_Init和SampleApp_ProcessEvent是我们重点关注的函数,接下来分析无线发送和接收相关的代码:
在SampleApp_ProcessEvent函数中:
if ( events & SYS_EVENT_MSG )
{
// A message is waiting event 接收
}
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send a message out 发送
}
接收(端点)
if ( events & SYS_EVENT_MSG )
{
// A message is waiting event 接收
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
switch ( MSGpkt->hdr.event )
{
case KEY_CHANGE: // 接收到按键按下消息
case AF_INCOMING_MSG_CMD: // 端点收到信息
case ZDO_STATE_CHANGE: // zigbee网络发生变化, 比如新设备加入
}
}
其中
case AF_INCOMING_MSG_CMD: // 端点收到信息
SampleApp_MessageMSGCB( MSGpkt ); // 处理
break;
看SampleApp_MessageMSGCB
SampleApp_MessageMSGCB
{
switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID:
break;
case SAMPLEAPP_FLASH_CLUSTERID:
break;
}
}
SAMPLEAPP_PERIODIC_CLUSTERID就是簇ID, 根据不同的Cluster ID做不同的动作, 例:
case SAMPLEAPP_PERIODIC_CLUSTERID:
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);
HalUARTWrite(0, "\r\n", 2);
break;
注意以上都是针对 End-Device设备。
接收里面case ZDO_STATE_CHANGE:很重要, 表明zigbee网络设备发生变化,例如新设备加入等。
例:
if ( (SampleApp_NwkState == DEV_ZB_COORD)) // 只有协调器才可以广播数据
//|| (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 );
}
上面表示如果是协调器, 产生定时信息。End-Device收到定时发送的信号会做相应处理。看下面发送。
发送(协调器)
再看发送:
// Send a message out - This event is generated by a timer
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
SampleApp_SendPeriodicMessage();
… …
}
对于SampleApp_SendPeriodicMessage, 例:
void SampleApp_SendPeriodicMessage( void )
{
byte SendData[] = "hello world \r\n";
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,
&SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
sizeof(SendData), // data length
SendData,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
}
}
上面AF_DataRequest里面Cluster ID是SAMPLEAPP_PERIODIC_CLUSTERID, 那么接收部分也是SAMPLEAPP_PERIODIC_CLUSTERID就可以接收到数据。
在终端串口里面可以看到