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. |