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等功能,不知道正式项目的文件可不可以,后面再试试)
下载后保存在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定义的
这只是实现简单的数据上传功能,后面我会继续探索如何利用规则引擎处理传过来的数据。会了再写!