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

这只是实现简单的数据上传功能,后面我会继续探索如何利用规则引擎处理传过来的数据。会了再写!

原文地址:https://www.cnblogs.com/liu-ai-yu/p/14083058.html