一、项目概述

随着物联网(IoT)的快速发展,边缘计算的应用越来越广泛。边缘计算可以将数据处理和分析推向离数据源更近的地方,从而降低延迟,提高效率。本文将介绍如何利用树莓派构建一个多协议边缘计算网关,以支持各种传感器和设备的连接和数据传输。

该项目的主要目标是实现一个边缘网关,能够通过不同的通信协议(如MQTT、HTTP、CoAP等)采集和处理来自传感器的数据,并将这些数据发送至云端或本地数据库进行存储和分析。

二、系统架构

1. 硬件选型

  • 主控单元:树莓派4B

  • 传感器:温度传感器(如DHT11)、湿度传感器、运动传感器等

  • 其他模块:Wi-Fi和蓝牙模块(树莓派4B内置)

2. 通信协议

  • MQTT:用于轻量级的设备间消息传递。

  • HTTP/HTTPS:用于与云服务或Web应用程序的交互。

  • CoAP:用于低功耗设备的通信。

3. 技术栈

  • 操作系统:Raspberry Pi OS

  • 编程语言:Python

  • 数据库:SQLite(用于本地数据存储)

  • 中间件:Eclipse Mosquitto(MQTT代理)

  • 云平台:AWS IoT(可选)

4. 系统架构图

Cloud
数据采集
消息传递
存储数据
提供数据
HTTP请求
可选数据转发
AWS IoT
传感器设备
MQTT代理
树莓派边缘计算网关
SQLite数据库
Flask Web服务
用户界面

三、环境搭建

1. 安装Raspberry Pi OS

  1. 下载Raspberry Pi Imager并安装。

  2. 使用Raspberry Pi Imager将Raspberry Pi OS写入SD卡。

  3. 将SD卡插入树莓派,连接显示器和电源,启动树莓派。

2. 更新系统

运行以下命令更新系统:

sudo apt updatesudo apt upgrade -y

3. 安装Python和依赖库

树莓派通常预装Python,但我们需要安装一些额外的库。

sudo apt install python3 python3-pip -ysudo pip3 install paho-mqtt flask

4. 安装并配置Eclipse Mosquitto

sudo apt install mosquitto mosquitto-clients -y

启动Mosquitto服务:

sudo systemctl start mosquittosudo systemctl enable mosquitto

5. 安装SQLite

sudo apt install sqlite3 libsqlite3-dev -y

四、代码实现

1. 数据采集模块

在上面的代码中,我们已经完成了读取DHT11传感器数据并将其发布到MQTT代理的功能。接下来,我们需要将此脚本保存并运行。

保存并运行数据采集脚本
  1. 在树莓派上创建一个Python脚本文件,例如 sensor_data.py

    nano sensor_data.py
    
  2. 将以下代码粘贴到文件中:

import Adafruit_DHT
 
import paho.mqtt.client as mqtt
 
import time
 
 
\# 设置传感器类型和GPIO引脚
 
sensor = Adafruit_DHT.DHT11
 
pin = 4  # GPIO引脚编号
 
 
\# MQTT设置
 
mqtt_broker = "localhost"  # 本地Mosquitto代理
 
mqtt_topic = "sensor/data"
 
  
 
\# 创建MQTT客户端
 
client = mqtt.Client()
 
client.connect(mqtt_broker)
 
  
 
while True:
 
    # 读取传感器数据
 
    humidity, temperature = Adafruit\_DHT.read\_retry(sensor, pin)
 
    if humidity is not None and temperature is not None:
 
        # 构建消息
 
        message = f"Temperature: {temperature}°C, Humidity: {humidity}%"
 
        print(message)
 
        # 发布到MQTT
 
        client.publish(mqtt_topic, message)
 
    else:
 
        print("Failed to retrieve data from the sensor.")
 
    # 每10秒读取一次数据
 
    time.sleep(10)
  1. 保存并退出编辑器(在nano中按 CTRL + X,然后按 Y 确认保存)。

  2. 运行Python脚本:

    python3 sensor_data.py
    

2. 创建Web服务模块

接下来,我们将创建一个简单的Flask Web服务,用于展示传感器数据。

创建Flask应用
  1. 创建一个新的Python文件,例如 app.py

    nano app.py
    
  2. 将以下代码粘贴到文件中:

from flask import Flask, jsonify
import sqlite3

app = Flask(__name__)
# 数据库连接函数
def get_db_connection():
    conn = sqlite3.connect('sensor_data.db')
    conn.row_factory = sqlite3.Row
    return conn

@app.route('/data', methods=['GET'])
def get_data():
    conn = get_db_connection()
    data = conn.execute('SELECT * FROM readings ORDER BY id DESC').fetchall()
    conn.close()
    return jsonify([dict(row) for row in data])

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  1. 保存并退出编辑器。

3. 数据存储模块

为了将传感器数据存储到SQLite数据库中,我们需要在数据采集模块中添加数据库写入的逻辑。

修改数据采集模块以支持SQLite

sensor_data.py 中,添加数据库写入功能:

import Adafruit_DHT
import paho.mqtt.client as mqtt
import time
import sqlite3

# 设置传感器类型和GPIO引脚
sensor = Adafruit_DHT.DHT11
pin = 4  # GPIO引脚编号

# MQTT设置
mqtt_broker = "localhost"  # 本地Mosquitto代理
mqtt_topic = "sensor/data"

# 创建MQTT客户端
client = mqtt.Client()
client.connect(mqtt_broker)

# 数据库连接函数
def get_db_connection():
    conn = sqlite3.connect('sensor_data.db')
    return conn

# 创建表(如果不存在)
conn = get_db_connection()
conn.execute('''
CREATE TABLE IF NOT EXISTS readings (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    temperature REAL,
    humidity REAL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
''')
conn.close()

while True:
    # 读取传感器数据
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    
    if humidity is not None and temperature is not None:
        # 保存数据到SQLite数据库
        conn = get_db_connection()
        conn.execute('INSERT INTO readings (temperature, humidity) VALUES (?, ?)',
                     (temperature, humidity))
        conn.commit()
        conn.close()

        # 构建消息
        message = f"Temperature: {temperature}°C, Humidity: {humidity}%"
        print(message)
        
        # 发布到MQTT
        client.publish(mqtt_topic, message)
    else:
        print("Failed to retrieve data from the sensor.")
    
    # 每10秒读取一次数据
    time.sleep(10)

四、代码实现

4. 启动Web服务

在终端中启动Flask Web服务,以便我们可以通过浏览器访问传感器数据。

  1. 运行Flask应用:

    python3 app.py
    
  2. 在浏览器中访问 http://<树莓派的IP地址>:5000/data,你应该能够看到从传感器采集到的温度和湿度数据的JSON格式输出。这些数据是从SQLite数据库中读取的。

    例如,输出可能如下所示:

    [
    {"id": 1, "temperature": 22.0, "humidity": 45.0, "timestamp": "2024-08-04 12:01:22"},
    {"id": 2, "temperature": 23.0, "humidity": 50.0, "timestamp": "2024-08-04 12:01:32"},
    ...
    ]
    

5. 测试MQTT功能

为了验证MQTT功能的正常工作,可以使用MQTT客户端订阅传感器数据主题。

  1. 在另一个终端中,使用Mosquitto客户端进行订阅:

    mosquitto_sub -h localhost -t sensor/data
    
  2. 你应该能够看到来自传感器的数据实时打印在终端中。

五、项目总结

在本项目中,我们成功地使用树莓派构建了一个多协议的边缘计算网关,涉及以下关键步骤:

  1. 硬件和软件环境搭建:我们选择了树莓派4B作为控制单元,并安装了Raspberry Pi OS。通过安装Python及其相关库,确保了系统的正常运行。

  2. 数据采集模块:通过DHT11传感器实时采集温度和湿度数据,并将这些数据通过MQTT协议发送到本地的Mosquitto代理。

  3. 数据存储模块:使用SQLite数据库存储传感器数据,并确保数据持久性。

  4. Web服务模块:通过Flask框架创建Web服务,以便用户可以通过HTTP请求获取传感器的历史数据。

  5. 测试和验证:通过MQTT客户端订阅消息和通过浏览器访问Web服务,验证了整个系统的功能和数据流的正确性。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐