TI的Zstack协议栈SensorDemo例程温度收发

学习Zigbee也有快TISensorDemo例程中,打开workspace下有四种选择,CollectorEB,SensorEB CollectorEB-PRO,SensorEB-PRO,其中PRO代表专业版。在这里我们主要写一下TI提供的这个例程关于温度数据传送与接收的问题。首先在workspace下选择SensorEB(其实这里CollectorEBSensorEB是一样的打开目录APP就会发现)打开APP后有两个重要的.C文件DemoCollector.cDemoSensor.c,我们发现DemoCollector.c是白色的表明该文件在SensorEB模式下不会被编译。点开DemoSensor.c找到static void sendReport(void)函数

TI定义的温度数据通过无线传输给每个设备的数据格式是这样的

温度值和电流值各占一个字节,设备段地址占两个字节,接下来看函数是不是很容易理解了,呵呵。

static void sendReport(void)

{

  uint8 pData[SENSOR_REPORT_LENGTH];//存放数据的数组

  static uint8 reportNr=0;

  uint8 txOptions;

  // 读温度值

  pData[SENSOR_TEMP_OFFSET] =  readTemp();

  // 读电压值

  pData[SENSOR_VOLTAGE_OFFSET] = readVoltage();

    //写入设备段地址

  pData[SENSOR_PARENT_OFFSET] =  HI_UINT16(parentShortAddr);

  pData[SENSOR_PARENT_OFFSET + 1] =  LO_UINT16(parentShortAddr);

  // Set ACK request on each ACK_INTERVAL report

  // If a report failed, set ACK request on next report

  if ( ++reportNr

  {

    txOptions = AF_TX_OPTIONS_NONE;

  }

  else

  {

    txOptions = AF_MSG_ACK_REQUEST;

    reportNr = 0;

  }

  // Destination address 0xFFFE: Destination address is sent to previously

  // established binding for the commandId.

//发送数据请求,把温度信息发送给地址为0XFFFE的设备

  zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, SENSOR_REPORT_LENGTH, pData, 0, txOptions, 0 );

}

这样节点测得的温度信息就可以通过这种方式发送给协调器了。那么协调器是怎么接收这些数据的呢?

选中CollectorEB,打开APP目录下的sapi.c文件找到UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )函数,这个函数厉害了,它是来处理任务的所有事件,这些事件包括定时器,消息以及其他的一些用户定义的事件,在这个函数里我们看到

case AF_INCOMING_MSG_CMD:

pMSGpkt=(afIncomingMSGPacket_t*)pMsg;         

SAPI_ReceiveDataIndication(pMSGpkt->srcAddr.addr.shortAddr,pMSGpkt->clusterId,pMSGpkt->cmd.DataLength, pMSGpkt->cmd.Data);

        break;

也就是当消息到来时,会调用SAPI_ReceiveDataIndication()函数进一步追踪该函数void SAPI_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )

{

#if defined ( MT_SAPI_CB_FUNC )

  /* First check if MT has subscribed for this callback. If so , pass it as

  a event to MonitorTest and return control to calling function after that */

  if ( SAPICB_CHECK( SPI_CB_SAPI_RCV_DATA_IND ) )

  {

    zb_MTCallbackReceiveDataIndication( source, command, len, pData  );

  }

  else

#endif  //MT_SAPI_CB_FUNC

  {

#if ( SAPI_CB_FUNC )

    zb_ReceiveDataIndication( source, command, len, pData  );

#endif

  }

}

这个函数的功能是协议栈提示应用层有其他设备上的数据已经接收到了提示相关应用来处理,那么处理函数很显然就是zb_ReceiveDataIndication( source, command, len, pData  )啦,追踪这个函数可以看到它在DemoCollector.c中定义,接收数据的格式是这样的

这一层的数据格式定义应该不要解释了吧?值得注意的是Data最大84个字节,温度与电压值就是存放在这里的哦,如果想定义自己的数据传输格式就可以在Data里面定义了。

好了,既然协调器已经收到数据了那么它是怎么传输给PC机的呢?TI例程里用的是串口。在void zb_ReceiveDataIndication()函数最后内这样一条语句sendGtwReport(>wData);往下找到static void sendGtwReport(gtwData_t *gtwData)函数,协调器就是通过这个函数把数据发给PC机的,通过串口调试助手可以看到每一个字节数据和对应的意思程序的注释也写的很清楚

你可能感兴趣的:(TI的Zstack协议栈SensorDemo例程温度收发)