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

news2024/9/8 23:00:01

目录

一、搭建准备

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 极客小张

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

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

相关文章

PSINS工具箱函数介绍——kfinit

kfinit是kf的参数初始化函数&#xff0c;用于初始化滤波参数 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导基于PSINS的相关程序设计&#xff08;付费专题&#xff09; 使用方法 kfinit这个函数的字面意思是&#xff1a;kf的初始化…

游戏制作中没想明白的事情

当一个备忘录&#xff0c;有的是还没有时间去深入研究&#xff0c;或者没有从头了解 什么是建模绑定&#xff1f;为什么人物建模&#xff0c;初始化都是双手打开的&#xff1f;平着放武器&#xff0c;但运行的时候武器会自动竖起来&#xff0c;这是怎么做到的&#xff1f; 思…

嵌入式学习Day13---C语言提升

目录 一、二级指针 1.1.什么是二级指针 2.2.使用情况 2.3.二级指针与数组指针 二、指针函数 2.1.含义 2.2.格式 2.3.注意 2.4.练习 三、函数指针 3.1.含义 3.2.格式 3.3.存储 3.4.练习 ​编辑 四、void*指针 4.1.void缺省类型 4.2.void* 4.3.格式 4.4.注…

RocketMQ的详细讲解(四种mq的对比(activeMq、rabbitmq、rocketmq、kafka))

20240729 RocketMQ1 mq的三大作用 异步、削峰限流、解耦合2. 四种mq的对比&#xff08;activeMq、rabbitmq、rocketmq、kafka&#xff09;3 rocketmq特点1. 平台无关2. 能提供什么样的功能 4 rocketMq4.1 broker中的标题&#xff0c;来约束读和写4.2 rocketmq的结构4.3 读和写的…

AJAX概念与axios使用

一、什么是AJAX&#xff1f; 定义&#xff1a;AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。简单点说&#xff0c;就是使用XMLHttpRequest 对象与服务器通信。 它可以使用 JSON&#xff0c;XML&#xff0c;HTML 和 text 文本等格式发送和接收数据。AJAX最…

Java 内推 | 教育行业缺口来了,研发,运维,产品,教研,职能,营销... 别错过

Java 内推 | 教育行业缺口来了&#xff0c;研发&#xff0c;运维&#xff0c;产品&#xff0c;教研,职能&#xff0c;营销… 别错过 岗位职责&#xff1a; 1、根据公司战略及业务规划&#xff0c;参与部门业务架构分析与设计&#xff0c;包含规划立足当前、面向未来的应用架构…

嵌入式C++、STM32、ROS系统和MQTT协议通讯:智能农业灌溉系统项目设计思路(代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器代码 1.1 STM32初始化代码 1.2 读取土壤湿度 1.3 MQTT数据发送 1.4 接收控制命令 1.5 主循环 2. ROS系统代码 2.1 创建ROS节点 2.2 控制水泵的逻辑 3. ROS与MQTT的集成 3.1 安…

MySQL 执行计划详解

文章目录 一. 概念二. 语法三. 详解各字段1. id2. select_type3. table4. partitions5. type6. possible_keys与key7. key_len8. ref9. rows10. filtered11. Extra 一. 概念 有了慢查询后&#xff0c;需要对慢查询语句进行分析。一条查询语句经过MySQL查询优化器后&#xff0c…

最全国内13家DNS分享 解决网页被恶意跳转或无法打开问题

腾讯 DNS (DNSPod) 腾讯 DNS 是由 DNSPod 提供的公共免费 DNS 服务。DNSPod 已被腾讯收购&#xff0c;现在属于腾讯公司所有。该 DNS 服务稳定性和连通性良好&#xff0c;经测试在海外也可以使用。 DNSPod 提供了 IPv4、IPv6 DNS 和 DoT/DoH 服务。 IPv4 地址: 119.29.29.29…

fastapi教程(五):中间件

一&#xff0c;什么是中间件 中间件是一种软件组件&#xff0c;它在请求到达应用程序处理程序之前和/或响应发送回客户端之前执行操作。 请求从客户端发出。 请求首先经过Middleware 1。 然后经过Middleware 2。 请求到达FastAPI路由处理器。 响应从路由处理器返回。 响应经过…

精品PPT | 云原生大数据平台构建及落地实践.pptx

1、监控和可观测性的关系及渊源 2、当前阶段落地可观测性的挑战在哪里 3、落地好一个可观测系统的三大要素 4、面向故障处理过程的可观测性体系建设案例 5、思考&#xff1a;人工智能2.0对可观测性技术和产品演进的影响

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果&#xff1a; 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…

环形链表 II - 力扣(LeetCode)C语言

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; (点击前方链接即可查看题目) 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达…

制造企业选型MES管理系统时需要关注的地方

在当今制造业全面拥抱数字化转型的浪潮中&#xff0c;MES管理系统解决方案的角色日益凸显&#xff0c;成为提升生产效率、优化资源配置的关键工具。对于制造企业而言&#xff0c;选择一款合适的MES管理系统不仅关乎当前的生产管理需求&#xff0c;更直接影响到企业未来的竞争力…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

【权威发布】第二届机械电子工程与软件工程国际会议(MEESE 2024)

第二届机械电子工程与软件工程国际会议 2024 International Conference on Mechanical and Electronic Engineering and Software Engineering 【1】会议简介 第二届机械电子工程与软件工程国际会议是一个专注于机械电子工程与软件工程领域交叉融合的国际盛会。会议旨在汇聚全球…

Vue3可媲美Element Plus Tree组件研发之重命名节点

在上一节《移除节点》基础上继续迭代JuanTree的功能&#xff0c;我们将实现节点重命名的功能。 实现效果&#xff1a; 可以对现有节点进行编辑&#xff0c;点回车或失去焦点完成编辑&#xff0c;如果输入为空&#xff0c;会恢复为原来的值。同时支持对新增的节点自动启用编辑功…

花几千上万学习Java,真没必要!(三十四)

1、泛型类&#xff1a; 测试代码&#xff1a; 创建一个Box类; package settest.com; public class Box<T> { // T stands for "Type" - T是一个占位符&#xff0c;用于表示具体的类型 // 类的内部可以使用T作为类型声明变量 private T t; // 构造方法&am…

ROS中使用rqt_plot快速实现数据可视化

对数据进行可视化有很多好处&#xff0c;比如可以帮助我们快速判断机器人运动轨迹是否平滑。 一般来说&#xff0c;我们会将数据保存为文件&#xff0c;然后进行绘图&#xff0c;但是在ROS中&#xff0c;有一个很好用的工具&#xff0c;叫rqt_plot&#xff0c;用它可以快速实现…