• 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

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

  • 相关阅读:
    从 React Router 谈谈路由的那些事
    js中var、let、const区别
    关于Redux到底是个什么鬼
    git 中遇到的问题
    Delphi中BCD和Currency类型
    Mscomm控件安装问题 License information for TMSComm not found.
    以前的某个程序已在安装计算机上创建挂起的文件操作,运行安装程序之前必须重新启动计算机
    win7系统安装SQLServer2000的详细步骤(图文)
    Delphi判断字符串中是否包含汉字,并返回汉字位置
    Sql Server中判断表、列不存在则创建的方法[转]
  • 原文地址:https://www.cnblogs.com/liu-ai-yu/p/14083058.html
Copyright © 2020-2023  润新知