ZIGBEE学习笔记五——读取温度电量信息

1、传感器节点sensor采集数据发往收集节点collector

什么时候传感器节点开始读取温度电池电量信息的?

从绑定成功后开始的,看下zb_BindConfirm()这个函数:

*********************************

void zb_BindConfirm( uint16 commandId, uint8 status )

{

  if ( ( status == ZB_SUCCESS ) && ( myAppState == APP_START ) )

  {

    myAppState = APP_BOUND;

    //Start reporting sensor values

    myApp_StartReporting();

  }

  else

  {

    // Continue to discover a collector

    osal_start_timerEx( sapi_TaskID, MY_FIND_COLLECTOR_EVT, myBindRetryDelay );

  }

}

*********************************

可以看到如果绑定成功则调用 myApp_StartReporting()开始报告传感器的数据值.

看下myApp_StartReporting()这个函数:

*********************************

//周期性地读取传感器采集的数据

void myApp_StartReporting( void )

{

  //温度

  osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );

  //电池能量

  osal_start_timerEx( sapi_TaskID, MY_REPORT_BATT_EVT, myBatteryCheckPeriod );

  HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );

}

*********************************

可以看到这里设定两个软定时器定时触发MY_REPORT_TEMP_EVT事件和MY_REPORT_BATT_EVT事件,即报告温度值事件和报告电池电量事件.注意这些事件属于ZB_USER_EVENTS,用户应用事件ZB_USER_EVENTS事件有以下这些:

  // This must be the last event to be processed

  /*

  // Application osal event identifiers

  // Bit mask of events ( from 0x0000 to 0x00FF )

#define MY_START_EVT                0x0001

#define MY_REPORT_TEMP_EVT          0x0002

#define MY_REPORT_BATT_EVT          0x0004

#define MY_FIND_COLLECTOR_EVT       0x0008

  */

  //而ZB_USER_EVENTS = 0x00FF;以上应用事件和ZB_USER_EVENTS相与都不为0,因此会执行

SAPI_ProcessEvent()中以下程序:

*********************************

  if ( events & ( ZB_USER_EVENTS ) ) /*用户应用事件*/

  {

    // User events are passed to the application

    zb_HandleOsalEvent( events );

    // Do not return here, return 0 later

  }

*********************************

调用zb_HandleOsalEvent():

*********************************

//SENSOR_REPORT_CMD_ID命令信息带有两个字节的负载:第一个字节指示读取的类型(温度或

//电池电压);第二个字节为传感器指示值(温度或电压指示).

void zb_HandleOsalEvent( uint16 event )

{

  uint8 pData[2];

  if ( event & MY_START_EVT )

  {

    zb_StartRequest();

  }

  if ( event & MY_REPORT_TEMP_EVT )//温度报告

  {

    // Read and report temperature value

    pData[0] = TEMP_REPORT;  //0x01(用来指示这是温度数据)

    pData[1] =  myApp_ReadTemperature();//温度值

                      //0xFFFE = INVALID_NODE_ADDR = ZB_BINDING_ADDR 

    zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0, AF_ACK_REQUEST, 0 );

    

    /*因为是周期性地读取温度电池值,则每次事件处理完后要为下一次读取而重新开启一个定时器*/

    osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );

  }

  if ( event & MY_REPORT_BATT_EVT )//电池电量报告

  {

    // Read battery value

    // If battery level low, report battery value

    pData[0] = BATTERY_REPORT;  //0x02(用来指示这是电池能量数据)

    pData[1] =  myApp_ReadBattery();

    zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0, AF_ACK_REQUEST, 0 );

    osal_start_timerEx( sapi_TaskID, MY_REPORT_BATT_EVT, myBatteryCheckPeriod );

  }

  if ( event & MY_FIND_COLLECTOR_EVT )

  {

    // Find and bind to a collector device

    zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID, (uint8 *)NULL );

  }

}

*********************************

主要涉及三个函数:myApp_ReadTemperature();myApp_ReadBattery()和zb_SendDataRequest();

myApp_ReadTemperature():读取温度值

myApp_ReadBattery:读取电池电量值

zb_SendDataRequest():把所读取数据发往绑定设备collector.

你可能感兴趣的:(report,user,cmd,null,binding,events)