如何編寫程式碼實現資料通過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等功能,不知道正式專案的檔案可不可以,後面再試試)
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定義的
這只是實現簡單的資料上傳功能,後面我會繼續探索如何利用規則引擎處理傳過來的資料。會了再寫!