EdgeX Foundry試執行

charlieroro發表於2021-06-02

EdgeX Foundry試執行

簡介

image

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檔案,使用分支名區分:

image

EdgeX 提供了兩個視覺化工具:portaineredgex-ui-goportainer相當於一個簡單的容器管理平臺,edgex-ui-go相當於一個裝置管理平臺。

下載並執行docker-compose.yml即可,結果如下,最後兩個就是視覺化工具portaineredgex-ui-go

image

檢視裝置

執行如下命令檢視已有的裝置:

# curl http://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 http://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 http://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 http://127.0.0.1:48080/api/v1/valuedescriptor|jq檢視已建立的值描述。

上傳裝置配置檔案

下載裝置配置檔案並上傳,可以看到也返回了一個Id'

# curl --location --request POST 'http://127.0.0.1:48081/api/v1/deviceprofile/uploadfile' --form 'file=@"/home/sensorClusterDeviceProfile.yaml"'
01373409-433d-4775-b7e1-4ede47daab80

可以使用curl http://127.0.0.1:48081/api/v1/deviceprofile|jq檢視上傳的裝置配置檔案:

建立裝置

在建立裝置之前需要注意以下兩點:

  • 裝置(REST裝置)依賴名為"edgex-device-rest"的裝置服務
  • 建立裝置時使用的profile.name欄位必須與上傳的裝置配置檔案中的name欄位"SensorCluster"相同

執行如下命令建立裝置:

# curl -X POST http://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 'http://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 'http://127.0.0.1:49986/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/humidity' --header 'Content-Type: text/plain' --data-raw '33'

使用curl http://127.0.0.1:48080/api/v1/event/count/Temp_and_Humidity_sensor_cluster_01檢視該裝置上的事件數:

image

讀取傳入的資料

# curl -X GET http://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上就可以看到自己傳送的資料。

image

可以在consul的Key/Value中設定

image

執行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基金會以及該專案的貢獻者。

參考

相關文章