智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)

news2024/11/27 12:57:16

引言

随着城市化进程的加快,城市管理面临越来越多的挑战。智能城市管理系统的出现,为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统,涵盖系统功能、技术实现、环境搭建、代码示例及使用说明等内容。

系统功能

智能城市管理系统主要包括以下功能:

  1. 监控城市基础设施

    • 实时监控路灯、交通灯、垃圾桶等基础设施的状态。
    • 提供故障报警和维护建议。
  2. 优化城市资源使用

    • 根据实际需求动态调整路灯亮度。
    • 在高峰时段优化交通信号灯的切换策略。
  3. 数据展示与历史分析

    • 实时展示城市管理数据。
    • 提供历史数据的分析功能,帮助决策者优化管理策略。

技术实现

本智能城市管理系统的核心技术包括:

  • Node-RED:用于管理城市基础设施的控制逻辑。
  • Mosquitto:实现基础设施设备之间的通信。
  • InfluxDB:用于存储城市管理数据。
  • Grafana:用于展示和分析城市管理数据。
  • Python:进行数据处理和优化策略计算。

环境搭建

在开始实现智能城市管理系统之前,需要搭建相应的开发环境。以下是环境搭建的步骤:

  1. 安装 Node-RED

    npm install -g node-red
    
  2. 安装 Mosquitto

    • 在 Ubuntu 上,使用以下命令安装 Mosquitto:
    sudo apt install mosquitto mosquitto-clients
    
  3. 安装 InfluxDB

    • 下载并安装 InfluxDB,具体安装步骤请参考 InfluxDB 官方文档.
  4. 安装 Grafana

    • 下载并安装 Grafana,具体安装步骤请参考 Grafana 官方文档.
  5. 安装 Python 及相关库

    pip install paho-mqtt influxdb-client matplotlib numpy
    

系统架构

代码示例说明

1. Node-RED 流程

在上面提供的 Node-RED 流程示例中,我们创建了一个简单的流程来接收和处理来自基础设施设备的 MQTT 消息。下面是各个节点的详细说明:

[
    {
        "id": "mqtt_in",
        "type": "mqtt in",
        "z": "flow_id",
        "name": "设备状态",
        "topic": "city/infrastructure/status",
        "qos": "2",
        "datatype": "auto",
        "broker": "mqtt_broker",
        "x": 100,
        "y": 100,
        "wires": [["function_process"]]
    },
    {
        "id": "function_process",
        "type": "function",
        "z": "flow_id",
        "name": "处理状态",
        "func": "msg.payload = JSON.parse(msg.payload);\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 300,
        "y": 100,
        "wires": [["influxdb_out"]]
    },
    {
        "id": "influxdb_out",
        "type": "influxdb out",
        "z": "flow_id",
        "influxdb": "influxdb_config",
        "name": "存储到 InfluxDB",
        "measurement": "infrastructure_status",
        "x": 500,
        "y": 100,
        "wires": [[]]
    }
]
节点配置说明
  1. MQTT 输入节点 (mqtt_in)

    • 功能:此节点用于接收来自城市基础设施设备的状态消息。
    • 配置
      • 主题city/infrastructure/status,表示我们订阅的是基础设施设备的状态更新。
      • QoS:设置为 2,表示“至多一次传递”,确保消息的可靠性。
    • 输出:接收到的消息将传递到下一个节点(function_process)。
  2. 函数节点 (function_process)

    • 功能:此节点用于处理接收到的消息,将 JSON 格式的消息解析为 JavaScript 对象,以便进行后续处理。
    • 代码
      msg.payload = JSON.parse(msg.payload);
      return msg;
      
      • 这段代码将消息的负载(msg.payload)从字符串格式转换为 JavaScript 对象,以便更方便地访问其属性。
    • 输出:处理后的消息将发送到下一个节点(influxdb_out)。
  3. InfluxDB 输出节点 (influxdb_out)

    • 功能:此节点用于将处理后的数据存储到 InfluxDB 数据库中。
    • 配置
      • 测量名称infrastructure_status,表示我们将数据存储在名为 infrastructure_status 的测量中。
    • 输出:此节点没有后续连接,主要用于数据存储。

2. Python 数据处理示例

接下来,我们使用 Python 脚本进行数据处理和优化策略计算。以下是示例代码:

import paho.mqtt.client as mqtt
import json
from influxdb import InfluxDBClient

# InfluxDB 配置
influxdb_host = 'localhost'
influxdb_port = 8086
influxdb_database = 'city_management'

# 创建 InfluxDB 客户端
client = InfluxDBClient(host=influxdb_host, port=influxdb_port, database=influxdb_database)

# MQTT 回调函数
def on_message(client, userdata, message):
    # 解析消息
    data = json.loads(message.payload.decode())
    print("Received data:", data)

    # 数据存储到 InfluxDB
    influx_data = [
        {
            "measurement": "infrastructure_status",
            "tags": {
                "device": data["device"],
                "type": data["type"]
            },
            "fields": {
                "status": data["status"],
                "brightness": data.get("brightness", 0)  # 可选字段
            }
        }
    ]
    client.write_points(influx_data)
    print("Data written to InfluxDB")

# MQTT 客户端配置
mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect("localhost", 1883, 60)
mqtt_client.subscribe("city/infrastructure/status")

# 启动 MQTT 循环
mqtt_client.loop_forever()
代码说明
  • InfluxDB 配置

    • 定义了 InfluxDB 的连接参数,包括主机名、端口号和数据库名称。
    • 创建了 InfluxDB 客户端,用于与数据库进行交互。
  • MQTT 回调函数 (on_message)

    • 此函数在接收到 MQTT 消息时被调用。
    • 解析消息:使用 json.loads 将 JSON 数据解析为 Python 字典。
    • 数据存储
      • 创建一个包含测量名称、标签和字段的字典,准备将数据写入 InfluxDB。
      • 标签包括设备名称和类型,字段包括状态和亮度(如果存在)。
      • 使用 client.write_points(influx_data) 将数据写入 InfluxDB。
  • MQTT 客户端配置

    • 创建一个 MQTT 客户端实例,并设置消息回调函数。
    • 连接到 MQTT 代理(Mosquitto),并订阅 city/infrastructure/status 主题。
    • 启动 MQTT 循环,保持客户端在线并接收消息。

3. Grafana 数据展示

Grafana 是一个开源的数据可视化和监控工具,可以与 InfluxDB 等多种数据源集成,轻松创建动态仪表板和可视化图表。通过 Grafana,我们可以实时监控城市基础设施的状态和历史数据。

3.1 安装和配置 Grafana
  1. 安装 Grafana

    • 如果您尚未安装 Grafana,可以按照以下命令在 Ubuntu 上安装:
      sudo apt-get install -y software-properties-common
      sudo add-apt-repository -y ppa:grafana/stable
      sudo apt-get update
      sudo apt-get install grafana
      
    • 也可以访问 Grafana 官方网站 下载适合您操作系统的安装包。
  2. 启动 Grafana

    sudo systemctl start grafana-server
    sudo systemctl enable grafana-server
    
    • 启动后,Grafana 默认运行在 http://localhost:3000
  3. 登录 Grafana

    • 打开浏览器,访问 http://localhost:3000
    • 默认用户名和密码均为 admin,首次登录后会要求您更改密码。
3.2 添加 InfluxDB 数据源
  1. 添加数据源

    • 在左侧菜单中,点击 Configuration (配置),然后选择 Data Sources (数据源)
    • 点击 Add data source (添加数据源),选择 InfluxDB
  2. 配置 InfluxDB 数据源

    • 在数据源配置页面,填写以下信息:
      • HTTP URLhttp://localhost:8086
      • Databasecity_management
      • User 和 Password:如果您在 InfluxDB 中设置了用户名和密码,请填写相应信息。
    • 点击 Save & Test (保存并测试),确保 Grafana 能成功连接到 InfluxDB。
3.3 创建仪表板
  1. 创建新仪表板

    • 在左侧菜单中,点击 +,然后选择 Dashboard (仪表板)
    • 点击 Add new panel (添加新面板)
  2. 配置图表

    • 在面板编辑器中,选择 Query (查询) 选项卡。
    • 在 Data source (数据源) 下拉框中,选择之前添加的 InfluxDB 数据源。
    • 在 Query 输入框中,可以使用类似以下的查询:
      SELECT mean("status") FROM "infrastructure_status" WHERE $timeFilter GROUP BY time($__interval) fill(null)
      
      • 该查询从 infrastructure_status 测量中获取状态的平均值,并根据时间进行分组。
  3. 设置图表类型

    • 在右侧的 Panel 设置中,选择图表类型(例如,折线图、柱状图等)。
    • 可以自定义图表的标题、轴标签、颜色等。
  4. 保存仪表板

    • 完成图表配置后,点击右上角的 Save dashboard (保存仪表板),为仪表板命名并保存。

4. 使用说明

4.1 启动系统
  1. 启动 Mosquitto 代理

    sudo systemctl start mosquitto
    
  2. 启动 Node-RED

    node-red
    
  3. 启动 InfluxDB

    influxd
    
  4. 启动 Grafana

    sudo systemctl start grafana-server
    
4.2 模拟设备数据

为了测试整个系统,您可以使用一个简单的 Python 脚本来模拟城市基础设施设备发送状态消息。以下是一个简单的示例:

4.2 模拟设备数据

为了测试整个系统,您可以使用一个简单的 Python 脚本来模拟城市基础设施设备发送状态消息。以下是一个完整的示例代码:

import paho.mqtt.publish as publish
import json
import random
import time

# MQTT 配置
mqtt_broker = "localhost"
topic = "city/infrastructure/status"

while True:
    # 随机生成设备状态
    device_data = {
        "device": f"light_{random.randint(1, 10)}",  # 生成设备名称,如 light_1, light_2 等
        "type": "light",  # 设备类型
        "status": random.choice(["on", "off"]),  # 随机选择设备状态
        "brightness": random.randint(0, 100)  # 随机生成亮度值
    }

    # 将设备数据转换为 JSON 格式
    payload = json.dumps(device_data)

    # 发布 MQTT 消息
    publish.single(topic, payload, hostname=mqtt_broker)
    print(f"Published: {payload} to topic: {topic}")

    # 每隔 5 秒发送一次消息
    time.sleep(5)
代码说明
  • 导入库

    • paho.mqtt.publish:用于发布 MQTT 消息。
    • json:用于将数据转换为 JSON 格式。
    • random:用于生成随机数。
    • time:用于设置延时。
  • MQTT 配置

    • mqtt_broker:设置 MQTT 代理的地址,这里为 localhost
    • topic:消息发布的主题为 city/infrastructure/status
  • 无限循环

    • 使用 while True 创建一个无限循环,以便定期发布消息。
  • 随机生成设备数据

    • device:生成设备名称,格式为 light_x,其中 x 是随机生成的数字(1 到 10)。
    • type:设备类型,这里固定为 light
    • status:随机选择设备状态,可以是 on 或 off
    • brightness:随机生成亮度值,范围为 0 到 100。
  • 发布消息

    • 将生成的设备数据转换为 JSON 格式,并使用 publish.single() 方法将其发布到指定主题。
    • 每次发布后打印出发布的内容,方便调试。
  • 延时

    • 使用 time.sleep(5) 控制每隔 5 秒发送一次消息。这可以通过修改该值来调节发送频率。

4.3 观察数据流

  1. 运行模拟设备数据脚本

    • 在终端中运行上述模拟设备数据的 Python 脚本。您将看到脚本定期发布设备状态消息到 MQTT 代理。
    python simulate_device.py
    
  2. 观察 Node-RED 流程

    • 打开 Node-RED 的浏览器界面(通常为 http://localhost:1880)。
    • 查看 Node-RED 流程的调试窗口,您将看到接收到的设备状态消息。
  3. 查看 InfluxDB 数据

    • 您可以使用 InfluxDB CLI 或者其他工具(如 Chronograf)查看存储在数据库中的数据,确保数据正确写入。
    influx
    USE city_management
    SELECT * FROM infrastructure_status
    
  4. 在 Grafana 中查看数据可视化

    • 打开 Grafana 的浏览器界面(通常为 http://localhost:3000),查看您创建的仪表板。
    • 您应该能够看到实时更新的图表,展示城市基础设施的状态变化。

5. 总结

通过本教程,我们搭建了一个简单的智能城市管理系统,使用了以下技术栈:

  • Node-RED:用于管理和处理城市基础设施的控制逻辑。
  • Mosquitto:作为 MQTT 代理,负责设备之间的通信。
  • InfluxDB:用于存储城市管理数据。
  • Grafana:用于实时展示和分析城市管理数据。
  • Python:用于模拟设备数据和进行数据处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【扒模块】DFF

图 医学图像分割任务 代码 import torch import torch.nn as nnfrom timm.models.layers import DropPath # 论文:D-Net:具有动态特征融合的动态大核,用于体积医学图像分割(3D图像任务) # https://arxiv.org/abs/2403…

[C#]基于wpf实现的一百多种音色的Midi键盘软件

键盘 音色库 源码地址:https://download.csdn.net/download/FL1623863129/89599322

前端必知必会-html表单的基本使用

文章目录 HTML 表单<form> 元素<input> 元素文本字段<label> 元素单选按钮复选框提交按钮<input> 的 Name 属性总结 HTML 表单 HTML 表单用于收集用户输入。用户输入通常发送到服务器进行处理。 <form> 元素 HTML <form> 元素用于创建 H…

无人机环保行业解决方案-河道自动巡检

搭配大疆机场&#xff0c;智能化巡检 轻量一体化设计 相较于其他市面产品&#xff0c;大疆机场更加小巧&#xff0c;占地面积不足1平方米。 展开状态&#xff1a;长1675 mm&#xff0c;宽895 mm&#xff0c;高530mm&#xff08;不含气象站&#xff09; 闭合状态&#xff1a;…

C++之引用(详解,引用与指针的区别)

目录 1. 引⽤的概念和定义 2. 引⽤的特性 3. 引⽤的使⽤ 4. const引⽤ 5. 指针和引⽤的关系 1. 引⽤的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名(相当于是给变量起了个外号)&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c;它…

冷月大佬的EVA-GAN: 可扩展的音频生成GAN结构-论文阅读笔记

前言&#xff1a; 最近在调研asr和tts相关的内容&#xff0c;准备开始学习相关的经典工作&#xff0c;为了倒逼自己学进脑子&#xff0c;我尝试将这些看到的一些好的学习笔记分享出来。 萌新学徒&#xff0c;欢迎相关领域的朋友推荐学习路径和经典工作&#xff01;拜谢&#x…

idea 配置 Tomcat

一、状态栏找到 “ Preferences ” 二、 搜索栏输入“application”——>“Application Servers”——>“”号 三、 点击“Tomcat Sever” 四、 选择电脑中Tomcat所在位置——>OK 五、状态栏——>Run——>Edit Configurations 六、 点击&#xff1a;“ ”号 七…

对称密码体制的工作模式及标准解析

目录 1. 对称加密 2. 分组密码工作模式 2.1 ECB 2.2 CBC 2.3 CFB 2.4 OFB 2.5 CTR ​​​​​​​2.6 XTS 3. DES/3DES ​​​​​​​4. AES ​​​​​​​5. SM4 1. 对称加密 对称加密是一种发送方和接收方都使用相同密钥对数据进行加解密的方法。它只提供保密性…

Django的响应对象

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django的请…

支持向量机和梯度提升决策树

支持向量机&#xff08;SVM, Support Vector Machine&#xff09; 原理 支持向量机是一种监督学习模型&#xff0c;适用于分类和回归任务。SVM 的目标是找到一个能够最大化类别间间隔的超平面&#xff0c;以便更好地对数据进行分类。对于非线性数据&#xff0c;SVM 通过核技巧…

C语言程序设计17

程序设计17 问题17_1代码17_1结果17_1 问题17_2代码17_2结果17_2 问题17_3代码17_3结果17_3 问题17_1 下列给定程序的功能是 &#xff1a;调用函数 f u n fun fun 将指定源文件中的内容复制到指定的目标文件中&#xff0c;复制成功时函数返回 1 1 1 &#xff0c;失败时返回 …

Brant-2:开启脑信号分析新篇章的基础模型

人工智能咨询培训老师叶梓 转载标明出处 脑信号&#xff0c;包括通过侵入性或非侵入性方式收集的脑电图&#xff08;EEG&#xff09;和立体脑电图&#xff08;SEEG&#xff09;等生物测量信息&#xff0c;为我们理解大脑的生理功能和相关疾病的机制提供了宝贵的洞见。然而脑信号…

vue3+cesium创建地图

1.我这边使用的是cdn引入形式 比较简单的方式 不需要下载依赖 在项目文件的index.html引入 这样cesium就会挂载到window对象上面去了 <!-- 引入cesium-js文件 --><script src"https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Cesium.js"…

Java二十三种设计模式-外观模式(9/23)

外观模式&#xff1a;简化复杂系统的统一接口 引言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。外观模式定义了一个可以与复杂子系统交互的简化接口&#xff0c;使得子系统更加易于使用…

科研绘图系列:R语言GWAS曼哈顿图(Manhattan plot)

介绍 曼哈顿图(Manhattan Plot)是一种常用于展示全基因组关联研究(Genome-Wide Association Study, GWAS)结果的图形。GWAS是一种研究方法,用于识别整个基因组中与特定疾病或性状相关的遗传变异。 特点: 染色体表示:曼哈顿图通常将每个染色体表示为一个水平条,染色体…

Git 基础操作手册:轻松掌握常用命令

Git 操作完全手册&#xff1a;轻松掌握常用命令 引言一、暂存&#xff1a;git add ✏️二、提交&#xff1a;git commit &#x1f4dd;三、拉取、拉取合并 &#x1f504;四、推送&#xff1a;git push &#x1f310;五、查看状态&#xff1a;git status &#x1f4ca;六、查看历…

第09课 Scratch入门篇:小鸡啄米-自制积木实现

小鸡啄米-自制积木 故事背景&#xff1a; 在上一章的案例中&#xff0c;实现了小鸡啄米的动画&#xff0c;但是发现太多的重复代码&#xff0c;是我们编程的时候代码泰国繁琐&#xff0c;我们可以使用自制积木&#xff0c;将相同的代码提取出来制作成一个新的积木&#xff0c;在…

ESP32CAM人工智能教学17

ESP32CAM人工智能教学17 内网穿透,视频上云 小智一心想让ESP32Cam视频能发送到云端,这样我们在任何地方,都能查看到家里的摄像头了,甚至能控制摄像头的小车了。 内网穿透的技术原理想要让ESP32Cam把视频发送到云端,就必须要做内网穿透。也就是用户的手机(或电脑),可以…

Windows中如何配置Gradle环境变量?

本篇教程,主要介绍,如何在Windows中配置Gradle7.4环境变量 一、下载安装包 安装包下载;gradle-7.4-all.zip 二、解压安装包