基于EMQX+Flask+InfluxDB+Grafana打造多协议物联网云平台:MQTT/HTTP设备接入与数据可视化流程(附代码示例)

news2024/9/26 14:53:57

摘要: 本文深入浅出地介绍了物联网、云平台、MQTT、HTTP、数据可视化等核心概念,并结合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一个支持多协议的物联网云平台。文章结构清晰,图文并茂,代码翔实易懂,旨在帮助读者快速掌握物联网云平台搭建的核心技术。

关键词: 物联网,云平台,MQTT,HTTP,数据可视化,EMQX,Flask,InfluxDB,Grafana


一、物联网基础知识

1.1 物联网概述

物联网(IoT,Internet of Things)是指通过各种信息传感器、射频识别技术、全球定位系统等,实时采集任何需要监控、连接、互动的物体或过程,实现物与物、物与人的泛在连接,进而实现对物品和过程的智能化感知、识别和管理。

1.2 物联网架构

物联网系统架构通常分为三层:

  • 感知层: 负责采集数据,包括各种传感器、RFID 标签、GPS 模块等。
  • 网络层: 负责数据传输,包括各种网络协议、通信技术等,例如 WiFi、蓝牙、Zigbee、NB-IoT 等。
  • 应用层: 负责数据处理和应用呈现,例如数据分析、远程控制、智能决策等。

二、云平台与数据可视化

2.1 云平台

云平台是指基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。 云平台可以为物联网应用提供强大的计算、存储和网络资源,降低物联网应用开发和部署的成本。

2.2 数据可视化

数据可视化是指将数据以图形、图表等可视化形式展示出来,帮助用户更直观地理解数据,洞察数据背后的规律和趋势。

三、常用协议与工具介绍

3.1 MQTT 协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的消息发布/订阅协议,专为低带宽、低功耗设备和网络而设计。MQTT 广泛应用于物联网领域,特别适用于资源受限的设备和不可靠的网络环境。

3.2 HTTP 协议

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,用于在 Web 浏览器和 Web 服务器之间传输信息。 HTTP 协议简单易用,被广泛应用于各种网络应用,包括物联网领域。

3.3 EMQX

EMQX 是一款开源、高性能、可扩展的 MQTT 消息服务器,支持百万级并发连接和消息吞吐。

3.4 Flask

Flask 是一个轻量级的 Web 应用框架,使用 Python 编写,易于学习和使用,适合快速搭建 Web 应用和 API 接口。

3.5 InfluxDB

InfluxDB 是一款开源的时序数据库,专为存储和查询时间序列数据而设计,适用于存储物联网传感器数据、监控数据等。

3.6 Grafana

Grafana 是一款开源的数据可视化工具,可以连接多种数据源,创建美观、功能强大的仪表盘,实时展示数据。

四、多协议物联网云平台搭建

本项目将搭建一个支持 MQTT 和 HTTP 协议的物联网云平台,实现以下功能:

  • 多协议支持: 同时支持 MQTT 和 HTTP 协议的设备接入。
  • 数据采集与存储: 实时采集来自不同协议设备的数据,并将其存储到 InfluxDB 数据库。
  • 数据可视化: 使用 Grafana 对采集到的数据进行可视化展示。
4.1 系统架构

 

4.2 代码实现

1. HTTP 服务器搭建 (Flask)

# 导入 Flask 库
from flask import Flask, request, jsonify

# 创建 Flask 应用
app = Flask(__name__)

# 定义 HTTP 接口,接收 POST 请求
@app.route('/data', methods=['POST'])
def receive_data():
    # 获取请求数据
    data = request.get_json()

    # 数据处理逻辑,例如数据校验、格式转换等
    # ...

    # 将数据写入 InfluxDB (示例)
    from influxdb import InfluxDBClient
    client = InfluxDBClient('localhost', 8086, 'user', 'password', 'iot_data')
    json_body = [
        {
            "measurement": "sensor_data",
            "tags": {
                "sensor_id": data.get("sensor_id")
            },
            "fields": {
                "temperature": data.get("temperature"),
                "humidity": data.get("humidity")
            }
        }
    ]
    client.write_points(json_body)

    # 返回响应
    return jsonify({'message': 'Data received successfully!'}), 200

# 启动 Flask 应用
if __name__ == '__main__':
    app.run(debug=True)

代码说明:

  • 使用 Flask 框架创建 HTTP 服务器,并定义 /data 接口接收 POST 请求。
  • 使用 request.get_json() 获取 HTTP 请求中的 JSON 数据。
  • 进行数据处理,例如数据校验、格式转换等。
  • 使用 InfluxDBClient 连接 InfluxDB 数据库,并将数据写入数据库。
  • 返回 JSON 格式的响应,告知客户端数据接收成功。

2. MQTT 消息处理 (Python)

# 导入必要的库
import paho.mqtt.client as mqtt
from influxdb import InfluxDBClient
import json

# MQTT Broker 配置
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
MQTT_TOPIC = "sensor/data"

# InfluxDB 配置
INFLUXDB_HOST = "localhost"
INFLUXDB_PORT = 8086
INFLUXDB_USER = "user"
INFLUXDB_PASSWORD = "password"
INFLUXDB_DATABASE = "iot_data"

# 创建 InfluxDB 客户端
influxdb_client = InfluxDBClient(
    host=INFLUXDB_HOST,
    port=INFLUXDB_PORT,
    username=INFLUXDB_USER,
    password=INFLUXDB_PASSWORD,
    database=INFLUXDB_DATABASE
)

# 连接到 MQTT Broker
def on_connect(client, userdata, flags, rc):
    print("Connected to MQTT Broker with result code " + str(rc))
    client.subscribe(MQTT_TOPIC)

# 接收 MQTT 消息
def on_message(client, userdata, msg):
    # 解析数据
    data = json.loads(msg.payload.decode())
    
    # 构建 InfluxDB 数据点
    influxdb_data = [
        {
            "measurement": "sensor_data",
            "tags": {
                "sensor_id": data.get("sensor_id"),
            },
            "fields": {
                "temperature": data.get("temperature"),
                "humidity": data.get("humidity"),
            }
        }
    ]

    # 写入 InfluxDB
    influxdb_client.write_points(influxdb_data)
    print("Data written to InfluxDB: " + str(influxdb_data))

# 创建 MQTT 客户端
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60)

# 启动 MQTT 客户端
mqtt_client.loop_start()

# 保持程序运行
while True:
    pass

代码说明:

  • 使用 paho.mqtt.client 连接到 MQTT Broker,并订阅指定主题。
  • 当收到 MQTT 消息时,使用 json.loads() 解析消息内容。
  • 将解析后的数据构建成 InfluxDB 数据点格式。
  • 使用 influxdb_client.write_points() 将数据写入 InfluxDB 数据库。

3. 数据可视化 (Grafana)

  • 安装 Grafana 并配置数据源连接到 InfluxDB 数据库。
  • 创建仪表盘并在仪表盘上添加图表,例如折线图、柱状图等。
  • 配置图表的数据源为 InfluxDB,并编写查询语句从 InfluxDB 中获取数据。
  • 根据需要配置图表的样式、标题、坐标轴等属性,使数据展示更加直观易懂。

示例 Grafana 查询语句:

SELECT "temperature", "humidity" FROM "sensor_data" WHERE time > now() - 1h

该查询语句将从 sensor_data measurement 中查询最近 1 小时的温度和湿度数据。

本项目通过结合 Flask、EMQX、InfluxDB 和 Grafana 等工具,搭建了一个支持 MQTT 和 HTTP 协议的物联网云平台,并实现了数据的采集、存储和可视化展示。该平台可以灵活扩展,支持更多类型的设备和协议接入,并根据实际需求进行功能定制。

注意:

  • 以上代码仅供参考,实际应用中需要根据具体需求进行修改。
  • 请确保已安装所有依赖库,例如 paho-mqttinfluxdbflask 等。
  • 在实际部署中,需要考虑数据的安全性、系统的稳定性等因素。

想要具体的代码以及思路可以私信我!!!

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

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

相关文章

Linux 入门教程 by 程序员鱼皮

本文作者:程序员鱼皮 免费编程学习 - 编程导航网:https://www.code-nav.cn 大家好,我是鱼皮。 前两天我学编程的老弟小阿巴过生日,我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的,结果小阿巴…

网关、DHCP协议、ip地址、子网掩码简单介绍

参考文章:https://baike.baidu.com/item/%E7%BD%91%E5%85%B3/98992?frge_ala https://baike.baidu.com/item/DHCP%E6%9C%8D%E5%8A%A1%E5%99%A8/9956953?fromModulelemma_inlink https://blog.csdn.net/weixin_58783105/article/details/135041342 https://blog.cs…

Spring系列三:基于注解配置bean 下

基于注解配置bean 💗自动装配🍝案例1: Autowired引出🍝案例2: Autowired解读🍚案例3: Resource解读🍝小结 💗泛型依赖注入🍝基本说明🍝应用实例 💗自动装配 ●基本说明 …

数据中心巡检机器人助力,河南某数据中心机房智能化辅助项目交付

随着数据中心规模的不断扩大和业务需求的不断增长,确保其高效、安全、稳定地运行变得愈发重要。传统的人力巡检方式存在效率低、误差高、成本大等问题,难以满足现代数据中心的需求。为解决这些挑战,智能巡检机器人应运而生,成为数…

应用最优化方法及MATLAB实现——第3章代码实现

一、概述 在阅读最优方法及MATLAB实现后,想着将书中提供的代码自己手敲一遍,来提高自己对书中内容理解程度,巩固一下。 这部分内容主要针对第3章的内容,将其所有代码实现均手敲一遍,中间部分代码自己根据其公式有些许的…

Windows系统MySQL的安装,客户端工具Navicat的安装

下载mysql安装包,可以去官网下载:www.mysql.com。点击downloads 什么?后面还有福利? 下载MySQL 下载企业版: 下载Windows版 5点多的版本有点低,下载8.0.38版本的。Window系统。下载下面的企业版。不下载…

网安防御保护-小实验

1、DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 2、生产区不允许访问互联网,办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不允许访问DMZ区的FTP服务器和HTTP服务器,仅能ping通…

Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析

Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析 文章目录 Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析一、前言二、隐藏实现1、xml 文件中隐藏PreferenceScreen 的某个条目2、普通Preference条目的隐藏的Java代码实现3、SwitchPreference条…

bevfomer self-att to transformer to tensorrt

self-attentation https://blog.csdn.net/weixin_42110638/article/details/134016569 query input* Wq key input* Wk value input* Wv output 求和 query . key * value detr multiScaleDeformableAttn Deformable Attention Module,在图像特征上&#…

STM32读取LX-224总线舵机信息

一、舵机指令包格式 帧头: 连续收到两个 0x55 ,表示有数据包到达。ID: 每个舵机都有一个 ID 号。ID 号范围 0~253,转换为十六进制 0x00~0xFD。广播 ID: ID 号 254(0xFE) 为广播 ID,若控制器发出的 ID 号为 254(0xFE),所有的舵机均…

DockerFile文件解析

DockerFile 要研究自己如何做一个镜像,而且微服务项目打包上云部署,Docker就是最方便的。 微服务打包成镜像,任何装了Docker的地方,都可以下载使用,极其的方便。 流程:开发应用>DockerFile>打包为…

c++ 建造者模式

文章目录 建造者模式为什么使用建造者模式建造者模式实现步骤实现示例建造者模式优缺点 建造者模式 建造者模式(Builder Pattern)是面向对象设计模式中的一种,主要用于创建复杂对象。这种模式将对象的构建过程与其表示分离,允许用…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行,下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机,上位机将信息进行处理展示判断下位机传感器数据,如果超过设置的阈值&a…

电商出海第一步,云手机或成重要因素

电商出海第一步并非易事,挑战和机遇并存,出海企业或个人或将借助云手机从而达成商业部署全球化的目的; 下面我们从网络稳定、数据安全、成本、以及多平台适配方面来看,究竟为什么说云手机会成为出海的重要因素; 首先…

图谱动态240709

本期将分享近期全球知识图谱相关 行业动态、会议资讯、论文推荐 —--| 行业动态 |--— 微软开源GraphRAG 7月2日,微软开源了GraphRAG,一种基于图的检索增强生成(RAG) 方法,可以对私有或以前未见过的数据集进行问答(开源地址&…

ENSP防火墙

实验拓扑图 需求: ENSP的配置: 防火墙: 交换机: 华为防火墙的配置: 接口配置: 安全区域: 安全策略: 办公区访问DMZ: 生产区访问DMZ: 游客区只能访问门户网…

USB转RS485+RS232+TTL串口电路

USB转RS485RS232TTL电路 USB转RS485RS232TTL电路如下图所示,可实现USB转RS485RS232TTL串口,一个电路模块即可实现电路调试过程中用到常用接口。 电路模块上留有2.54MM单排针接口和接线端子两种接线方式,可接线和跳线。电路模块同时有5V和3.3V…

Vulkan入门系列0- Vulkan与OpenGL的区别

一:概述 Vulkan 是新一代图形和计算API,是由科纳斯组织(Khronos Group)维护的一套跨平台的、开放标准的、现代GPU 的编程接口,它仅仅是规定了一套编程接口,并没有接口的具体实现,实现是由硬件厂商适配实现的,市面上像NVIDIA、AMD和Intel等国际大厂基本提供了完整的…

C++ enum class转常量

当使用 enum class 时,它具有更强的类型安全性和隔离性,因此需要显式转换才能访问其底层整数值。 std::underlying_type_t 是一个类型别名,它返回枚举类型的底层类型。 to_underlying 函数提供了一种方便的方式来执行这种转换,特别…

vb.netcad二开自学笔记8:界面之任务窗格

使用net可以创建一个类似属性面板的自定义的任务窗格,从而实现应用程序更丰富的人机交互。 1、添加一个自定义控件 2、在前面创建的代码框架内增加一个命令函数ShowMyPalette Imports System.Windows.Media.Imaging Imports Autodesk.AutoCAD.ApplicationServices …