更新时间:2024-06-11 GMT+08:00

设备属性上报

概述

属性上报是一种需要平台解析、缓存,通过数据流转功能将数据转发到应用侧或华为云其他云服务的一种方式。需要在平台建立产品模型。对于属性上报的数据,平台会记录属性的最新一次上报值,对符合产品模型定义的属性数据进行存储。设备可以通过设备侧获取平台的设备影子数据向平台获取最新的设备属性值。

图1 设备属性上报

使用场景

  • 设备端及应用端需要平台进行转换、管理、缓存的数据。
  • 需要通过数据转发规则转发到华为云其他云服务上进行存储和处理的场景。

使用限制

  • 单个消息内容不大于64KB。
  • 需要设置产品模型,数据内容需要与产品模型中定义的属性相匹配。
  • 网关上报子设备属性时一次最大可上报子设备数量为100个。

使用说明

图2 设备属性上报操作流程

  1. 创建产品与设备、设定物模型:创建产品流程、创建设备流程、设定产品模型
  2. 设备鉴权:平台验证设备是否具有接入权限。
  3. 设备属性上报:设备通过MQTT/HTTP/LwM2M等协议上报属性数据。

    按照不同的设备协议,调用的接口不一样,下面分别介绍MQTT、HTTPS、LwM2M/CoAP这三种协议中属性上报的样例:

    • MQTT:通过属性上报接口MQTT协议属性上报上报数据到物联网平台,MQTT属性上报样例如下:
      Topic:$oc/devices/{device_id}/sys/properties/report
      数据格式样例:   
      {
          "services": [
              {
                  "service_id": "Temperature",
                  "properties": {
                      "value": 57,
                      "value2": 60
                  }
              }
          ]
      }
    • HTTPS:通过属性上报接口HTTP协议属性上报上报数据到物联网平台,其中access_token参考:HTTPS设备鉴权。HTTPS属性上报样例如下:
      POST https://{endpoint}/v5/devices/{device_id}/sys/properties/report 
      Content-Type: application/json 
      access_token: d144a524-1997-4b99-94bf-f27128da8a34  
      {
          "services": [
              {
                  "service_id": "serviceId",
                  "properties": {
                      "Height": 124,
                      "Speed": 23.24
                  }
              }
          ]
      }
    • LwM2M/CoAP:通过属性上报接口LwM2M/CoAP属性上报上报数据到物联网平台。LwM2M/CoAP属性上报样例如下:
      //假设设备上报的数据内容(value)为c4 0d 5a 6e 96 0b c3 0e 2b 30 37
       NON-2.05   MID=48590, Token=2cb6a673cba24c04, OptionSet={"Observe":22, "Content-Format":"application/octet-stream"}, c4 0d 5a 6e 96 0b c3 0e 2b 30 37

  4. 平台存储最近一次数据快照:当上报的数据符合产品模型定义时,在设备接入控制台,选择设备 > 所有设备,单击具体设备,在设备信息中可以看到最新的数据快照。如下图:

    图3 平台接收到并成功解析设备属性上报

  5. 数据转发:通过数据流转功能可以转发到应用侧,也可以转发到华为云其他云服务上进行存储和处理。

属性上报JAVA SDK使用示例

本部分介绍如何使用JAVA SDK进行属性上报的开发。本示例使用的开发环境为JDK 1.8及以上版本。

上报的属性需要与该设备对应产品模型中定义的属性相匹配,以下设备侧SDK代码示例定义的产品模型为:
图4 属性上报产品定义

配置设备侧SDK步骤如下:

  1. SDK代码获取:SDK下载
  2. 配置设备侧SDK的Maven依赖。

    <dependency>
    	<groupId>com.huaweicloud</groupId>
    	<artifactId>iot-device-sdk-java</artifactId>
    	<version>1.1.4</version>
    </dependency>

  3. 配置设备侧SDK,设备连接参数。

    //加载iot平台的ca证书,获取连接参考:https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section3
    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代码,设备侧属性上报日志格式样例如下:

    图5 java SDK属性上报结果log

  2. 进入设备接入控制台,选择设备 > 所有设备,单击具体设备,在概述中可以看到最新的上报数据。

    图6 平台接收到并成功解析设备属性上报