當我們在使用 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"
}
比較兩個輸出,我們成功地將數據采集并進行清洗,從而得到我們想要的數據。
