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

摘要: 本文深入浅出地介绍了物联网、云平台、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.mfbz.cn/a/800589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 中如何处理数据的并发插入和唯一约束的冲突解决?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发插入和唯一约束的冲突解决一、并发插入和唯一约束的基本概念&#xf…

在Mac上免费恢复误删除的Word文档

Microsoft Word for Mac是一个有用的文字处理应用程序,它与Microsoft Office套件捆绑在一起。该软件的稳定版本包括 Word 2019、2016、2011 等。 Word for Mac 与 Apple Pages 兼容;这允许在不同的操作系统版本中使用Word文档,而不会遇到任何麻烦。 与…

AI论文精读笔记-MAE

1. 论文基本信息 论文标题:Masked Autoencoders Are Scalable Vision Learners 作者:Kaiming He∗,† Xinlei Chen∗ Saining Xie Yanghao Li Piotr Doll ́ ar Ross Girshick 发表时间和期刊:19 Dec 2021; arxiv 论文链接:Mas…

Golang | Leetcode Golang题解之第237题删除链表中的节点

题目: 题解: func deleteNode(node *ListNode) {node.Val node.Next.Valnode.Next node.Next.Next }

基于Python+Flask+SQLite的网易云音乐评论情感分析系统

FlaskSQLite 基于PythonFlaskSQLite的网易云音乐评论情感分析系统 项目主要依赖前端:tailwindcss,Echart,后端主要是Flask,系统的主要支持登录注册,Ecahrt构建可视化 支持一键切换暗黑主题 blueprints组织页面 skle…

目标检测--X-anylabeling使用自己的模型自动标注

一、x-anylabeling安装教程 x-anylabeling安装教程——软件安装教程——X-AnyLabeling 安装与自动标注 二、x-anylabeling使用自己的模型标注(YOLOv5 v6.0) 2.1 训练权重.pt转onnx 环境配置 将requiements.txt中export部分的注释恢复 然后pip insta…

C语言 ——— 大/小端存储模式的介绍及判断

目录 何为大端小端 如何测试当前机器是大端还是小端 编写代码,判断当前机器的字节序 何为大端小端 大端字节序存储模式:数据的低位字节的内容 存放在 内存的高地址 中,数据的高位字节的内容 保存在 内存的低地址 中 小端字节序存储模式&am…

[ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024)将于2024年8月2-4日在中国厦门召开。 VRISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…

Java基础之应用向jar包sdk注册回调函数实例(十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

GNSS技术干货(34):天灵灵 地灵灵 不如C/N0灵

在GPS接收机研发测试过程中,作为硬件射频工程师最关心的测试项目是传导载噪比C/N0(carrier-to-noise ratio)值,因为它是非常重要的参数指标,可以评估接收机端收到的卫星信号强度,反映硬件射频链路的质量&am…

降Compose十八掌之『突如其来』| Graphics Modifiers

公众号「稀有猿诉」 原文链接 降Compose十八掌之『突如其来』| Graphics Modifiers 在Jetpack Compose中创建自定义绘制内容的方式不止一种,除了前面提到的通过Canvas函数的方式以外,还可以通过Modifier的几个扩展函数更为灵活实现一些的自定义内…

SpringBoot+Vue实现简单的文件上传(Excel篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传xls文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el…

Python爬虫速成之路(4):BeautifulSoup

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

【JVM基础01】——介绍-初识JVM运行流程

目录 1- 引言&#xff1a;初识JVM1-1 JVM是什么&#xff1f;(What)1-1-1 概念1-1-2 优点 1-2 为什么学习JVM?(Why) 2- 核心&#xff1a;JVM工作的原理&#xff08;How&#xff09;⭐2-1 JVM 的组成部分及工作流程2-2 学习侧重点 3- 小结(知识点大纲)&#xff1a;3-1 JVM 组成3…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说&#xff1a;现在有个word文档,里面有个表格太长&#xff08;如下图所示&#xff09;&#xff0c;希望这一个设置成横的&#xff0c;其余页还是保持竖的&#xff01; 二、解决方案 1、将鼠标放置在该页的最前面闪烁&#xff0c;然后选择“页面”》“↘…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图&#xff0c;与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…

CentOS搭建邮件服务器:DNS配置方法技巧?

CentOS搭建邮件服务器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在当今数字化时代&#xff0c;邮件服务器的需求日益增加。为了确保邮件能够顺利送达&#xff0c;正确的DNS配置是必不可少的一环。AokSend将详细介绍在CentOS搭建邮件服务器过程中&#xff0c;如何进行…

PyCharm软件初始化配置

安装完pycharm后&#xff0c;需要对其进行个性化设置&#xff0c;分别设置方法如下 目录 一、修改主题二、修改默认字体和大小三、设置拖动滚轮改变字体大小四、常见快捷键 一、修改主题 1、界面右上角点击红框的内容 2、选择Theme选项 3、选择对应的主题 第一二个是白色主题…

怎样去除视频上的水印和文字,视频水印文本移除教程

在观看和分享视频时&#xff0c;我们经常会遇到带有水印或额外文字的情况。这些标记有时是为了版权保护&#xff0c;有时则是平台的标识&#xff0c;但在某些情况下&#xff0c;它们可能会干扰视频的观赏体验。本文将向你介绍常见的视频水印类型以及如何使用简鹿水印助手去除这…