# 设备属性上报
#### 概述
属性上报是一种需要平台解析、缓存，通过数据流转功能将数据转发到应用侧或华为云其他云服务的一种方式。需要在平台建立产品模型。对于属性上报的数据，平台会记录属性的最新一次上报值，对符合产品模型定义的属性数据进行存储。设备可以通过[设备侧获取平台的设备影子数据](https://support.huaweicloud.com/api-iothub/iot_06_v5_3012.html)向平台获取最新的设备属性值。
图1设备属性上报   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001891076470.png "点击放大")
#### 使用场景
- 设备端及应用端需要平台进行转换、管理、缓存的数据。
- 需要通过[数据转发流程](https://support.huaweicloud.com/usermanual-iothub/iot_01_0024.html)转发到华为云其他云服务上进行存储和处理的场景。
 
#### 使用限制
- 单个消息内容不大于64KB。
- 需要设置产品模型，数据内容需要与产品模型中定义的属性相匹配。
- 网关上报子设备属性时一次最大可上报子设备数量为100个。
 
#### 使用说明
图2设备属性上报操作流程
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001890916570.png "点击放大")
1. 创建产品与设备、设定物模型：[创建产品](https://support.huaweicloud.com/usermanual-iothub/iot_01_0054.html)流程、[注册单个设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html)流程、设定[产品模型](https://support.huaweicloud.com/devg-iothub/iot_02_0005.html)。
2. [设备鉴权](https://support.huaweicloud.com/usermanual-iothub/iot_01_0019.html)：平台验证设备是否具有接入权限。
3. 设备属性上报：设备通过MQTT/HTTP/LwM2M等协议上报属性数据。 
   按照不同的设备协议，调用的接口不一样，下面分别介绍MQTT、HTTPS、LwM2M/CoAP这三种协议中属性上报的样例：
   - **MQTT** ：通过属性上报接口[MQTT协议属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)、[使用MQTT.fx调测](https://support.huaweicloud.com/devg-iothub/iot_01_2127.html)上报数据到物联网平台，MQTT属性上报样例如下：
     ```
     Topic：$oc/devices/{device_id}/sys/properties/report
     数据格式样例：   
     {
         "services": [
             {
                 "service_id": "Temperature",
                 "properties": {
                     "value": 57,
                     "value2": 60
                 }
             }
         ]
     }
     ```
     
   
   - **HTTPS** ：通过属性上报接口[HTTP协议属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_7010.html)上报数据到物联网平台，其中access_token参考：[HTTP设备连接鉴权](https://support.huaweicloud.com/api-iothub/iot_06_v5_7008.html)。HTTPS属性上报样例如下：
     ```
     POST https://{endpoint}/v5/devices/{device_id}/sys/properties/report 
     Content-Type: application/json 
     access_token: ******** 
     {
         "services": [
             {
                 "service_id": "serviceId",
                 "properties": {
                     "Height": 124,
                     "Speed": 23.24
                 }
             }
         ]
     }
     ```
     
   
   - **LwM2M/CoAP** ：通过属性上报接口[LwM2M/CoAP属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_1327.html)上报数据到物联网平台。LwM2M/CoAP属性上报样例如下：
     ```
     //假设设备上报的数据内容(value)为c4 0d 5a 6e 96 0b c3 0e 2b 30 37
      NON-2.05   MID=48590, Token=********, OptionSet={"Observe":22, "Content-Format":"application/octet-stream"}, c4 0d 5a 6e 96 0b c3 0e 2b 30 37
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-iothub/public_sys-resources/note_3.0-zh-cn.png)
   - 设备属性上报内容需要与产品模型中定义的属性相匹配。
   
   - 协议详情请参考：[MQTT协议属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)、[HTTP协议属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_7010.html)、[LwM2M/CoAP属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_1327.html)。
    
   
   
4. 平台存储最近一次数据快照：当上报的数据符合产品模型定义时，在设备接入控制台，选择"设备 \> 所有设备"，单击具体设备，在"设备信息"中可以看到最新的数据快照。 
   图3属性上报-查看数据   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001981992257.png "点击放大")
   
   
5. 数据转发：通过[数据转发流程](https://support.huaweicloud.com/usermanual-iothub/iot_01_0024.html)可以转发到应用侧，也可以转发到华为云其他云服务上进行存储和处理。
 
#### 属性上报JAVA SDK使用示例
本部分介绍如何使用JAVA SDK进行属性上报的开发。本示例使用的开发环境为JDK 1.8及以上版本。
上报的属性需要与该设备对应[产品模型](https://support.huaweicloud.com/devg-iothub/iot_02_0005.html)中定义的属性相匹配。
图4模型定义-smokeDetector   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001950597702.png "点击放大")
配置设备侧SDK步骤如下：
1. 获取SDK代码：[SDK下载](https://support.huaweicloud.com/sdkreference-iothub/iot_10_1002.html)。
2. 配置设备侧SDK的Maven依赖。 
   ```
   <dependency>
   <groupId>com.huaweicloud</groupId>
   <artifactId>iot-device-sdk-java</artifactId>
   <version>1.1.4</version>
   </dependency>
   ```
   
   
3. 配置设备侧SDK，设备连接参数。 
   ```
   //加载iot平台的ca证书。获取链接参考：证书资源。
   URL resource = BroadcastMessageSample.class.getClassLoader().getResource("ca.jks");
   File file = new File(resource.getPath());
   //注意格式为：ssl://域名信息:端口号。
   //域名获取方式：登录华为云IoTDA控制台左侧导航栏“总览”页签，在选择的实例基本信息中，单击“接入信息”。选择8883端口对应的接入域名。
   String serverUrl = "ssl://<localhost>:8883";
   //在IoT平台创建的设备ID。
   String deviceId = "<deviceId>";
   //设备ID对应的密钥。
   String deviceSecret = "<secret>";
   //创建设备
   IoTDevice device = new IoTDevice(serverUrl, deviceId, deviceSecret, file);
   if (device.init() != 0) {
       return;
   }
   ```
   
   
4. 上报设备属性： 
   ```
   Map<String ,Object> json = new HashMap<>();
   Random rand = new Random();
   //按照物模型设置属性
   json.put("alarm", alarm);
   json.put("temperature", rand.nextFloat()*100.0f);
   json.put("humidity", rand.nextFloat()*100.0f);
   json.put("smokeConcentration", rand.nextFloat() * 100.0f);
   ServiceProperty serviceProperty = new ServiceProperty();
   serviceProperty.setProperties(json);
   serviceProperty.setServiceId("smokeDetector");//serviceId要和物模型一致
   device.getClient().reportProperties(Arrays.asList(serviceProperty), new ActionListener() {
       @Override
       public void onSuccess(Object context) {
           log.info("reportProperties success" );
       }
       @Override
       public void onFailure(Object context, Throwable var2) {
           log.error("reportProperties failed" + var2.toString());
       }   
   });
   ```
   
   
 
#### 测试验证
1. 设备端运行设备侧 SDK代码，设备侧属性上报日志格式样例如下： 
   图5Java SDK属性上报结果log   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001891076494.png "点击放大")
   
   
2. 进入设备接入控制台，选择"设备 \> 所有设备"，单击具体设备，在"设备信息"页签中可看到最新的上报数据。 
   图6属性上报-查看数据   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001981992257.png "点击放大")
   
   
 
