树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议

目录

一、搭建准备

1. 硬件要求

2. 软件要求

二、技术栈概述

三、搭建步骤

1. 安装操作系统

2. 启动树莓派

3. 更新系统

4. 安装必要的软件

4.1 安装 Python 和 Flask

4.2 安装 Node.js

4.3 安装 Mosquitto(MQTT Broker)

4.4 安装 InfluxDB

4.5 启动 InfluxDB 服务

4.6 安装 Grafana

5. 配置数据源

6. 创建数据库

7. 搭建一个简单的物联网应用

7.1 安装依赖库

7.2 编写 Python 脚本

代码示例

代码说明

8. 运行 Python 脚本

9. 验证数据

9.1 验证 InfluxDB 数据

10. 使用 Grafana 进行数据可视化

10.1 登录 Grafana

10.2 添加数据源

10.3 创建仪表板

10.4 监控数据

11. 总结


随着物联网(IoT)技术的快速发展,使用树莓派搭建自己的物联网服务器成为了许多开发者和爱好者的热门选择。树莓派不仅价格低廉,而且功能强大,适合从简单项目到复杂应用的各种需求。本文将详细介绍如何在树莓派上搭建物联网服务器,涵盖所需的技术栈、搭建步骤以及代码示例。

一、搭建准备

1. 硬件要求

  • 树莓派(推荐树莓派 3B+ 或 4B)
  • SD卡(至少16GB,推荐使用Class 10)
  • 电源适配器(5V/2.5A 或 5V/3A)
  • 网络连接(Wi-Fi 或以太网)

2. 软件要求

  • Raspbian(或其他支持的操作系统,如 Ubuntu)
  • Python 3
  • Node.js
  • MQTT Broker(Mosquitto)
  • InfluxDB
  • Grafana

二、技术栈概述

在搭建物联网服务器时,通常会涉及多种技术,包括编程语言、数据库、消息传递协议、数据可视化工具和操作系统。以下是常见技术栈的简要介绍:

  1. 编程语言

    • Python:用于数据收集和处理,常用框架如 Flask。
    • JavaScript:用于前端开发,Node.js 用于服务器端开发。
    • Java:用于开发基于 Java 的物联网平台(如 ThingsBoard)。
  2. 操作系统

    • Raspbian:树莓派的官方操作系统。
    • Ubuntu:适用于树莓派的另一个常见 Linux 发行版。
  3. 数据库

    • InfluxDB:时序数据库,适合存储传感器数据。
    • MySQL/MariaDB:关系型数据库。
    • SQLite:轻量级数据库,适用于小型项目。
  4. 消息传递协议

    • MQTT:轻量级的消息队列协议。
    • HTTP/HTTPS:基于 REST API 的数据传输协议。
  5. 服务器软件

    • Node-RED:流式开发工具,用于图形化编程。
    • Mosquitto:MQTT Broker。
  6. 数据可视化工具

    • Grafana:分析与监控平台,用于数据可视化。
    • Matplotlib:Python 库,用于生成图表。

三、搭建步骤

1. 安装操作系统

首先,您需要在 SD 卡上安装 Raspbian 操作系统。可以使用 Raspberry Pi Imager 工具。

  • 下载并安装 Raspberry Pi Imager。
  • 选择操作系统(推荐选择 Raspbian)。
  • 选择 SD 卡,点击“写入”。

2. 启动树莓派

  • 将 SD 卡插入树莓派,连接电源和网络。
  • 使用 HDMI 线连接显示器,启动树莓派。
  • 完成初始设置,包括语言、时区、网络配置等。

3. 更新系统

打开终端,运行以下命令更新系统:

sudo apt update
sudo apt upgrade -y

4. 安装必要的软件

4.1 安装 Python 和 Flask
sudo apt install python3 python3-pip -y
pip3 install Flask
4.2 安装 Node.js
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
4.3 安装 Mosquitto(MQTT Broker)
sudo apt install mosquitto mosquitto-clients -y

启动 Mosquitto 服务:

sudo systemctl enable mosquitto
sudo systemctl start mosquitto
4.4 安装 InfluxDB

添加 InfluxDB 的仓库:

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable main" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt update
sudo apt install influxdb -y

4.5 启动 InfluxDB 服务

安装完成后,启动 InfluxDB 服务,并设置其在启动时自动运行:

sudo systemctl start influxdb
sudo systemctl enable influxdb

您可以使用以下命令检查 InfluxDB 的状态:

sudo systemctl status influxdb

4.6 安装 Grafana

Grafana 是一个强大的数据可视化工具,可以与 InfluxDB 集成。安装 Grafana 的步骤如下:

sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:grafana/grafana
sudo apt update
sudo apt install -y grafana

启动 Grafana 服务并设置为开机自启:

sudo systemctl start grafana-server
sudo systemctl enable grafana-server

5. 配置数据源

在 Grafana 中配置 InfluxDB 作为数据源:

  1. 打开浏览器,输入 http://<树莓派的IP地址>:3000 访问 Grafana(默认用户名和密码均为admin)。
  2. 登录后,系统会提示您修改密码,建议立即更改。
  3. 点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
  4. 点击“Add data source”(添加数据源),选择“InfluxDB”。
  5. 输入以下配置:
    • URLhttp://localhost:8086
    • Database: 输入您想要使用的数据库名称(可以在后面创建)。
    • User 和 Password: 如果没有设置,可以留空。
  6. 点击“Save & Test”确认配置是否成功。

6. 创建数据库

在 InfluxDB 中创建一个用于存储物联网数据的数据库,例如 iot_data

influx

进入 InfluxDB 的命令行界面后,运行以下命令:

CREATE DATABASE iot_data

使用以下命令查看创建的数据库:

SHOW DATABASES

7. 搭建一个简单的物联网应用

接下来,我们将创建一个简单的 Python 应用,用于模拟传感器数据并将其发送到 InfluxDB 和 MQTT Broker。

7.1 安装依赖库

在终端中安装 paho-mqtt 和 influxdb Python 库:

pip3 install paho-mqtt influxdb

7.2 编写 Python 脚本

我们将创建一个名为 sensor.py 的 Python 文件,该脚本将模拟传感器数据,并将这些数据发送到 InfluxDB 和 MQTT Broker。下面是完整的代码示例以及相应的说明。

代码示例
import time
import random
import paho.mqtt.client as mqtt
from influxdb import InfluxDBClient# MQTT 配置
MQTT_BROKER = "localhost"  # MQTT Broker 地址
MQTT_PORT = 1883  # MQTT Broker 端口
MQTT_TOPIC = "iot/sensor"  # MQTT 主题名称# InfluxDB 配置
INFLUXDB_HOST = "localhost"  # InfluxDB 地址
INFLUXDB_PORT = 8086  # InfluxDB 端口
INFLUXDB_DATABASE = "iot_data"  # InfluxDB 数据库名称# 创建 InfluxDB 客户端
influx_client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, database=INFLUXDB_DATABASE)# 创建 MQTT 客户端
mqtt_client = mqtt.Client()# 连接到 MQTT Broker
mqtt_client.connect(MQTT_BROKER, MQTT_PORT)# 发送传感器数据的函数
def send_sensor_data():while True:# 模拟传感器读取数据temperature = random.uniform(20.0, 30.0)  # 模拟温度数据(20.0 到 30.0 摄氏度之间)humidity = random.uniform(30.0, 50.0)     # 模拟湿度数据(30% 到 50% 之间)# 构建 InfluxDB 数据点json_body = [{"measurement": "sensor_data",  # 数据测量的名称"tags": {"device": "raspberry_pi"  # 标签,用于标识设备},"fields": {"temperature": temperature,  # 温度字段"humidity": humidity          # 湿度字段}}]# 写入数据到 InfluxDBinflux_client.write_points(json_body)# 将数据发送到 MQTTmqtt_client.publish(MQTT_TOPIC, f"Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")# 打印发送的数据到控制台print(f"Sent data - Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")time.sleep(5)  # 每5秒发送一次if __name__ == "__main__":send_sensor_data()
代码说明
  1. 导入模块

    import time
    import random
    import paho.mqtt.client as mqtt
    from influxdb import InfluxDBClient
    
    • time:用于控制发送数据的时间间隔。
    • random:用于生成模拟的温度和湿度数据。
    • paho.mqtt.client:用于与 MQTT Broker 进行通信的库。
    • influxdb:用于与 InfluxDB 数据库进行交互的库。
  2. 配置 MQTT 和 InfluxDB

    MQTT_BROKER = "localhost"
    MQTT_PORT = 1883
    MQTT_TOPIC = "iot/sensor"INFLUXDB_HOST = "localhost"
    INFLUXDB_PORT = 8086
    INFLUXDB_DATABASE = "iot_data"
    
    • 这里定义了 MQTT 和 InfluxDB 的连接配置。localhost 表示运行在同一台机器上。
  3. 创建 InfluxDB 客户端

    influx_client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, database=INFLUXDB_DATABASE)
    
    • 创建一个 InfluxDB 客户端对象,用于后续的数据写入。
  4. 创建 MQTT 客户端

    mqtt_client = mqtt.Client()
    mqtt_client.connect(MQTT_BROKER, MQTT_PORT)
    
    • 创建一个 MQTT 客户端对象并连接到指定的 MQTT Broker。
  5. 发送传感器数据的函数

    def send_sensor_data():while True:# 模拟传感器读取数据temperature = random.uniform(20.0, 30.0)  # 模拟温度数据(20.0 到 30.0 摄氏度之间)humidity = random.uniform(30.0, 50.0)     # 模拟湿度数据(30% 到 50% 之间)
    
    • while True: 循环将不断运行,模拟持续读取传感器数据。
    • random.uniform(20.0, 30.0) 生成一个介于 20.0 和 30.0 之间的随机浮点数,模拟温度读数。
    • random.uniform(30.0, 50.0) 生成一个介于 30.0 和 50.0 之间的随机浮点数,模拟湿度读数。
  6. 构建 InfluxDB 数据点

    json_body = [{"measurement": "sensor_data",  # 数据测量的名称"tags": {"device": "raspberry_pi"  # 标签,用于标识设备},"fields": {"temperature": temperature,  # 温度字段"humidity": humidity          # 湿度字段}}
    ]
    
    • 这里构建一个 JSON 格式的数据点,包含:
      • measurement:数据测量的名称(在 InfluxDB 中的表名)。
      • tags:用于对数据进行标记的键值对,可以用于过滤和分组。
      • fields:实际存储的数据,包括温度和湿度。
  7. 写入数据到 InfluxDB

    influx_client.write_points(json_body)
    
    • 使用 write_points 方法将构建的数据点写入 InfluxDB。
  8. 将数据发送到 MQTT

    mqtt_client.publish(MQTT_TOPIC, f"Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
    
    • 使用 publish 方法将数据发送到指定的 MQTT 主题。这里使用了格式化字符串,将温度和湿度格式化为两位小数。
  9. 打印发送的数据到控制台

    print(f"Sent data - Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
    
    • 在控制台输出发送的数据,方便调试和查看。
  10. 设置发送间隔

    time.sleep(5)  # 每5秒发送一次
    
    • 使用 time.sleep(5) 使程序每 5 秒钟发送一次数据,模拟定时的传感器读取。
  11. 主程序入口

    if __name__ == "__main__":send_sensor_data()
    
    • 这部分代码确保当脚本作为主程序运行时,调用 send_sensor_data 函数开始数据发送。

8. 运行 Python 脚本

在终端中,您可以使用以下命令运行 Python 脚本:

python3 sensor.py

确保您已经安装了所有必要的依赖库,并且已经启动了 InfluxDB 和 MQTT Broker。运行脚本后,您将看到每 5 秒生成并发送一次的温度和湿度数据,如下所示:

Sent data - Temperature: 24.56, Humidity: 35.78

9. 验证数据

9.1 验证 InfluxDB 数据

您可以在终端中进入 InfluxDB 的命令行界面验证数据是否成功写入:

influx

在 InfluxDB 命令行中,选择数据库并查询数据:

USE iot_data;
SELECT * FROM sensor_data;

这将显示您发送的传感器数据。

使用以下命令行工具来订阅 MQTT 主题:

mosquitto_sub -h localhost -t "iot/sensor"

运行此命令后,您应该能够看到类似以下的输出,显示通过 MQTT 发送的传感器数据:

Temperature: 24.56, Humidity: 35.78
Temperature: 22.34, Humidity: 40.12
Temperature: 25.01, Humidity: 30.45

这表明您的 Python 脚本成功将模拟的温度和湿度数据通过 MQTT Broker 发送出去。

10. 使用 Grafana 进行数据可视化

在成功发送和存储数据后,我们可以使用 Grafana 来可视化这些数据。以下是如何在 Grafana 中创建仪表板以显示传感器数据的步骤。

10.1 登录 Grafana

打开浏览器,访问 Grafana 的界面,通常地址为 http://<树莓派的IP地址>:3000。使用默认的用户名和密码(均为 admin)登录。

10.2 添加数据源
  1. 登录后,点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
  2. 点击“Add data source”(添加数据源),选择“InfluxDB”。
  3. 在配置页面中,输入以下信息:
    • URLhttp://localhost:8086
    • Database: 输入 iot_data(我们之前创建的数据库名称)。
    • User 和 Password: 如果没有设置,留空即可。
  4. 点击“Save & Test”确认配置是否成功。
10.3 创建仪表板
  1. 在 Grafana 左侧菜单中,选择“+”图标,然后选择“Dashboard”(仪表板)。
  2. 点击“Add new panel”(添加新面板)。
  3. 在查询部分选择数据源为刚刚添加的 InfluxDB。
  4. 输入查询语句:
    SELECT mean("temperature") AS "Average Temperature" FROM "sensor_data" WHERE $timeFilter GROUP BY time($interval) fill(null)
    
    • 此查询将计算传感器数据的平均温度。
  5. 在“Visualization”选项卡中选择您想要的图表类型(例如,图形、单值等)。
  6. 点击“Apply”保存面板设置。
  7. 您可以重复以上步骤以添加更多面板,例如显示湿度数据、实时数据等。
10.4 监控数据

完成以上步骤后,您将能够在 Grafana 中监控和可视化传感器数据。您可以根据需要自定义仪表板,以便更好地展示您感兴趣的数据。

11. 总结

在本篇文章中,我们详细介绍了如何在树莓派上搭建一个物联网服务器,步骤包括:

  1. 准备工作:选择合适的硬件和软件环境。
  2. 安装操作系统:在树莓派上安装 Raspbian 操作系统。
  3. 安装必要的软件:包括 Python、MQTT Broker(Mosquitto)、InfluxDB 和 Grafana。
  4. 编写数据收集脚本:使用 Python 编写脚本以模拟传感器数据,并将数据发送到 InfluxDB 和 MQTT Broker。
  5. 验证数据:通过 InfluxDB 和 MQTT 客户端验证数据是否成功存储和发送。
  6. 使用 Grafana 可视化数据:设置 Grafana,创建仪表板以实时监控传感器数据。

非常感谢您阅读到这里!您的关注和支持是我不断前进的动力。跟随着我探索嵌入式领域,希望因为兴趣而成为嵌入式领域的专家。

在这个快速发展的技术时代,嵌入式系统无处不在,从智能家居到医疗设备,从自动驾驶汽车到工业控制,每一个领域都离不开嵌入式技术的支持。对我来说,嵌入式不仅仅是一门技术,更是一种激情和追求。通过不断学习和实践,我深深爱上了这个充满挑战和机遇的领域。每一次调试成功,每一个创新的实现,都是我继续前行的动力。

——by 极客小张

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

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

相关文章

Linux基础复习(五)

前言 本文介绍了Linux常用命令&#xff0c;接Linux基础复习&#xff08;四&#xff09; 一、常用命令 命令通配符 在Linux中&#xff0c;命令通配符&#xff08;也称为通配符模式或通配符表达式&#xff09;是用来匹配文件名或其他字符串的一种特殊字符。这些通配符可以帮助…

深入解析 GZIP 压缩传输:优化网络性能的利器

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

访问控制列表(ACL)

文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List&#xff0c;访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…

力扣SQL50 上级经理已离职的公司员工 一题双解

Problem: 1978. 上级经理已离职的公司员工 Code -- 方法 1 -- select e1.employee_id -- from employees e1 -- left join employees e2 -- on e1.manager_id e2.employee_id -- where e1.salary < 30000 -- and e1.manager_id is not null -- and e2.employee_id is…

学鸿蒙开发好找工作吗?

学鸿蒙开发是一个非常有潜力的方向&#xff0c;因为鸿蒙系统是华为自主研发的操作系统&#xff0c;随着其在全球范围内的推广和应用&#xff0c;越来越多的企业和组织开始重视并采用这一系统。这使得鸿蒙开发者的市场需求正在持续增长&#xff0c;为鸿蒙开发者提供了更多的就业…

C# 设计倒计时器、串口助手开发

文章目录 1. 实现一个简单的倒计时器开始、暂停2. 串口助手开发 1. 实现一个简单的倒计时器开始、暂停 namespace Timer {public partial class Form1 : Form{int count;//用于定时器计数int time;//存储设定的定时值bool parse false;//控制暂停计时public Form1(){Initiali…

Qt Designer,仿作一个ui界面的练习(一):界面的基本布局

初学不要太复杂&#xff0c;先做一个结构简单的&#xff0c;大致规划一下功能分区&#xff0c;绘制草图&#xff1a; 最终的效果&#xff1a; 界面主要由顶边栏、侧边栏、内容区构成。顶边栏左边是logo&#xff0c;右边是时钟显示。侧边栏最上边是切换按钮&#xff0c;用以动画…

Qt中对象树机制的优点以及潜在的隐患

目录 一、什么是对象树 二、对象树的优点 三、对象树潜在的隐患 一、什么是对象树 Qt中的 QObject 会用对象树来组织管理自己&#xff0c;那什么是对象树? 这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>&#xff0c;专门存储这个类的子孙后…

centos7-8/redhat7-8一键安装配置vsftp服务

1.脚本介绍 1.1.介绍&#xff1a; linux下一键安装及配置vsftpd服务 &#xff0c;通过执行install.sh脚本&#xff0c;脚本会根据参数区域的值执行安装和配置vsftp服务&#xff0c;安装后会创建一个默认ftp用户wangxf密码wangxf2023 1、支持自定义安装(更改脚本内参数值) 2、…

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代&#xff0c;海量的数据以大爆炸的形式出现在网络之中&#xff0c;相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式&#xff0c;我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…

优化mac outlook通过nginx反向代理后使用ews访问Exchange 2016邮件访问速度慢的有效方法

在nginx配置exchange的反向代理后,mac系统上通过exchange邮箱,通过nginx代理连接邮箱,发现速度很慢,通过查看日志,也存在大量的401失败日志。通过不断的优化和尝试,目前来看,基本上正常了,基本上没有出现大量访问失败的问题。以下就是优化过程中尝试过的方法。 1. 身份…

【精通Redis】Redis命令详解

引言 Redis是一个内存数据库&#xff0c;在学习它的内部原理与实现之前&#xff0c;我们首先要做到的就是学会使用&#xff0c;学会其丰富的命令操作。 一、字符串 Redis的字符串类型之前笔者的一篇入门介绍中曾经说过&#xff0c;不是简单的只存人可以阅读的字符串&#xf…

【前端 19】使用Vue-CLI脚手架构建Vue2项目

使用Vue CLI构建Vue 2项目 引言 Vue.js 是一个构建用户界面的渐进式JavaScript框架&#xff0c;以其轻量级和易用性受到前端开发者的广泛喜爱。Vue CLI&#xff08;Vue Command Line Interface&#xff09;是一个基于Vue.js进行快速开发的完整系统&#xff0c;提供了零配置的项…

数据结构之线性表(顺序表的实现)

目录 一、线性表的原理 二、线性表的实现&#xff08;顺序表&#xff09; 1.定义顺序表 2.初始化顺序表 3.判断顺序表是否为空 4.获取顺序表的长度 5.向顺序表中插入元素 6.删除指定位置的元素 7.遍历顺序表 8.得到指定位置的元素 三、打印测试功能 1.测试 2.结果…

全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%

在全球摄影器材和专业影像设备需求增长的背景下&#xff0c;相机控制面板正成为市场的焦点。本文详细分析了全球相机控制面板市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2…

RK3568笔记四十七:PWM 子系统

若该文为原创文章&#xff0c;转载请注明原文出处。 pwm 子系统功能单一&#xff0c;很少单独使用&#xff0c;一般用于控制显示屏的背光、控制无源蜂鸣器、伺服电机、电压调节等等。 一、PWM介绍 PWM(Pulse width modulation)&#xff0c;脉冲宽度调制。在内核中 PWM 驱动较简…

学习大数据DAY26 简单数据清洗练习和 Shell 脚本中的数据库编程

目录 上机练习 14 mysql 命令 sql 语句实现步骤 shell 脚本导入 csv 格式文件到 mysql 数据库 secure-file-priv 特性 把文件拷贝到 mysql 指定目录下 上机练习 15 mysqldump 命令 上机练习 16 上机练习 14 运用上一节课学的 Shell 工具完成 1. 清洗数据《infotest.t…

CentOS7 yum报错Cannot find a valid baseurl for repo

问题 Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infravag error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown…

前端canvas——五子棋小游戏开发

这估计是最后一篇了&#xff0c;终于是修复了部分bug——隔一个空格能够胜利的bug&#xff0c;并且添加了部分样式。 其他bug目前还没有找到&#xff0c;找到再说吧。 大部分代码请见&#xff1a; 用canvas实现五子棋小游戏https://blog.csdn.net/m0_54066656/article/detail…

后端笔记(2)--JDBC

1.JDBC简介 *JDBC(Java DataBase Connectivity)就是使用java语言操作关系型数据库的一套API *JDBC本质&#xff1a;&#xff08;可以使用同一套代码&#xff0c;操作不同的关系型数据库&#xff09; ​ *官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口 ​ *各…