本文對官方示例 temperature 進行實驗。
功能說明
本示例主要是演示在雲端獲取邊緣端的設備狀態。
編譯
本文對官方示例進行了修改。此處給出修改描述,詳情參考修改後的源碼。
1、參考 led 示例,新加 Makefile,修改 Dockerfile。
2、修改源碼,去掉與硬件操作相關的函數,將採集的溫度值 temperature 累加以觀察其變化。
3、製作鏡像,提交鏡像。
3、修改 crds 和 deployment.yaml 文件,指定調度節點名稱。
實驗
部署:
kubectl apply -f crds/
kubectl apply -f deployment.yaml
查看pod:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
temperature-mapper-77fb74f5-vzztl 1/1 Running 0 5m10s
在邊緣商查看日誌:
# docker logs ecc3ba6a29dc
2020-03-22T09:11:51.777 [ main] INFO Sensor = DHT11: Temperature = 74*C, Humidity = 85% (retried 1 times)
2020-03-22T09:11:56.778 [ main] INFO Sensor = DHT11: Temperature = 75*C, Humidity = 85% (retried 1 times)
2020-03-22T09:12:01.778 [ main] INFO Sensor = DHT11: Temperature = 76*C, Humidity = 85% (retried 1 times)
在雲端觀察:
kubectl get device temperature1 -oyaml -w
輸出示例:
apiVersion: devices.kubeedge.io/v1alpha1
kind: Device
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"devices.kubeedge.io/v1alpha1","kind":"Device","metadata":{"annotations":{},"labels":{"description":"temperature","manufacturer":"test"},"name":"temperature1","namespace":"default"},"spec":{"deviceModelRef":{"name":"temperature-model"},"nodeSelector":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"","operator":"In","values":["latelee1"]}]}]}},"status":{"twins":[{"desired":{"metadata":{"type":"string"},"value":""},"propertyName":"temperature-status"}]}}
creationTimestamp: "2020-03-22T09:04:18Z"
generation: 77
labels:
description: temperature
manufacturer: test
name: temperature1
namespace: default
resourceVersion: "29280"
selfLink: /apis/devices.kubeedge.io/v1alpha1/namespaces/default/devices/temperature1
uid: e9869339-6d9b-4bf3-bf9f-c6191efeedc7
spec:
deviceModelRef:
name: temperature-model
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: ""
operator: In
values:
- latelee1
status:
twins:
- desired:
metadata:
type: string
value: ""
propertyName: temperature-status
reported:
metadata:
timestamp: "1584868316781"
type: string
value: 75C // !!!! 此值會變化
源碼研究
流程:
1、連接 mqtt:connectToMqtt,故需要邊緣端開啓 mqtt 服務,並監聽 1883 端口。
2、採集溫度:ReadDHTxxWithContextAndRetry,本例註釋。
3、將溫度值發佈到mqtt:publishToMqtt。
4、之後進入 KubeEdge 系統,在雲端可查看狀態。
其它說明:
發佈主題指定如下
deviceTwinUpdate := "$hw/events/device/" + "temperature" + "/twin/update"
temperature 爲設備名稱。需要與 Device 中的 metadata.name 保持一致。此名稱也是 kubectl get device
查看到的名稱。可修改使其不一致,觀察效果。
發佈消息前先創建消息體:createActualUpdateMessage,結構體爲 DeviceTwinUpdate,具體如下:
map[string]*MsgTwin{"temperature-status": {Actual: &TwinValue{Value: &actualValue}, Metadata: &TypeMetadata{Type: "Updated"}}}
查看device.yaml:
status:
twins:
- propertyName: temperature-status
desired:
metadata:
type: string
value: ''
目前看,部分對應起來,深層理論待研究。