当我们在使用 Shifu 采集数据的时候,通常会出现从设备所采集到的数据,与我们所需要的数据格式不同的情况。为解决此问题,我们可以使用 Shifu + WasmEdge 实现把 Shifu 采集到的数据通过 WasmEdge 进行处理后再返回给我们的应用程序。
简介
本文将简单介绍如何将 WasmEdge 集成到 Shifu 中,从而实现从IoT设备上采集的数据的清洗。
以下为基本架构:
以下为本项目的数据流:
Shifu 简介
Shifu 为用户提供全场景设备托管与一体化软件开发的透明框架。开发者通过使用 Shifu,可以更简单地连接、监视和控制任何物联网设备。
Shifu 的创新优势是通过透明框架内的数字孪生技术,为设备赋予有思考能力的 “数字大脑”。数字孪生将反映设备的实时状态,对其进行开发操作等同于操作设备本身。物联网设备接入到 Shifu 中便会生成标准化接口,实现互联网互动,通过平台层对场景内所有设备、机器进行北向数据收集和南向指令管控。
Shifu 是基于Kube.NETes的云原生架构,创造性地将物联网设备对应为Kubernetes中的Pod,释放了物联网平台在边缘场景的设备管理能力以及云边端协同能力。云原生架构为物联网的应用开发提供了超高的系统稳定性,并提供给开发者仅运维一套架构实现对物联网的平台级维护。
Shifu 官方网站:https://shifu.run
WasmEdge 简介
WasmEdge 是轻量级、安全、高性能、符合 OCI 标准的软件容器与运行环境。目前是 CNCF 沙箱项目。WasmEdge 被应用在 Servrless SaaS、云原生,service mesh、边缘云、边缘设备、智能合约等领域。
WasmEdge 作为轻量级的容器,footprint 只有几兆,能够在资源受限的环境提供安全且不损失性能的运行环境。
嵌入式 Runtime 是 WasmEdge 的一个典型应用场景,WasmEdge 提供了 C/C++、Rust、 Golang 等 SDK,方便开发者将 WasmEdge 嵌入到 现有的应用软件中,从而将几乎任何应用软件变成可扩展的开发者平台。WasmEdge 作为嵌入到 Shifu 的轻量级容器,为 Shifu 提供了安全运行第三方不受信任代码的环境。
了解 WasmEdge 相关信息:
https://github.com/WasmEdge/WasmEdge
步骤
准备
kubectl v1.24.2
Docker 20.10.16
kind v0.14.0
git 2.36.1
部署
为了方便您更快的了解本篇文章,您可以通过以下命令从GitHub上拉取本项目。
git clone https://github.com/Edgenesis/wasm-shifu-demo.git
cd wasm-shifu-demo
创建 kind 集群
使用以下命令创建 Kind 集群。
$ kind delete cluster && kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.24.0)
✓ Preparing nodes
✓ Writing configuration
✓ Starting control-plane ️
✓ Installing CNI
✓ Installing StorageClass
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community
构建 Shifu 镜像
使用以下命令构建 Shifu 镜像。
$ make -f shifu/Makefile build-image-deviceshifu
$ kind load docker-image edgehub/deviceshifu-http-http:v0.0.6
$ docker images | grep edgehub/deviceshifu-http-http
edgehub/deviceshifu-http-http v0.0.6 1d6b3544b8ad 54 minutes ago 36.1MB
运行虚拟设备
为了方便您的体验,这里我们使用虚拟设备进行模拟。安装并运行虚拟设备,设备的端口号为8099。
$ docker build -f mockDevice/dockerfile -t mockdevice:v0.0.1 .
$ docker run -p 8099:8099 -itd mockdevice:v0.0.1
$ docker ps | grep mockdevice
bdfd2b1323be mockdevice:v0.0.1 "./mockDevice" 19 seconds ago Up 18 seconds 0.0.0.0:8099->8099/tcp admiring_feistel
编写规则,编译wasm
您可以通过使用 JAVAScript 编写规则。如果您不熟悉 JavaScript,您可以直接使用默认规则。
规则文件路径:
wasmEdge/js-func/src/js/run.js 您可以通过修改该规则实现不同的功能。
$ docker build -t wasm:v0.0.1 -f wasmEdge/js.dockerfile .
$ kind load docker-image wasm:v0.0.1
$ kubectl Apply -f wasmEdge/k8s
您可以通过以下命令检查 WasmEdge 的 pod 运行情况。
$ kubectl get pod -n wasmedge
NAME READY STATUS RESTARTS AGE
wasm-deployment-fbc9564d8-td428 1/1 Running 0 1s
安装并运行 Shifu
使用以下命令安装 shifu。
$ kubectl apply -f shifuConfig/shifu_install.yml
$ kubectl get pod -n shifu-crd-system
NAME READY STATUS RESTARTS AGE
shifu-crd-controller-manager-5bbdb4d786-s6h4m 2/2 Running 0 1s
安装 deviceShifu 与 mockDeivce 进行连接。在此之前,请先将
shifuConfig/task3/task3.yaml 文件中的 address 修改成您电脑的IP。
spec:
sku: "E93"
connection: Ethernet
address: "192.168.14.163:8099" #修改此处IP地址
通过一下命令,部署运行 deviceShifu 。
$ kubectl apply -f shifuConfig/task3
$ kubectl get pod -n deviceshifu
NAME READY STATUS RESTARTS AGE
deviceshifu-demodevice-deployment-5589b55569-l5nb2 1/1 Running 0 4s
体验
您可以启动一个 Nginx 与 deviceShifu 进行通信。
$ kubectl run nginx --image=nginx:1.21
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3s
通过以下命令,您即可与设备的数字孪生进行交互,从而实现从IoT设备上采集的数据的清洗。
$ kubectl exec -it nginx -- curl -v http://deviceshifu-demodevice-service.deviceshifu.svc.cluster.local/get_info;echo
[
{
"code":375287,
"name":"大气温度",
"val":"24.56",
"unit":"℃",
"exception":"温度过高"
},
{
"code":375287,
"name":"大气湿度",
"val":"81.63",
"unit":"%RH",
"exception":"湿度过高"
}
]
同时我们可以使用以下命令查看IoT设备所产生的原始数据。
$ curl localhost:8099/getInfo
{
"statusCode":"200",
"message":"success",
"entity":[
{
"dateTime":"2022-09-09 09:46:45",
"eUnit":"℃",
"eValue":"23.87",
"eKey":"e1",
"eName":"大气温度",
"eNum":"101"
},
{
"dateTime":"2022-09-09 09:46:45",
"eUnit":"%RH",
"eValue":"80.62",
"eKey":"e2",
"eName":"大气湿度",
"eNum":"102"
}
],
"deviceId":950920,
"deviceName":"950920",
"deviceRemark":"2022-09-09 09:46:45"
}
比较两个输出,我们成功地将数据采集并进行清洗,从而得到我们想要的数据。