0
点赞
收藏
分享

微信扫一扫

【OpenCV C++20 学习笔记】阈值操作—分离图片对象

一、项目概述

随着物联网(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. 系统架构图

三、环境搭建

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服务,验证了整个系统的功能和数据流的正确性。

举报

相关推荐

0 条评论