【华为云IoTEdge开发实战】Java开发如何通过IoT边缘ModuleSDK进行OT数采
1、操作场景
开发应用驱动集成ModuleSDK进行OT数采。(此示例以采集OPCUA为示例)
- 在节点部署集成了ModuleSDK应用驱动。
- 配置好数据源模板(可自定义)。
- 在平台进行数据源配置,以及点位配置,下发。
- 集成ModuleSDK应用驱动对平台下发的配置进行处理。
- 通过下发信息获取数据源连接,以及点位信息进行数据周期采集。
- 最后运用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;
//数据类型int、int32、float、double、bool等
@JsonProperty("data_type")
private String dataType;
//点位采集周期单位毫秒
private Integer cycle;
}
3、注册节点
注册节点请参照注册边缘节点。
4、设备建模&发放
请参照设备建模&发放。
5、项目打包
将集成ModuleSDK进行项目打包
根据您的需求进行相关代码的开发,并将项目打包,以编辑器IDEA为例:
- 选中项目->右键open Module setting
- Artifacts->单击+号>JAR->From modules with dependencies->模块选择monitor-app,选择monitorapp的Main入口类,注意MF位置选择模块根目录->单击apply。
- 单击上方build选项->选择build Artifacts->monitor-app:jar->build
- 打包完成得到monitor-app.jar文件。(如遇到错误(Invalid signature file digest for Manifest main attributes)请使用压缩文件进入metf目录删除.rsa和.mf文件)
6、制作镜像包
将jar文件打包成镜像文件上,请参照制作镜像包或插件包。
dockerfile内容参照如下(具体可参考编写高效的Dockerfile ):
FROM registry-cbu.huawei.com/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边缘单击创建应用,进入软件部署配置、运行配置,并确认发布。
2.在左侧导航栏,单击“应用管理”,选择“应用名称”进入页面,查看应用为“已发布”状态。
8、部署应用
部署应用,具体参考部署应用,进入我们的节点详情页安装应用。
9、OT数采配置
此数据源以opcua模板为例。可参考OT数采配置自定义数据模板。自行开发集成ModuleSDK驱动应用,定义自己的数据源模板,以及点位信息后,下发配置。
10、查看采集结果
- 访问IoT边缘,单击“立即使用”进入IoT边缘控制台。
- 在左侧导航栏选择“IoT边缘>边缘节点”,选择之前创建的边缘节点“test_IoT10”,单击节点进入详情页。
- 选择“边缘设备”页签,单击添加边缘设备中添加的设备ID“test_IoT10”,跳转至“设备接入服务控制台”查看采集的数据。
说明:
OT数采设备状态平台不感知,即统一显示为“未激活”,请进入设备详情页,查看最新上报数据。
- 点赞
- 收藏
- 关注作者
评论(0)