edgexfoundry編寫代碼實現數據上傳mqtt雲服務器


寫在前面:這篇教程是參考官方文檔中EdgeX Foundry Hands On Tutorial實現的,用到的工具有:Ubuntu系統(安裝了docker和docker-compose)、postman工具以及MQTTBox工具mqtt服務搭建教程)

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

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

一、創建文件夾

下載docker-compose文件,拉取鏡像,(記得在275行左右將rulesengine微服務前的注釋取消掉)

mkdir geneva1
cd geneva1

這里給出一個docker-compose地址:(這個docker-compose文件是教程中的,和官方正式項目的docker-compose文件有所區別,沒有ui等功能,不知道正式項目的文件可不可以,后面再試試)

docker-compose

下載后保存在geneva1文件夾中,改名為:docker-compose.yml

拉取鏡像:

docker-compose up -d
之后再
docker-compose ps驗證一下

如圖:image-20201202170127867

二、創建設備

創建設備分為三個步驟

  • 創建 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,不用記住,只知道代表成功就行

image-20201202194915353

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

2.2上傳 device profile

device profile(設備配置文件)本質上是描述設備、其數據格式和支持的命令的模板。它是一個以YAML格式編寫的文本文件,上載到EdgeX,以后每當創建新設備時都會引用它。每個設備類型只需要一個配置文件。同樣 我們也是用postman上傳

postman 模式選擇post

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

image-20201202195954880

最后如圖:

image-20201202195604535

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

name: "number_produce"                             // 記住這個名字
manufacturer: "liu"
model: "aaaa"
labels:
  - "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
  • python3 -m venv venv
  • . ./venv/bin/activate
  • pip install requests

image-20201202201341442

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/api/v1/resource/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 ./getData.py

如圖:image-20201202201753117

四、將數據導出到mqtt服務器

這里我們選擇的是使用kuiper規則引擎將數據導出,還可以使用APP SERVICE導出,具體可以去看官方文檔

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

  • 創建數據流,也就是你上傳的數據
  • 創建規則
  • 執行規則

4.1 創建數據流,使用postman

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

image-20201202202525459

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": {}
        }
    ]
}

image-20201202202653297

4.3 打開MQTTBox軟件

image-20201202202920077

紅框中的就是上一步的服務器地址,save保存之后

image-20201202203040636

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

image-20201202174835280

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM