当前位置: 首页 > news >正文

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

引言

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

系统功能

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

  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)# 数据存储到 InfluxDBinflux_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:用于模拟设备数据和进行数据处理。

相关文章:

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

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

CloseableHttpClient.close() 导致 Connection pool shut down 的问题

TL;DR; CloseableHttpClient.close() 方法默认行为是关闭 HttpClientConnectionManager如果多个 CloseableHttpClient 共用了同一个 HttpClientConnectionManager,则第一个请求执行完,其他请求就会爆 Connection pool shut down 异常备注:ht…...

centos7 docker空间不足

今天在使用docker安装镜像的时候,出现报错 查看原因,发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间,并不支持扩展分区大小,下面对分区进行扩容 参考: 分区扩容 主…...

C#基于SkiaSharp实现印章管理(5)

印章中最常见的特殊形状通常是五角星,空心、实心的都可能存在,本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法,主要分为三种:   1)五角星各点坐标固定,直接调用编程语言的绘制线条或…...

【C#】ThreadPool的使用

1.Thread的使用 Thread的使用参考:【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池,它能够根据需要动态地分配和回收线程…...

【Python系列】Python 中`eval()`函数的正确使用及其风险分析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用Spring Boot开发应用:基于请求参数MD5的缓存键及其他缓存方式

本文将介绍如何在Spring Boot应用中实现基于请求参数MD5的缓存键,以及其他常见的缓存方式。通过实际代码示例,展示如何应用这些技术优化系统性能。 1. 引入必要的依赖 首先,在Spring Boot项目中引入缓存相关的依赖。修改pom.xml文件&#x…...

typescript中interface常见3种用法

文章目录 函数类型对象类型【自命名】: (函数)对象类型 函数类型 作用:声明一个函数接口:可用于类型声明 | 不可implements 对象类型 作用:声明对象具备哪些实例接口:可用于类型 | 可implements 【自命名】&…...

windows10 安装CUDA教程

如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤...

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门,进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization,粒子群优化算法,通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…...

scrapy 爬取旅游景点相关数据(一)

配套视频可以前往B站:麦麦大数据 项目目标: 爬取的是穷游旅游景点列表 、评论数据 📊 章节: 😆 Scrapy 爬取旅游景点相关数据(一) 😆 Scrapy 爬取旅游景点相关数据(二) &…...

构建铁塔基站安全防护网:视频AI智能监控技术引领智慧化转型

一、背景现状 随着通信技术的快速发展,铁塔基站作为重要的通信基础设施,其安全、稳定、高效的运行对于保障通信网络的畅通至关重要。然而,铁塔基站大多分布在公路边、高山、野外等区域,巡检难度大,维护效率低&#xf…...

Java中的分布式缓存:Ehcache与Hazelcast

Java中的分布式缓存:Ehcache与Hazelcast 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的两种分布式缓存技术:Ehcache与Hazelcast。分布式缓存可以显…...

前端开发工程师的薪资,主要取决于哪3个方面?

作者:清水束竹 从2022年开始,互联网行业的就业情况就不容乐观了。 最明显的三个表现:裁员、缩招、降薪。 其实2021-2022年年中那段时间,互联网企业出现了一波假性繁荣。 某些大厂Q大量招聘应届毕业生,宣传铺天盖地,不…...

springboot美食网站—计算机毕业设计源码11574

摘 要 随着人们生活水平的提高,人们对美食的要求也越来越高,对各类美食信息需求越来越大。因此,结合计算机快速发展、普及,在此基础上制作一个页面简单、美观,功能实用的美食网站势在必行,满足用户分享美食的需求。 美…...

WordPress建站:如何使用ChemiCloud搭建外贸独立站

以前自行搭建一个网站,不懂一点技术那是很难完成的,现如今WordPress的出现极大地降低了搭建网站的技术门槛,不需要懂任何代码,只需按步骤操作就行。WordPress 是一个非常流行的开源内容管理系统(CMS)&#…...

在 Vim 编辑器中,如果某个单词被意外地高亮显示,使用:noh可以取消高亮显示

文章目录 1、问题出现的背景2、解决办法 1、问题出现的背景 配置镜像加速器,修改 /etc/docker/daemon.json 目录下的文件,不小心高亮显示https,产生问题的步骤是,我先是按esc键退出vim的编辑模式,然后在https的前面按…...

一条命令安装mysql,php

一条命令安装mysql,php,wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp...

配置maven环境

一、把maven文件下载到D盘下 二、创建一个maven文件夹,并在其中创建一个repository文件夹 三、桌面右键单击属性设置,搜索环境 添加MAVEN HOME变量,让然后把apache-maven路径下的bin文件的路径复制进来 用记事本或者NotePad打开下图路径的set…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...