1. 程式人生 > >zigbee 之ZStack-2.5.1a原始碼分析(三)無線資料傳送和接收

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就可以接收到資料。

在終端串口裡面可以看到