1. 程式人生 > 實用技巧 >如何編寫程式碼實現資料通過edgexfoundry上傳mqtt雲伺服器

如何編寫程式碼實現資料通過edgexfoundry上傳mqtt雲伺服器

寫在前面:這篇教程是參考官方文件中EdgeX Foundry Hands On Tutorial

實現的,用到的工具有:Ubuntu系統(安裝了docker和docker-compose)、postman工具以及MQTTBox工具mqtt服務搭建教程)

資料不是由真實的感測器裝置採集,而是採用python程式生成隨機數,我也是物聯網方面的小白,所有程式碼都是依葫蘆畫瓢,如有錯誤或弱智操作的地方請直接評論區指出,不勝感激!

  • *你可以按照我的步驟依次生成檔案,也可以一次性下載完全部檔案,這裡給出一個下載全部檔案的地址:EdgeX_Tutorial

一、建立資料夾

下載docker-compose檔案,拉取映象

mkdir geneva1
cd geneva1

這裡給出一個docker-compose地址:(這個docker-compose檔案是教程中的,和官方正式專案的docker-compose檔案有所區別,沒有ui等功能,不知道正式專案的檔案可不可以,後面再試試)

docker-compose

compose

下載後儲存在geneva1資料夾中,改名為:docker-compose.yml

拉取映象:

docker-compose up
之後再
docker-compose ps驗證一下

如圖:

二、建立裝置

建立裝置分為三個步驟

  • 建立 value descriptors
  • 上傳 device profile
  • 建立device

2.1 建立 value descriptors

value descriptors描述了Edgex的資料格式和標籤,我們的資料只是單純的隨機數,使用postman建立

postman 模式選擇post

http://<edgex ip>:48080/api/v1/valuedescriptor

將Body設定為“raw”和“JSON”(後面再解釋原因)

{
    "name": "number",
    "description": "Random number",//描述 隨便寫
    "min": "0",
    "max": "200",
    "type": "Int64",
    "uomLabel": "number1",
    "defaultValue": "0",
    "formatting": "%s",
    "labels": [
        "aaaaa",
        "bbbbb"
    ]
}

若沒有問題的會生成一串ID,不用記住,只知道代表成功就行

你的資料如果有多個屬性的話 ,把body的描述的內容改一改,再多post幾次。

2.2上傳 device profile

device profile(裝置配置檔案)本質上是描述裝置、其資料格式和支援的命令的模板。它是一個以YAML格式編寫的文字檔案,上載到EdgeX,以後每當建立新裝置時都會引用它。每個裝置型別只需要一個配置檔案。同樣 我們也是用postman上傳

postman 模式選擇post

http://<edgex ip>:48081/api/v1/deviceprofile/uploadfile

最後如圖:

這裡給出number_porduce.yaml(依葫蘆畫瓢,勿噴)

name: "number_produce"                             // 記住這個名字
manufacturer: "liu"
model: "aaaa"
labels:
  - "rpi"  //我也不知道為啥是rpi
description: "suiji chansheng shuzi"

deviceResources:
      - name: number
        description: "suiji chansheng shuzi"
        properties:
            value:
             { type: "Int64", readWrite: "RW", minimum: "0", maximum: "100", size: "4", LSB: "true", defaultValue: "0"}

若沒有問題的會生成一串ID。

2.3 建立device

因為我們是用rest生成的裝置,所以使用裝置服務“edgex device rest”

postman 模式選擇post

http://<edgex ip>:48081/api/v1/device

body為

{
    "name": "number_device",
    "description": "suijishushengcheng",
    "adminState": "unlocked",
    "operatingState": "enabled",
    "protocols": {
        "example": {
            "host": "dummy",
            "port": "1234",
            "unitID": "1"
        }
    },
    "labels": [
        "suijishu"
    ],
    "location": "Tokyo",
    "service": {
        "name": "edgex-device-rest"
    },
    "profile": {
        "name": "number_produce"       //對應上面number_porduce.yaml的name
    }
}

若沒有問題的會生成一串ID。

三、上傳資料

3.1 首先隨便建立一個資料夾,建立python虛擬環境

  • sudo apt install python3-venv -y
  • . ./venv/bin/activate
  • pip install requests

3.2 把用於生成資料的python檔案拷進去 (getData.py)

//getData.py
import requests
import json
import random
import time

edgexip = 'xxx.xxx.xxx.xxx'//改成你自己執行edgex的ip
number = 66

def generateSensorData(number): 
    number = random.randint(number-5,number+5)
    print("Sending nums: Value %s" % (number))

    return (number)

if __name__ == "__main__":
    sensorTypes = ["number"]
    while(1):
        (number) = generateSensorData(number)
        url = 'http://%s:49986/apurce/Temp_and_Humidity_sensor_cluster_01/humidity' % edgexip
        payload = number
        headers = {'content-type': 'application/json'}
        response = requests.post(url, data=json.dumps(payload), headers=headers, verify=False)
        
        time.sleep(3)

3.3 python3 ./genSensorData.py

如圖:

四、將資料匯出到mqtt伺服器

這裡我們選擇的是使用kuiper規則引擎將資料匯出,還可以使用APP SERVICE匯出,具體可以去看官方文件

這裡簡單介紹一下kuiper規則引擎,有三個步驟:

  • 建立資料流,也就是你上傳的資料
  • 建立規則
  • 執行規則

4.1 建立資料流,使用postman

{
    "sql": "create stream number_test() WITH (FORMAT=\"JSON\", TYPE=\"edgex\")"
}

4.2 建立規則

{
    "id": "mqtt_export_rule1",
    "sql": "SELECT * FROM number_test",    ///  和上一步的名稱要相同
    "actions": [
        {
            "mqtt": {
                "server": "tcp://broker.hivemq.com:1883",           //mqtt共用伺服器地址
                "topic": "EdgeXFoundryMQTT_01",                //訂閱的主題
                "username": "someuser",
                "password": "somepassword",
                "clientId": "someclientid"
            }
        },
        {
            "log": {}
        }
    ]
}

4.3 開啟MQTTBox軟體

紅框中的就是上一步的伺服器地址,save儲存之後

訂閱的主題要和規則中的相同,接下來,你就會收到edgex發過來的資料了,這個資料格式就是之前的value description定義的

這只是實現簡單的資料上傳功能,後面我會繼續探索如何利用規則引擎處理傳過來的資料。會了再寫!