多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
* 导师**视频**讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 本章实验和先前讲解的属性上报非常相似,我们实现的功能是:设备会启动一个周期性事件来检测温度是否发生变化,如果发生了变化,会把数据上报给协调器;协调器接收到数据时会显示在屏幕上! ### ## \*\* **协调器** 接收“上报”命令并进行处理: ![](https://img.kancloud.cn/5a/aa/5aaa55143641bd56891f17afde691609_832x176.png =600x) ### 最终调用函数:zclSampleTemperatureSensor\_ProcessInReportCmd ``` 1.static uint8 zclSampleTemperatureSensor_ProcessInReportCmd( zclIncomingMsg_t *pInMsg )     2.{     3.  zclReportCmd_t *reportCmd;     4.  uint8 i;     5.     6.  HalLcdWriteString("pro report", 3);     7.       8.  reportCmd = (zclReportCmd_t *)pInMsg->attrCmd;     9.  for ( i = 0; i < reportCmd->numAttr; i++ )     10.  {     11.    if( pInMsg->clusterId == ZCL_CLUSTER_ID_MS_TEMPERATURE_MEASUREMENT &&    12.      reportCmd->attrList[i].attrID == ATTRID_MS_TEMPERATURE_MEASURED_VALUE) 13.    {     14.        int16 temp = *((uint16 *)reportCmd->attrList[i].attrData);     15.        HalLcdWriteStringValue("Rx Temp:", temp, 10, 4);     16.    }     17.  }     18.     19.  return ( TRUE );     20.} ``` ### Cluster:ZCL\_CLUSTER\_ID\_MS\_TEMPERATURE\_MEASUREMENT, 属性:ATTRID\_MS\_TEMPERATURE\_MEASURED\_VALUE 同时记得在“option”中打开宏: ``` ZCL_REPORT_DESTINATION_DEVICE ZCL_REPORT ``` ### ## \*\* **设备** 定义周期性“上报”事件: ![](https://img.kancloud.cn/70/d7/70d7010ee47a873ad211ab51277c4744_830x158.png =600x) ### 在应用层初始化函数中启动周期性上报事件: ![](https://img.kancloud.cn/81/e6/81e69f2b6fae1af8785305ba8e74bf0a_832x176.png =600x) ### 在应用层事件处理函数中处理该事件: ![](https://img.kancloud.cn/f4/0f/f40f7b489e83179664e0dd523301b890_832x330.png =600x) ### 最终调用函数zclSampleTemperatureSensor\_GetAndReport,该函数的做的事件是:通过DHT11驱动 程序获取温度值,然后判断温度是否发生变化,如果发生变化则上报数据给协调器! ``` 1.static void zclSampleTemperatureSensor_GetAndReport(void)     2.{     3.    halDHT11Data_t dat = halDHT11GetData();  // 获取温度值   4.    if(dat.ok)  // 检测是否获取成功   5.    {     6.      HalLcdWriteStringValue("Temp:", dat.temp, 10, 3);     7.           8.      // 如果温度值没有变化,直接忽略(return)   9.if(zclSampleTemperatureSensor_MeasuredValue == ((int16)dat.temp * 100))     10.        return;     11. zclSampleTemperatureSensor_MeasuredValue = (int16)dat.temp * 100;   12.    }     13.    else     14.    {     15.      HalLcdWriteStringValue("Error Code:", dat.ok, 10, 3);     16.      return;     17.    }     18.  if( zclSampleTemperatureSensor_MeasuredValue > zclSampleTemperatureSensor_MaxMeasuredValue )     19.    {     20.      zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MaxMeasuredValue;     21.    }     22.    else if ( zclSampleTemperatureSensor_MeasuredValue < zclSampleTemperatureSensor_MinMeasuredValue )     23.    {     24.      zclSampleTemperatureSensor_MeasuredValue = zclSampleTemperatureSensor_MinMeasuredValue;     25.    }     26.         27.    // Report data  // 上报温度值   28.zclSampleTemperatureSensor_ReportTemp(zclSampleTemperatureSensor_MeasuredValue);     29.} ``` ### 最后通过函数zclSampleTemperatureSensor\_ReportTemp进行数据上报,该函数的结构和前面讲解属性上报的内容基本一样,这里不做展开! ## \*\* **仿真调试** 分别编译协调器和路由器的程序,然后分别烧录到两个开发板中;我们可以往DHT11温湿度传感器上吹气来改变温度值,可以看到数据上报和显示: