1. 程式人生 > >ZIGBEE學習筆記五——讀取溫度電量資訊

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.