单元 2:设备接入¶
使用协议网关接入设备,首先需要创建一个用于上传数据的 HTTP 网络组件,一个用于处理设备上线协议的设备协议,以及一个用于分析和更新数据的协议网关。
步骤 1:创建网络组件¶
在 EnOS 管理控制台中选择 设备接入 > 网络组件。
点击 新建网络组件,在 新建网络组件 页面配置下列信息。
名称:HTTP 网络组件
类型:HTTP Server
描述:HTTP 网络组件
点击 确定 创建该网络组件。
更多信息,参见 网络组件。
步骤 2:创建协议网关¶
为了实现上报消息的数据转换,需要创建一个“翻译”上行数据的方法,可通过遵循 https://github.com/EnvisionIot/third-party-protocol 中定义的方式完成,实现 ICodecPlugin 的方法打成 JAR 包。
更多信息,参见 设备协议。
JAR 包¶
加以下代码片段以包含依赖项。
<dependency> <groupId>com.envisioniot.enos.third_party_protocol</groupId> <artifactId>core</artifactId> <version>1.0.0</version> </dependency>
使用以下代码将设备上报的 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); } }
将上述内容打包成一个 JAR 文件。
设备协议¶
步骤 3:创建协议网关¶
由于协议网关涉及到权限的校验,在创建协议网关之前,需要先创建一个应用,并给该应用赋予设备的读写权限。
更多信息,参见 协议网关。
应用¶
在 EnOS 管理控制台中选择 应用注册。
点击 创建应用,在 创建应用 页面配置下列信息。
应用名称:水表应用
应用分类:其他
应用类型:Web
详细描述:水表的应用
点击 确认 创建该应用。