树莓派4B上运行opcua协议DEMO接入kubeedge
一、KubeEdge简介
KubeEdge是个还不错的边缘云平台。能够支持边缘设备的接入和管理。
KubeEdge由以下组件组成:
- Edged: 在边缘节点上运行并管理容器化应用程序的代理。
- EdgeHub: Web套接字客户端,负责与Cloud Service进行交互以进行边缘计算(例如KubeEdge体系结构中的Edge Controller)。这包括将云侧资源更新同步到边缘,并将边缘侧主机和设备状态变更报告给云。
- CloudHub: Web套接字服务器,负责在云端缓存信息、监视变更,并向EdgeHub端发送消息。
- EdgeController: kubernetes的扩展控制器,用于管理边缘节点和pod的元数据,以便可以将数据定位到对应的边缘节点。
- EventBus: 一个与MQTT服务器(mosquitto)进行交互的MQTT客户端,为其他组件提供发布和订阅功能。
- DeviceTwin: 负责存储设备状态并将设备状态同步到云端。它还为应用程序提供查询接口。
- MetaManager: Edged端和Edgehub端之间的消息处理器。它还负责将元数据存储到轻量级数据库(SQLite)或从轻量级数据库(SQLite)检索元数据。
设备管理部分的原理如下图所示:
https://kubeedge.io/zh/docs/kubeedge_zh/
二、云端设备的数据存储
model就是设备模型。
Device Model
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:name: opcua-modelnamespace: default
spec:properties:- name: temperaturedescription: temperature in degree celsiustype:int:accessMode: ReadOnlydefaultValue: 1- name: switcherdescription: turn on or turn offtype:boolean:accessMode: ReadWrite
instance就是设备实例,指某一台具体的设备。
Device Instance
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:name: lamp-opcualabels:model: opcua-model
spec:deviceModelRef:name: opcua-modelprotocol:opcua:url: opc.tcp://192.168.137.100:4840/userName: testuserpassword: ""password: /ca/passcertificate: /ca/clientcert.pemprivateKey: /ca/clientkey.pemsecurityMode: NonesecurityPolicy: ""common:customizedValues:remoteCertificate: /ca/servercert.pemnodeSelector:nodeSelectorTerms:- matchExpressions:- key: ''operator: Invalues:- rpi4b2.1propertyVisitors:- propertyName: temperatureopcua:nodeID: ns=3;i=2002 #node1- propertyName: switcheropcua:nodeID: ns=3;i=2003 #node2
status:twins:- propertyName: switcherreported:metadata:timestamp: '1550049403598'type: booleanvalue: "false"desired:metadata:timestamp: '1550049403598'type: booleanvalue: "false"- propertyName: temperaturereported:metadata:timestamp: '1550049403598'type: integervalue: "0"
fhttps://kubeedge.io/zh/docs/developer/device_crd/
Mapper用于进行协议转换,实现Kubeedge对各类协议的支持。
Device Mapper
Mapper is an application that is used to connect and control devices. Following are the responsibilities of mapper:
1) Scan and connect to the device.
2) Report the actual state of twin-attributes of device.
3) Map the expected state of device-twin to actual state of device-twin.
4) Collect telemetry data from device.
5) Convert readings from device to format accepted by KubeEdge.
6) Schedule actions on the device.
7) Check health of the device.
总之就是读取设备数据,发送指令,与设备打交道的。
不同的设备支持不同的协议,目前实现的几种协议在这个项目中:
https://github.com/kubeedge/mappers-go
三、OPCUA DEMO 运行
下载 https://github.com/kubeedge/mappers-go
进入 mappers/opcua目录
make mapper opcua package ARM64=true
Dockfile进行了些许修改
FROM ubuntu:20.04RUN mkdir -p kubeedge
RUN mkdir -p ca
COPY ./ca/* /ca/
RUN ls /caCOPY ./bin/opcua kubeedge/
COPY ./config.yaml kubeedge/WORKDIR kubeedge
ENTRYPOINT ["/kubeedge/opcua", "--v", "5"]
编译并生成镜像opcua-mapper
root@uvm1:~/work/mappers-go/mappers/opcua# make mapper opcua package ARM64=true
opcua package
# make mapper opcua package
downloading dependencies for mapper opcua...
tidying
vending
...done
fmt and linting mapper opcua...
...done
crossed packaging for linux/arm64
building linux/arm64
...done
packaging mapper opcua...
crossed packaging for linux/arm64
packaging opcua-mapper:v1.0-linux-arm64
Sending build context to Docker daemon 95.07MB
Step 1/9 : FROM ubuntu:20.04---> d25e19480966
Step 2/9 : RUN mkdir -p kubeedge---> Using cache---> 184c2c6417ac
Step 3/9 : RUN mkdir -p ca---> Using cache---> c5eb93feeab0
Step 4/9 : COPY ./ca/* /ca/---> Using cache---> 3e3c53d9c9a7
Step 5/9 : RUN ls /ca---> Using cache---> 3f2c57f65659
Step 6/9 : COPY ./bin/opcua kubeedge/---> Using cache---> d4185abacf94
Step 7/9 : COPY ./config.yaml kubeedge/---> Using cache---> 612e41c13320
Step 8/9 : WORKDIR kubeedge---> Using cache---> 125000909f46
Step 9/9 : ENTRYPOINT ["/kubeedge/opcua", "--v", "5"]---> Using cache---> 0811ee8d139c
Successfully built 0811ee8d139c
Successfully tagged opcua-mapper:v1.0-linux-arm64
...done
docker images 查看镜像
root@uvm1:~/work/mappers-go/mappers/opcua# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
opcua-mapper v1.0-linux-arm64 0811ee8d139c About an hour ago 72.3MB
<none> <none> 23a240215cc8 3 days ago 72.3MB
<none> <none> 46b34807de81 3 days ago 72.3MB
<none> <none> 72db7f8d0bb4 7 days ago 101MB
由于镜像是边缘端使用的,还要将镜像导出,传输到边缘上再导入。也可以直接在边缘上编译并生成镜像。
docker save -o opcua-mapper-arm64.tar opcua-mapper:v1.0-linux-arm64
编写 crd/model.yaml crd/instance.yaml
从build/crd-samples/devices这个目录下把opcua的两个Yaml文档拿出来放在crd,opcua-model.yaml作为model.yaml
opcua-device.yaml作为 instance.yaml 具体内容见上面。
我的边缘的节点名为rpi4b2.1 ,各位可以按照需求进行修改 。
用以下命令部署APP:
$ kubectl apply -f crd/model.yaml
$ kubectl apply -f crd/instance.yaml#deploy opcua mapper
$ kubectl apply -f deploy.yaml
model.yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:name: opcua-modelnamespace: default
spec:properties:- name: temperaturedescription: temperature in degree celsiustype:int:accessMode: ReadOnlydefaultValue: 1- name: switcherdescription: turn on or turn offtype:boolean:accessMode: ReadWrite
instance.yaml的内容:
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:name: lamp-opcualabels:model: opcua-model
spec:deviceModelRef:name: opcua-modelprotocol:opcua:url: opc.tcp://192.168.137.100:4840/userName: testuserpassword: ""password: /ca/passcertificate: /ca/clientcert.pemprivateKey: /ca/clientkey.pemsecurityMode: NonesecurityPolicy: ""common:customizedValues:remoteCertificate: /ca/servercert.pemnodeSelector:nodeSelectorTerms:- matchExpressions:- key: ''operator: Invalues:- rpi4b2.1propertyVisitors:- propertyName: temperatureopcua:nodeID: ns=3;i=2002- propertyName: switcheropcua:nodeID: ns=3;i=2003
status:twins:- propertyName: switcherreported:metadata:timestamp: '1550049403598'type: booleanvalue: "false"desired:metadata:timestamp: '1550049403598'type: booleanvalue: "false"- propertyName: temperaturereported:metadata:timestamp: '1550049403598'type: integervalue: "0"
deploy.yaml的内容:
apiVersion: apps/v1
kind: Deployment
metadata:name: opcua-mapper
spec:replicas: 1selector:matchLabels:app: opcuamappertemplate:metadata:labels:app: opcuamapperspec:nodeName: rpi4b2.1 ## 这个地方节点名字要修改hostNetwork: truecontainers:- name: opcua-mapper-containerimage: opcua-mapper:v1.0 ## 这个我修改了一下,与我的容器名相符imagePullPolicy: IfNotPresentsecurityContext:privileged: truevolumeMounts:- name: config-volumemountPath: /opt/kubeedge/nodeSelector:opcua: "true"volumes:- name: config-volumeconfigMap:name: device-profile-config-rpi4b2.1 ##这个地方要注意restartPolicy: Always
在云端可以看到:
在边端设备上可以看到容器已经在运行了:
~ # docker ps
如果opcua-mapper没有在运行,需要查看程序运行日志,进行排错。
最常见的错误是opcua服务器连接的问题。
三、opcua server模拟器
在边缘节点上访问opcua server。
目前可用的opcua 模拟器是Prosys OPC UA模拟服务器。
http://www.prosysopc.cn/products/opc-ua-simulation-server/
这个软件对个人使用是免费的,可以在csdn上搜索并下载。
运行界面:
具体值的模拟界面:
目前还未解决的是Prosys OPC UA模拟服务器好像不支持数据写入,就是opcua客户端通过opcua协议修改模拟器上的数据。
前期比较容易出的问题是连接不上opcua服务器,可以在边缘端编译运行,opuca的程序,查看程序运行结果。
https://github.com/kubeedge/mappers-go/tree/main/mappers/opcua
四、在云端查看数据
用下面的命令查看device的值。
root@uvm1:~/work/mappers-go/mappers/opcua# kubectl get devices lamp-opcua -o yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"devices.kubeedge.io/v1alpha2","kind":"Device","metadata":{"annotations":{},"labels":{"model":"opcua-model"},"name":"lamp-opcua","namespace":"default"},"spec":{"deviceModelRef":{"name":"opcua-model"},"nodeSelector":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"","operator":"In","values":["rpi4b2.1"]}]}]},"propertyVisitors":[{"opcua":{"nodeID":"ns=3;i=2002"},"propertyName":"temperature"},{"opcua":{"nodeID":"ns=3;i=2003"},"propertyName":"switcher"}],"protocol":{"common":{"customizedValues":{"remoteCertificate":"/ca/servercert.pem"}},"opcua":{"certificate":"/ca/clientcert.pem","password":"/ca/pass","privateKey":"/ca/clientkey.pem","securityMode":"None","securityPolicy":"","url":"opc.tcp://192.168.137.100:4840/","userName":"testuser"}}},"status":{"twins":[{"desired":{"metadata":{"timestamp":"1550049403598","type":"boolean"},"value":"false"},"propertyName":"switcher","reported":{"metadata":{"timestamp":"1550049403598","type":"boolean"},"value":"false"}},{"propertyName":"temperature","reported":{"metadata":{"timestamp":"1550049403598","type":"integer"},"value":"0"}}]}}creationTimestamp: "2022-06-17T04:04:09Z"generation: 729labels:model: opcua-modelmanagedFields:- apiVersion: devices.kubeedge.io/v1alpha2fieldsType: FieldsV1fieldsV1:f:metadata:f:annotations:.: {}f:kubectl.kubernetes.io/last-applied-configuration: {}f:labels:.: {}f:model: {}f:spec:.: {}f:deviceModelRef:.: {}f:name: {}f:nodeSelector:.: {}f:nodeSelectorTerms: {}f:propertyVisitors: {}f:protocol:.: {}f:common:.: {}f:customizedValues:.: {}f:remoteCertificate: {}f:opcua:.: {}f:certificate: {}f:password: {}f:privateKey: {}f:securityMode: {}f:securityPolicy: {}f:url: {}f:userName: {}f:status: {}manager: kubectloperation: Updatetime: "2022-06-21T02:29:09Z"- apiVersion: devices.kubeedge.io/v1alpha2fieldsType: FieldsV1fieldsV1:f:status:f:twins: {}manager: cloudcoreoperation: Updatetime: "2022-06-21T02:39:53Z"name: lamp-opcuanamespace: defaultresourceVersion: "22666744"selfLink: /apis/devices.kubeedge.io/v1alpha2/namespaces/default/devices/lamp-opcuauid: cb57e60a-4c80-4b49-a461-2706f7fffc40
spec:deviceModelRef:name: opcua-modelnodeSelector:nodeSelectorTerms:- matchExpressions:- key: ""operator: Invalues:- rpi4b2.1propertyVisitors:- opcua:nodeID: ns=3;i=2002propertyName: temperature- opcua:nodeID: ns=3;i=2003propertyName: switcherprotocol:common:customizedValues:remoteCertificate: /ca/servercert.pemopcua:certificate: /ca/clientcert.pempassword: /ca/passprivateKey: /ca/clientkey.pemsecurityMode: NonesecurityPolicy: ""url: opc.tcp://192.168.137.100:4840/userName: testuser
status:twins:- desired:metadata:timestamp: "1550049403598"type: booleanvalue: "false"propertyName: switcherreported:metadata:timestamp: "1655779193063"type: booleanvalue: "true"- desired:value: ""propertyName: temperaturereported:metadata:timestamp: "1655779193079"type: stringvalue: "17"
树莓派4B上运行opcua协议DEMO接入kubeedge相关推荐
- 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)
[树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...
- 树莓派4B的引脚控制简单demo
淘宝上的店家提供了很多示例程序,这里只拿一种来演示下,借此熟悉下如何用c或者python环境去操作树莓派.前提配置见我的之前的系列博客 树莓派4B基础软硬件环境搭建_jiugeshao的专栏-CSDN ...
- 如何将PaddleDetection模型在树莓派4B上部署?
[飞桨开发者说]侯继旭,海南师范大学本三自动化专业在读,人工智能开发爱好者,曾获2019中国高校计算机大赛-人工智能创意赛海南省一等奖.2019年度海南省高等学校科学研究"人工智能" ...
- 【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)
目录 0.前言 1.我的环境 2.整个流程 3.具体过程 3.1 训练自己的yolov5模型 3.2 将.pt模型转换为.onnx模型 3.3 在本地将.onnx转换成IR模型 3.4 在树莓派4B上 ...
- 树莓派4B上配置Opencv
按照前面博客下载opencv的源码,放入到树莓派4B上 这里选择的版本是opencv3.4.4.如下配置一些前提库 sudo apt-get install build-essential sudo ...
- 树莓派4b上安装tensorflow+keras
折腾了一天,总算在树莓派4b上安好了ML的环境,记录如下: 事先声明,树莓派上跑ML真的性能不太行,即使是系列最强的4b4G版. 我也只是为了测试性能(闲得蛋疼 )才来试一下来着: 大部分的方法参考了 ...
- 树莓派安装python3.8_python-在树莓派3上运行librosa和numba
我正在尝试在树莓派3上运行librosa. 经过数小时的搜索,我终于可以安装它了,但是当我尝试导入它时仍然抛出错误.首先,我在安装依赖项llvmlite时遇到问题.我终于用以下代码安装了它:conda ...
- Yolo-FastestV2在树莓派4B上的MNN移植记录
致谢 Yolo-FastestV2 https://github.com/dog-qiuqiu/Yolo-FastestV2/, 非常感谢作者的分享! 模型准备 首先,下载代码,根据要求训练,或者直接 ...
- 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125188715 红胖子(红模仿)的博文大全:开发技术集 ...
最新文章
- [Android Pro] 分析 Package manager has died
- blob转file对象_C++核心准则C.41:构造函数生成的对象应该被完全初始化
- 一周一论文(翻译 总结)— [Eursys 17] RFP When RPC is Faster than Server-Bypass with RDMA
- 11个三相异步电动机常见故障与维修方法。
- Functor、Applicative 和 Monad x
- java 九大行星运行_九大行星运行周期!
- html点击波,Material Design风格按钮点击波动画效果
- php查询数据方法,php查询数据库的方法
- 移动互联网APP测试流程及测试点(转载)(一)
- 好用的一些 git 命令
- 新东方王江涛十天背单词法(艾宾浩斯记忆曲线)(适用于各阶段各种记忆背诵类的知识点,许多人成功上岸)
- tomcat之servlet容器
- TI的C64X系列的DSPLib实现fft
- 5G通信光模块是什么?5G通信光模块的发展方向如何?
- 微信wifi认证的实现方式和功能——时讯wifi认证
- Java 存牌洗牌发牌看牌
- mac清理软件哪个好用?五大Mac Cleaner介绍推荐
- 51单片机rtx51-Tiny嵌入式实时操作系统初试
- android滑动冲突的解决方案
- 打印机计算机不在同一个工作组,不在一个工作组的两台电脑怎么实现打印共享?...