zigbee协议栈初使用(三)无线数据传输
本次使用协议栈例程广播通信完成,本文记录网蜂《Zigbee实战演练》学习总结
一、发送部分
打开SampleApp.c找到
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
此函数用于处理事件,发送部分注释后主要代码如下:
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE://当网络发生改变时,如组网成功
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
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, //任务ID
SAMPLEAPP_SEND_PERIODIC_MSG_EVT, //事件号
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );//事件重复时间头文件中修改
}
else
{
// Device is no longer in the network
}
break;
SAMPLEAPP_SEND_PERIODIC_MSG_EVT在头函数定义为(0x0001)一个任务(task_ID)下可以有多个事件,此处用来区分事件。本端函数配置和登记了事件。本端代码可以看作配置发送。
在同一函数下查找,发现如下代码:
//发消息,由定时器完成
// Send a message out - This event is generated by a timer
// (setup in SampleApp_Init()).
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message 发送周期消息
SampleApp_SendPeriodicMessage();
// Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
// return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
可以发现上文所说事件标志SAMPLEAPP_SEND_PERIODIC_MSG_EVT,当有此事件时进入,其中主要是 SampleApp_SendPeriodicMessage();此函数是发送数据的主要函数,如下:
void SampleApp_SendPeriodicMessage( void ) //发送消息内容
{
uint8 data[10]="0123456789";
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID, //和接收方建立联系 1表示广播
10,
data,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
此处注意SAMPLEAPP_PERIODIC_CLUSTERID,后面有说明。
由此终端设备周期广播发送数据0~9;
二、接收部分
接收有两个任务:1、读取接收到的数据 2、串口发送数据到PC
同样在uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中,找到代码如下:
// Received when a messages is received (OTA) for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt ); //将接收到的数据包进行处理函数
break;
SampleApp_MessageMSGCB( MSGpkt );是接收处理函数,代码如下:
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
{
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID: //数据包ID
HalUARTWrite(0, "I got Message!", sizeof("I got Message!")); //提示信息
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, "\n", 1); //回车换行
break;
case SAMPLEAPP_FLASH_CLUSTERID: //此实验没有使用,到后面实验详解
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
SAMPLEAPP_PERIODIC_CLUSTERID数据包ID,在发送函数中有对应。
现在出现三个ID主要区分:任务号(task_ID)、发送事件号(SAMPLEAPP_SEND_PERIODIC_MSG_EVT)、数据包号(SAMPLEAPP_PERIODIC_CLUSTERID)。关系应该是包含,一个任务可以多个发送事件,一个发送事件可以有多个数据包。
终端和协调器分别编译下载后现象如下
文内有较多引用及自己理解,有误会及时更正。