zigbee 之ZStack-2.5.1a源码分析(三)无线数据发送和接收

前面说过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就可以接收到数据。

在终端串口里面可以看到

猜你喜欢

转载自blog.csdn.net/qq_21353001/article/details/82770023
今日推荐