单元 2:设备接入


使用协议网关接入设备,首先需要创建一个用于上传数据的 HTTP 网络组件,一个用于处理设备上线协议的设备协议,以及一个用于分析和更新数据的协议网关。

步骤 1:创建网络组件

  1. EnOS 管理控制台 中选择 设备接入 > 网络组件

  2. 点击 新建网络组件,在 新建网络组件 页面配置下列信息。

    • 名称:HTTP 网络组件
    • 类型:HTTP Server
    • 描述:HTTP 网络组件


  3. 点击 确定 创建该网络组件。


    ../../_images/network_module_http.png


更多信息,参见 网络组件

步骤 2:创建协议网关

为了实现上报消息的数据转换,需要创建一个“翻译”上行数据的方法,可通过遵循 https://github.com/EnvisionIot/third-party-protocol 中定义的方式完成,实现 ICodecPlugin 的方法打成 JAR 包。


更多信息,参见 设备协议

JAR 包

  1. 加以下代码片段以包含依赖项。

    <dependency>
        <groupId>com.envisioniot.enos.third_party_protocol</groupId>
        <artifactId>core</artifactId>
        <version>1.0.0</version>
    </dependency>
    


  2. 使用以下代码将设备上报的 JSON 数据序列化为对象,并获取测点信息上报。


    • CustomData 类
    package com.envisioniot.enos.third_party_protocol.custom_codec.data;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class CustomData {
     private String identifier;
     private String msgType;
     private Integer hasMore;
     private Integer dtag;
     private List<ServiceItem> data;
    }
    


    • ServiceItem 类
    package com.envisioniot.enos.third_party_protocol.custom_codec.data;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.Map;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class ServiceItem {
     private String serviceId;
     private Map<String, Object> serviceData;
     private Long eventTime;
    }
    


    • PostMeasurePointPlugin 类
    package com.envisioniot.enos.third_party_protocol.custom_codec;
    
    import com.alibaba.fastjson.JSON;
    import com.envisioniot.enos.third_party_protocol.core.ICodecPlugin;
    import com.envisioniot.enos.third_party_protocol.core.element.PostedMeasurePoints;
    import com.envisioniot.enos.third_party_protocol.core.message.request.PostMeasurePointRequest;
    import com.envisioniot.enos.third_party_protocol.core.message.response.PostMeasurePointRspItemData;
    import com.envisioniot.enos.third_party_protocol.core.message.response.Response;
    import com.envisioniot.enos.third_party_protocol.custom_codec.data.CustomData;
    import com.envisioniot.enos.third_party_protocol.custom_codec.data.ServiceItem;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.*;
    
    @Slf4j
    public class PostMeasurePointPlugin implements ICodecPlugin<PostMeasurePointRequest, PostMeasurePointRspItemData> {
     private static final String FLOW_FIELD = "flow";
     private static final String INTERNAL_TEMPERATURE_FIELD = "internalTemperature";
    
     @Override
     public String getProtocol() {
       return "custom protocol";
     }
    
     @Override
     public PostMeasurePointRequest decode(Map<String, Object> meta, String originalReq) {
       try {
         final CustomData customData = JSON.parseObject(originalReq, CustomData.class);
    
         final String assetId = customData.getIdentifier();
    
         PostMeasurePointRequest request = new PostMeasurePointRequest();
    
         request.setIgnoreInvalidMeasurePoint(true);
         request.setRealtime(true);
    
         PostedMeasurePoints point = new PostedMeasurePoints();
         point.setAssetId(assetId);
    
         Map<String, Object> measurepoint = new HashMap<>();
         for (ServiceItem item : customData.getData()) {
           Map<String, Object> serviceData = item.getServiceData();
    
           try{
             final Integer flow = (Integer) serviceData.get(FLOW_FIELD);
               if (Objects.nonNull(flow)) {
                 measurepoint.put(FLOW_FIELD, flow);
               }
           } catch (Throwable t) {
               log.warn(
                 "convert data failed, field: {}, original data: {}",
                 FLOW_FIELD,
                 serviceData.get(FLOW_FIELD));
           }
    
           try{
             final String internalTemperature = (String) serviceData.get(INTERNAL_TEMPERATURE_FIELD);
             if (Objects.nonNull(internalTemperature)) {
               final Long numberOfTemperature = Long.valueOf(internalTemperature);
               measurepoint.put(INTERNAL_TEMPERATURE_FIELD, numberOfTemperature);
             }
           } catch (Throwable t) {
               log.warn(
                 "convert data failed, field: {}, original data: {}",
                 INTERNAL_TEMPERATURE_FIELD,
                 serviceData.get(INTERNAL_TEMPERATURE_FIELD));
           }
         }
    
         point.setMeasurepoints(measurepoint);
    
         List<PostedMeasurePoints> measurepoints = new ArrayList<>();
         measurepoints.add(point);
    
         request.setMeasurepoints(measurepoints);
    
         return request;
       } catch (Throwable t) {
         log.error("fail to decode request, originalReq: {}", originalReq, t);
    
         return null;
       }
     }
    
     @Override
     public String encodeResponse(Map<String, Object> meta, String originalReq, Response<PostMeasurePointRspItemData> response) {
       return JSON.toJSONString(response);
     }
    }
    


  3. 将上述内容打包成一个 JAR 文件。

设备协议

  1. EnOS 管理控制台 中选择 设备接入 > 设备协议

  2. 点击 新建设备协议,在 新建设备协议 页面配置下列信息。

    • 名称:水表编解码
    • 方式:JAR
    • 类名:com.envisioniot.enos.third_party_protocol.custom_codec.PostMeasurePointPlugin
    • 文件:上传以上创建的 JAR 文件。
    • 文件:水表设备协议


  3. 点击 确认 创建该设备协议。


    ../../_images/device_protocol_water_meter.png

步骤 3:创建协议网关

由于协议网关涉及到权限的校验,在创建协议网关之前,需要先创建一个应用,并给该应用赋予设备的读写权限。


更多信息,参见 协议网关

应用

  1. EnOS 管理控制台 中选择 应用注册

  2. 点击 创建应用,在 创建应用 页面配置下列信息。

    • 应用名称:水表应用
    • 应用分类:其他
    • 应用类型:Web
    • 详细描述:水表的应用


  3. 点击 确认 创建该应用。


    ../../_images/app_water_meter.png

协议网关

  1. EnOS 管理控制台 中选择 设备接入 > 协议网关

  2. 点击 新建协议网关,在 新建协议网关 页面配置下列信息。

    • 新建:从空白新建
    • 名称:水表协议网关
    • 类型:HTTP Server
    • 网络组件:HTTP 网络组件
    • 协议路由:/post > 水表编解码
    • Access Key:以上创建的应用程序的 access key。
    • Secret Key:以上创建的应用程序的 secret key。
    • 描述:水表协议网关


  3. 点击 确定 创建设备协议,其创建后将具有系统生成 ID,显示在设备协议列表中。


    ../../_images/protocol_gateway_water_meter.png

下一单元

配置路由规则