寫在前面:這篇教程是參考官方文檔中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等功能,不知道正式項目的文件可不可以,后面再試試)
下載后保存在geneva1文件夾中,改名為:docker-compose.yml
拉取鏡像:
docker-compose up -d
之后再
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"
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
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
如圖:
四、將數據導出到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定義的
這只是實現簡單的數據上傳功能,后面我會繼續探索如何利用規則引擎處理傳過來的數據。會了再寫!