EdgeX Foundry試運行
EdgeX Foundry試運行
簡介
EdgeX Foundry是一個由Linux基金會發起的,且廠商中立的開源IoT邊緣計算項目。它可以採集來自多個源的數據,並將這些數據轉發到一個中央系統。EdgeX Foundry支援多種IoT設備使用的協議,如BACNET、OPC-UA、MQTT和REST。EdgeX Foundry由一系列運行在容器中的微服務構成,微服務之間使用REST API介面進行交互。
可以將EdgeX 作為一個上層服務和設備之間的媒介,例如,某個設備使用了BACNET協議,但上層服務並不支援該協議,此時可以使用EdgeX 將上層服務的REST API轉換為設備期望的協議和格式。
可以使用EdgeX 提供的規則功能,基於輸入創建動作觸發邏輯,如當值A大於X式,執行一個pre-set
命令。
通常會把EdgeX Foundry 安裝在離感測器或產生數據較近的位置,如一個邊緣網關應用附近。因此可能會安裝上千個EdgeX,每個EdgeX負責各自數據的採集、轉換和轉發工作。
更完整的介紹,參見官方文檔
安裝
版本發布
可以在wiki上查看EdgeX的發布情況,當前最新版本名為Hanio,下一個版本名為Ireland。本次使用的版本為Hanio。
最好使用已經發布的版本,官方的master分支可能不大穩定
部署
官方提供了使用docker-compose的安裝方式。官方git倉庫提供了所有版本的docker-compose文件,使用分支名區分:
EdgeX 提供了兩個可視化工具:portainer
和edgex-ui-go
。portainer
相當於一個簡單的容器管理平台,edgex-ui-go
相當於一個設備管理平台。
下載並運行docker-compose.yml即可,結果如下,最後兩個就是可視化工具portainer
和edgex-ui-go
查看設備
執行如下命令查看已有的設備:
# curl //127.0.0.1:48082/api/v1/device
更多參見EdgeX的官方API文檔。
創建設備
下面創建兩種設備:
感測器集群
:生成溫度和濕度數據一般設備
:使用REST介面,支援命令
後續使用兩種方式創建設備:
- 手動方式:使用單獨的REST命令創建感測器集群
- 腳本方式:使用Python腳本創建一般設備
EdgeX使用設備配置文件作為添加新設備的簡單方法。設備配置文件是一個描述設備、數據格式以及支援的命令的模板,它是一個文本文件,以YAML的格式上傳到EdgeX,並在後續創建新設備時引用。一種設備類型只能有一個配置文件。
感測器集群
使用EdgeX Foundry REST APIs手動創建該設備,也可以使用腳本方式創建。下面使用Postman發送REST 請求,步驟如下:
- 創建值描述資訊
- 上傳設備配置文件
- 創建設備
每一步操作都會用一個相同的主機IP地址,以及一個埠號。不同的埠號代表不同的微服務,例如:
- 48080:edgex-core-data
- 48081:edgex-core-metadata
- 48082:edgex-core-command
創建值描述資訊
值描述資訊會告訴EdgeX轉發的數據格式以及數據的標籤。本例中,值描述資訊分別給出了溫度和濕度的值。
首先創建與濕度有關的值描述,可以看到最後返回了一個id
# curl -X POST //127.0.0.1:48080/api/v1/valuedescriptor -d '{
"name": "humidity",
"description": "Ambient humidity in percent",
"min": "0",
"max": "100",
"type": "Int64",
"uomLabel": "humidity",
"defaultValue": "0",
"formatting": "%s",
"labels": [
"environment",
"humidity"
]
}'
83d8ba2c-d12e-4531-99e6-213c3c84a895
創建與溫度有關的值描述:
# curl -X POST //127.0.0.1:48080/api/v1/valuedescriptor -d '{
"name": "temperature",
"description": "Ambient temperature in Celsius",
"min": "-50",
"max": "100",
"type": "Int64",
"uomLabel": "temperature",
"defaultValue": "0",
"formatting": "%s",
"labels": [
"environment",
"temperature"
]
}'
0a8f5637-db7d-4108-8f48-03a116ad8726
可以使用curl //127.0.0.1:48080/api/v1/valuedescriptor|jq
查看已創建的值描述。
上傳設備配置文件
下載設備配置文件並上傳,可以看到也返回了一個Id’
# curl --location --request POST '//127.0.0.1:48081/api/v1/deviceprofile/uploadfile' --form 'file=@"/home/sensorClusterDeviceProfile.yaml"'
01373409-433d-4775-b7e1-4ede47daab80
可以使用curl //127.0.0.1:48081/api/v1/deviceprofile|jq
查看上傳的設備配置文件:
創建設備
在創建設備之前需要注意以下兩點:
- 設備(REST設備)依賴名為”edgex-device-rest”的設備服務
- 創建設備時使用的
profile.name
欄位必須與上傳的設備配置文件中的name
欄位”SensorCluster”相同
執行如下命令創建設備:
# curl -X POST //127.0.0.1:48081/api/v1/device -d '{
"name": "Temp_and_Humidity_sensor_cluster_01",
"description": "Raspberry Pi sensor cluster",
"adminState": "unlocked",
"operatingState": "enabled",
"protocols": {
"example": {
"host": "dummy",
"port": "1234",
"unitID": "1"
}
},
"labels": [
"Humidity sensor",
"Temperature sensor",
"DHT11"
],
"location": "Tokyo",
"service": {
"name": "edgex-device-rest"
},
"profile": {
"name": "SensorCluster"
}
}'
a687ea40-13ca-4ed3-bb00-140ae84344a1
向EdgeX Foundry發送數據
向EdgeX Foundry發送溫度和濕度數據:
# curl --request POST '//127.0.0.1:49986/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/temperature' --header 'Content-Type: text/plain' --data-raw '23'
# curl --request POST '//127.0.0.1:49986/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/humidity' --header 'Content-Type: text/plain' --data-raw '33'
使用curl //127.0.0.1:48080/api/v1/event/count/Temp_and_Humidity_sensor_cluster_01
查看該設備上的事件數:
讀取傳入的數據
# curl -X GET //localhost:48080/api/v1/reading/device/Temp_and_Humidity_sensor_cluster_01/100|jq
[
{
"id": "b72e2fde-fe8c-41ed-baa4-dab0155bc53d",
"created": 1622629900723,
"origin": 1622629900721518000,
"device": "Temp_and_Humidity_sensor_cluster_01",
"name": "humidity",
"value": "33",
"valueType": "Int64"
},
{
"id": "07b596c3-248a-4800-b0f6-6d5cb58964b6",
"created": 1622629813141,
"origin": 1622629813139238100,
"device": "Temp_and_Humidity_sensor_cluster_01",
"name": "temperature",
"value": "23",
"valueType": "Int64"
},
...
]
到此為止,數據已經傳入到EdgeX Foundry,短時間內會保存在Redis DB中。由於數據不會在邊緣設備中保存太久,因此需要配置如何導出數據。
導出數據
EdgeX 為多種雲服務和應用提供了exporters,為了簡化,下面使用社區提供的配置將EdgeX的數據發送到公開的MQTT broker(基於Hive MQ)。
下載docker-compose.yml並運行,按照前面的方式添加設備(可能需要清除docker volume
)。操作步驟可以見exporting-data。這樣在公開的MQTT broker上就可以看到自己發送的數據。
可以在consul的Key/Value中設置
![]()
執行docker logs -f edgex-app-service-configurable-rules
就可以查看數據發送日誌:
level=DEBUG ts=2021-06-02T14:54:39.641349729Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:54:39.642895079Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"
level=DEBUG ts=2021-06-02T14:54:42.359115397Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:54:42.359264279Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"
level=DEBUG ts=2021-06-02T14:55:36.565067194Z app=AppService-rules-engine source=runtime.go:59 msg="Processing message: 1 Transforms"
level=DEBUG ts=2021-06-02T14:55:36.565268032Z app=AppService-rules-engine source=outputdata.go:38 msg="Setting output data"
總結
EdgeX後續的Roadmap如下,其中下個版本Ireland
將會把API從v1升級為v2:
'Barcelona': October 2017
'California': July 2018
'Delhi': November 2018
'Edinburgh': July 2019
'Fuji': November 2019
'Geneva': ~ April 2020
'Hanoi': ~ October 2020
'Ireland': ~ June 2021
'Jakarta': ~ November 2021
'Kamakura': ~ April 2022
本文只是一個EdgeX的試用,並沒有深入講解內部實現。總體上看EdgeX可以看作是運行在邊緣設備周邊的適配器,負責協議轉換和數據的臨時存儲等。後續如果有機會涉及此方面工作再深入研究。
感謝Linux基金會以及該項目的貢獻者。