树莓派物联网服务器搭建流程:集成 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          # 湿度字段
                }
            }
        ]
        
        # 写入数据到 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()
代码说明
  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 极客小张

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值