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.