zigbee 之ZStack-2.5.1a原始碼分析(三)無線資料傳送和接收
阿新 • • 發佈:2018-11-05
前面說過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就可以接收到資料。
在終端串口裡面可以看到