【华为云IoTEdge开发实战】Java开发如何通过IoT边缘ModuleSDK进行OT数采

举报
华为IoT云服务 发表于 2022/12/16 15:09:52 2022/12/16
【摘要】 为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,华为IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云。IoT边缘平台应用功能有自定义处理设备数据(即数据处理),自定义协议设备快速接入(即协议解析),IT子系统接入(即IT应用),并且支持容器化部署和安装包部署的方式。

1、操作场景

开发应用驱动集成ModuleSDK进行OT数采。(此示例以采集OPCUA为示例)

  1. 在节点部署集成了ModuleSDK应用驱动。
  2. 配置好数据源模板(可自定义)。
  3. 在平台进行数据源配置,以及点位配置,下发。
  4. 集成ModuleSDK应用驱动对平台下发的配置进行处理。
  5. 通过下发信息获取数据源连接,以及点位信息进行数据周期采集。
  6. 最后运用ModuleSDK的客户端进行点位数据进行周期上报。

2、代码解析

开发自定义驱动,进行OT数采。

public class DcDriver implements PointsCallback, ModuleShadowNotificationCallback {

    /**

     * 数采应用客户端,与边缘Hub建立MQTT连接

     */

    private DcClient dcClient;

    @PostConstruct

    void init() throws Exception {

        //打开客户端

        dcClient = DcClient.createFromEnv();

        dcClient.open();

        //设置回调,并同步模块影子

        dcClient.setPointsCallback(this);

        dcClient.startModuleShadow(this);

    }

    /**

     * 收到模块下行数采配置,消息需要缓存或持久化

     *进入边缘节点详情-》应用模块-》数采配置-》下发按钮

     */

    @Override

    public void onModuleShadowReceived(ModuleShadowNotification shadow) {

        BriefModuleShadowDTO briefModuleShadowDTO = JacksonUtil.json2Pojo(

            JacksonUtil.pojo2Json(shadow.getProperties()), BriefModuleShadowDTO.class);

        connectDatasource(briefModuleShadowDTO.getConnectionInfo());

        collectData(briefModuleShadowDTO.getPoints());

    }

    private void collectData(Map<String, Object> points) {

        Map<String, Object> returnValues = new HashMap<>();

        points.forEach((k, v) -> {

            PointConfig pointConfig = JacksonUtil.json2Pojo(JacksonUtil.pojo2Json(points), PointConfig.class);

            Object value = collectPointDataFromOpcuaServer(pointConfig);

            returnValues.put(pointConfig.getPointId(), value);

        });

        //数据采集后上报数据

        pointsReport(returnValues);

    }

    /**

     * 上报服务器采集点位数据到EdgeHub

     */

    private void pointsReport(Map<String, Object> points) {

        PointsReport report = new PointsReport();

        report.setPoints(points);

        try {

            dcClient.pointReport(report);

        } catch (JsonException e) {

            e.printStackTrace();

        }

    }

    /**

     * 根据根据opcua的点位信息从opcua服务器读取或者订阅数据

     */

    private Object collectPointDataFromOpcuaServer(PointConfig pointConfig) {

        //todo 伙伴根据address和周期读取点位数据

        //示例从服务器读取到点位数据为10

        Object returnValue = 10;

        return returnValue;

    }

    /**

     * 根据数采配置的数据源连接参数完成数据源连接

     */

    private void connectDatasource(Map<String, String> connectionInfo) {

        //opcua 服务器为示例,获取服务器连接地址

        String endpoint = connectionInfo.get("endpoint");

        //todo 伙伴根据endpoint实现连接数据源动作

    }

    /**

     * 收到点位设置的处理

     */

    @Override

    public PointsSetRsp onPointSet(String requestId, PointsSetReq pointsSetReq) {

        //PointsSetReq结构points{pointId:value}的键值对,

        // 伙伴需要根据onModuleShadowReceived获取的数采配置实现写opcua服务器

        //正常写数据到opcua服务器响应示例

        return new PointsSetRsp(0,"success");

    }

    /**

     * 收到点位读取的处理

     */

    @Override

    public PointsGetRsp onPointGet(String requestId, PointsGetReq pointsGetReq) {

        //PointsSetReq结构points[pointId1,pointId2]的列表,

        // 伙伴需要根据onModuleShadowReceived获取的数采配置实现读取opcua服务器的点位信息

        //正常从opcua服务器读取点位数据响应示例

        PointsGetRsp rsp = new PointsGetRsp();

        Map<String, Object> points = new HashMap<>();

        for (String point : pointsGetReq.getPoints()) {

            points.put(point, 1);

        }

        return rsp;

    }

}

下发配置对象

public class BriefModuleShadowDTO {

    //数据源id

    @JsonProperty("ds_id")

    private String dsId;

    //数采模板默认参数

    @JsonProperty("default_values")

    private Map<String, String> defaultValues;

    //数据源附加参数

    @JsonProperty("collection_paras")

    private Map<String, Integer> collectionParas;

    //数据源连接信息

    @JsonProperty("connection_info")

    private Map<String, String> connectionInfo;

    //点位信息

    private Map<String, Object> points;

}

点位信息对象

public class PointConfig {

    //点位id

    @JsonProperty("point_id")

    private String pointId;

    //点位地址,opcua地址:address = "ns=3;i=1002"

    private String address;

    //数据类型intint32floatdoublebool

    @JsonProperty("data_type")

    private String dataType;

    //点位采集周期单位毫秒

    private Integer cycle;

}

3、注册节点

注册节点请参照注册边缘节点

4、设备建模&发放

请参照设备建模&发放

5、项目打包

将集成ModuleSDK进行项目打包

根据您的需求进行相关代码的开发,并将项目打包,以编辑器IDEA为例:

  1. 选中项目->右键open Module setting
  2. Artifacts->单击+>JAR->From modules with dependencies->模块选择monitor-app,选择monitorappMain入口类,注意MF位置选择模块根目录->单击apply

image001.png

  1. 单击上方build选项->选择build Artifacts->monitor-app:jar->build
  2. 打包完成得到monitor-app.jar文件。(如遇到错误(Invalid signature file digest for Manifest main attributes)请使用压缩文件进入metf目录删除.rsa.mf文件)

image003.png

6、制作镜像包

jar文件打包成镜像文件上,请参照制作镜像包或插件包

dockerfile内容参照如下(具体可参考编写高效的Dockerfile ):

FROM registry-cbu.huawei.cn/csopenjdk/openjdk

RUN mkdir -p /opt/iot/edge/monitor / && chmod -R 777 /opt/

COPY monitor /opt/iot/edge/monitor  

USER root    

EXPOSE 8080

CMD ["java", "-jar", "/opt/iot/edge/monitor/monitor-app.jar", "run"]

#构造镜像

#docker build -t edge_monitor:1.0.0 /home --no-cache 

#打标签

#docker tag edge_monitor:1.0.0 swr.cn-north-4.myhuaweicloud.com/iot_edge_test/ot_test:v1

#推送

#docker push swr.cn-north-4.myhuaweicloud.com/iot_edge_test/ot_test:v1

#打成镜像包

#docker save swr.cn-north-4.myhuaweicloud.com/iot_edge_test/ot_test:v1 > ot_test.tar

7、添加应用

以容器镜像方式为例,镜像包上传到容器镜像服务SWR后,创建应用。

1.在IoT边缘单击创建应用,进入软件部署配置、运行配置,并确认发布。image005.png

2.在左侧导航栏,单击应用管理,选择应用名称进入页面,查看应用为已发布状态。

image007.png

8、部署应用

部署应用,具体参考部署应用,进入我们的节点详情页安装应用。

9、OT数采配置

此数据源以opcua模板为例。可参考OT数采配置自定义数据模板。自行开发集成ModuleSDK驱动应用,定义自己的数据源模板,以及点位信息后,下发配置。

10、查看采集结果

  1. 访问IoT边缘,单击立即使用进入IoT边缘控制台。
  2. 在左侧导航栏选择“IoT边缘>边缘节点,选择之前创建的边缘节点“test_IoT10”,单击节点进入详情页。
  3. 选择边缘设备页签,单击添加边缘设备中添加的设备ID“test_IoT10”,跳转至设备接入服务控制台查看采集的数据。

image010.gif

说明:

OT数采设备状态平台不感知,即统一显示为未激活,请进入设备详情页,查看最新上报数据。

image012.gif

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。