一、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相关推荐

  1. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  2. 树莓派4B的引脚控制简单demo

    淘宝上的店家提供了很多示例程序,这里只拿一种来演示下,借此熟悉下如何用c或者python环境去操作树莓派.前提配置见我的之前的系列博客 树莓派4B基础软硬件环境搭建_jiugeshao的专栏-CSDN ...

  3. 如何将PaddleDetection模型在树莓派4B上部署?

    [飞桨开发者说]侯继旭,海南师范大学本三自动化专业在读,人工智能开发爱好者,曾获2019中国高校计算机大赛-人工智能创意赛海南省一等奖.2019年度海南省高等学校科学研究"人工智能" ...

  4. 【全流程】从头在树莓派4B上部署自己训练的yolov5模型(配合NCS2加速)

    目录 0.前言 1.我的环境 2.整个流程 3.具体过程 3.1 训练自己的yolov5模型 3.2 将.pt模型转换为.onnx模型 3.3 在本地将.onnx转换成IR模型 3.4 在树莓派4B上 ...

  5. 树莓派4B上配置Opencv

    按照前面博客下载opencv的源码,放入到树莓派4B上 这里选择的版本是opencv3.4.4.如下配置一些前提库 sudo apt-get install build-essential sudo ...

  6. 树莓派4b上安装tensorflow+keras

    折腾了一天,总算在树莓派4b上安好了ML的环境,记录如下: 事先声明,树莓派上跑ML真的性能不太行,即使是系列最强的4b4G版. 我也只是为了测试性能(闲得蛋疼 )才来试一下来着: 大部分的方法参考了 ...

  7. 树莓派安装python3.8_python-在树莓派3上运行librosa和numba

    我正在尝试在树莓派3上运行librosa. 经过数小时的搜索,我终于可以安装它了,但是当我尝试导入它时仍然抛出错误.首先,我在安装依赖项llvmlite时遇到问题.我终于用以下代码安装了它:conda ...

  8. Yolo-FastestV2在树莓派4B上的MNN移植记录

    致谢 Yolo-FastestV2 https://github.com/dog-qiuqiu/Yolo-FastestV2/, 非常感谢作者的分享! 模型准备 首先,下载代码,根据要求训练,或者直接 ...

  9. 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125188715 红胖子(红模仿)的博文大全:开发技术集 ...

最新文章

  1. [Android Pro] 分析 Package manager has died
  2. blob转file对象_C++核心准则C.41:构造函数生成的对象应该被完全初始化
  3. 一周一论文(翻译 总结)— [Eursys 17] RFP When RPC is Faster than Server-Bypass with RDMA
  4. 11个三相异步电动机常见故障与维修方法。
  5. Functor、Applicative 和 Monad x
  6. java 九大行星运行_九大行星运行周期!
  7. html点击波,Material Design风格按钮点击波动画效果
  8. php查询数据方法,php查询数据库的方法
  9. 移动互联网APP测试流程及测试点(转载)(一)
  10. 好用的一些 git 命令
  11. 新东方王江涛十天背单词法(艾宾浩斯记忆曲线)(适用于各阶段各种记忆背诵类的知识点,许多人成功上岸)
  12. tomcat之servlet容器
  13. TI的C64X系列的DSPLib实现fft
  14. 5G通信光模块是什么?5G通信光模块的发展方向如何?
  15. 微信wifi认证的实现方式和功能——时讯wifi认证
  16. Java 存牌洗牌发牌看牌
  17. mac清理软件哪个好用?五大Mac Cleaner介绍推荐
  18. 51单片机rtx51-Tiny嵌入式实时操作系统初试
  19. android滑动冲突的解决方案
  20. 打印机计算机不在同一个工作组,不在一个工作组的两台电脑怎么实现打印共享?...

热门文章

  1. 星形孢菌素Staurosporine的生物学作用
  2. shell脚本启动停止程序
  3. 掌握 tar 命令让你秒变大牛
  4. Halcon 用点来拟合平面
  5. [苹果]苹果AppStore应用审核标准
  6. IE浏览器中选择本地文件
  7. [奥运] 冠军的付出与回报
  8. 【老照片智能修复软件】AKVIS Retoucher v9.5.1286 中文版
  9. 用什么软件做选课系统好啊
  10. 使用javaxMail发送邮件