树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议
在当今物联网(IoT)快速发展的时代,使用树莓派搭建物联网服务器已成为开发者和爱好者的热门选择。本文详细介绍了如何利用 Node.js、InfluxDB、Grafana 和 MQTT 协议构建一个高效的物联网服务器。我们将从准备工作开始,逐步指导您完成操作系统安装、必要软件配置、数据采集脚本编写以及数据可视化的全过程。通过设置实时监控和数据分析,您将能够更好地理解各类传感器数据的动态变化。
目录
随着物联网(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
二、技术栈概述
在搭建物联网服务器时,通常会涉及多种技术,包括编程语言、数据库、消息传递协议、数据可视化工具和操作系统。以下是常见技术栈的简要介绍:
-
编程语言:
- Python:用于数据收集和处理,常用框架如 Flask。
- JavaScript:用于前端开发,Node.js 用于服务器端开发。
- Java:用于开发基于 Java 的物联网平台(如 ThingsBoard)。
-
操作系统:
- Raspbian:树莓派的官方操作系统。
- Ubuntu:适用于树莓派的另一个常见 Linux 发行版。
-
数据库:
- InfluxDB:时序数据库,适合存储传感器数据。
- MySQL/MariaDB:关系型数据库。
- SQLite:轻量级数据库,适用于小型项目。
-
消息传递协议:
- MQTT:轻量级的消息队列协议。
- HTTP/HTTPS:基于 REST API 的数据传输协议。
-
服务器软件:
- Node-RED:流式开发工具,用于图形化编程。
- Mosquitto:MQTT Broker。
-
数据可视化工具:
- 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 作为数据源:
- 打开浏览器,输入
http://<树莓派的IP地址>:3000
访问 Grafana(默认用户名和密码均为admin
)。 - 登录后,系统会提示您修改密码,建议立即更改。
- 点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
- 点击“Add data source”(添加数据源),选择“InfluxDB”。
- 输入以下配置:
- URL:
http://localhost:8086
- Database: 输入您想要使用的数据库名称(可以在后面创建)。
- User 和 Password: 如果没有设置,可以留空。
- URL:
- 点击“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 # 湿度字段
}
}
]
# 写入数据到 InfluxDB
influx_client.write_points(json_body)
# 将数据发送到 MQTT
mqtt_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()
代码说明
-
导入模块:
import time import random import paho.mqtt.client as mqtt from influxdb import InfluxDBClient
time
:用于控制发送数据的时间间隔。random
:用于生成模拟的温度和湿度数据。paho.mqtt.client
:用于与 MQTT Broker 进行通信的库。influxdb
:用于与 InfluxDB 数据库进行交互的库。
-
配置 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
表示运行在同一台机器上。
- 这里定义了 MQTT 和 InfluxDB 的连接配置。
-
创建 InfluxDB 客户端:
influx_client = InfluxDBClient(INFLUXDB_HOST, INFLUXDB_PORT, database=INFLUXDB_DATABASE)
- 创建一个 InfluxDB 客户端对象,用于后续的数据写入。
-
创建 MQTT 客户端:
mqtt_client = mqtt.Client() mqtt_client.connect(MQTT_BROKER, MQTT_PORT)
- 创建一个 MQTT 客户端对象并连接到指定的 MQTT Broker。
-
发送传感器数据的函数:
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 之间的随机浮点数,模拟湿度读数。
-
构建 InfluxDB 数据点:
json_body = [ { "measurement": "sensor_data", # 数据测量的名称 "tags": { "device": "raspberry_pi" # 标签,用于标识设备 }, "fields": { "temperature": temperature, # 温度字段 "humidity": humidity # 湿度字段 } } ]
- 这里构建一个 JSON 格式的数据点,包含:
- measurement:数据测量的名称(在 InfluxDB 中的表名)。
- tags:用于对数据进行标记的键值对,可以用于过滤和分组。
- fields:实际存储的数据,包括温度和湿度。
- 这里构建一个 JSON 格式的数据点,包含:
-
写入数据到 InfluxDB:
influx_client.write_points(json_body)
- 使用
write_points
方法将构建的数据点写入 InfluxDB。
- 使用
-
将数据发送到 MQTT:
mqtt_client.publish(MQTT_TOPIC, f"Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
- 使用
publish
方法将数据发送到指定的 MQTT 主题。这里使用了格式化字符串,将温度和湿度格式化为两位小数。
- 使用
-
打印发送的数据到控制台:
print(f"Sent data - Temperature: {temperature:.2f}, Humidity: {humidity:.2f}")
- 在控制台输出发送的数据,方便调试和查看。
-
设置发送间隔:
time.sleep(5) # 每5秒发送一次
- 使用
time.sleep(5)
使程序每 5 秒钟发送一次数据,模拟定时的传感器读取。
- 使用
-
主程序入口:
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 添加数据源
- 登录后,点击左侧菜单中的“Configuration”(配置)图标,然后选择“Data Sources”(数据源)。
- 点击“Add data source”(添加数据源),选择“InfluxDB”。
- 在配置页面中,输入以下信息:
- URL:
http://localhost:8086
- Database: 输入
iot_data
(我们之前创建的数据库名称)。 - User 和 Password: 如果没有设置,留空即可。
- URL:
- 点击“Save & Test”确认配置是否成功。
10.3 创建仪表板
- 在 Grafana 左侧菜单中,选择“+”图标,然后选择“Dashboard”(仪表板)。
- 点击“Add new panel”(添加新面板)。
- 在查询部分选择数据源为刚刚添加的 InfluxDB。
- 输入查询语句:
SELECT mean("temperature") AS "Average Temperature" FROM "sensor_data" WHERE $timeFilter GROUP BY time($interval) fill(null)
- 此查询将计算传感器数据的平均温度。
- 在“Visualization”选项卡中选择您想要的图表类型(例如,图形、单值等)。
- 点击“Apply”保存面板设置。
- 您可以重复以上步骤以添加更多面板,例如显示湿度数据、实时数据等。
10.4 监控数据
完成以上步骤后,您将能够在 Grafana 中监控和可视化传感器数据。您可以根据需要自定义仪表板,以便更好地展示您感兴趣的数据。
11. 总结
在本篇文章中,我们详细介绍了如何在树莓派上搭建一个物联网服务器,步骤包括:
- 准备工作:选择合适的硬件和软件环境。
- 安装操作系统:在树莓派上安装 Raspbian 操作系统。
- 安装必要的软件:包括 Python、MQTT Broker(Mosquitto)、InfluxDB 和 Grafana。
- 编写数据收集脚本:使用 Python 编写脚本以模拟传感器数据,并将数据发送到 InfluxDB 和 MQTT Broker。
- 验证数据:通过 InfluxDB 和 MQTT 客户端验证数据是否成功存储和发送。
- 使用 Grafana 可视化数据:设置 Grafana,创建仪表板以实时监控传感器数据。
非常感谢您阅读到这里!您的关注和支持是我不断前进的动力。跟随着我探索嵌入式领域,希望因为兴趣而成为嵌入式领域的专家。
在这个快速发展的技术时代,嵌入式系统无处不在,从智能家居到医疗设备,从自动驾驶汽车到工业控制,每一个领域都离不开嵌入式技术的支持。对我来说,嵌入式不仅仅是一门技术,更是一种激情和追求。通过不断学习和实践,我深深爱上了这个充满挑战和机遇的领域。每一次调试成功,每一个创新的实现,都是我继续前行的动力。
——by 极客小张
更多推荐
所有评论(0)