嵌入式C++、MQTT、React、Spring Boot和MongoDB:物联网工厂检测系统设计思路(代码示例)

news2024/11/15 17:26:07

项目概述

随着工业4.0和物联网(IoT)技术的发展,越来越多的工厂借助智能化手段进行生产数据的采集和实时监控。本项目设计并实现一个物联网工厂检测系统,通过传感器采集关键参数,并利用云平台进行数据存储和分析,以提高生产效率和产品质量。

系统设计

系统设计分为四个层次:硬件层、网络层、平台层和应用层。

硬件层

硬件层是系统的基础,包括:

  1. 嵌入式系统:使用 STM32F4 单片机,具备强大的处理能力和丰富的外设接口,通过 ADC 连接各类传感器。

  2. 传感器

    • 温度传感器:DS18B20,适合工业环境。
    • 压力传感器:MPX5700AP,检测范围0-700kPa。
    • 湿度传感器:DHT22,精度高。
    • 电流传感器:ACS712,支持交流和直流电流测量。
  3. 通信模块

    • Wi-Fi:ESP8266,适合高数据传输速率场景。
    • LoRa:SX1278,适合长距离低功耗传输。

网络层

网络层负责设备通信,采用协议包括:

  • MQTT:轻量级协议,适合低带宽、高延迟环境。
  • TCP/IP:用于稳定连接。

平台层

平台层负责数据存储与处理,包括:

  1. 云平台:选择阿里云,提供强大存储和计算能力。
  2. 数据库:使用 MongoDB 存储非结构化数据,MySQL 存储结构化数据。
  3. 消息队列:RabbitMQ,解耦数据生产者和消费者。
  4. 大数据分析:Apache Spark,实时分析设备数据。

应用层

应用层提供用户交互界面,包括:

  1. Web 开发

    • 前端:使用 React 开发实时监控界面。
    • 后端:使用 Spring Boot 提供 RESTful API。

嵌入式硬件端代码

1. STM32 数据采集代码

以下代码展示如何使用 STM32 进行传感器数据的采集和处理。

#include "stm32f4xx_hal.h"
#include "sensor.h"
#include "communication.h"

// 定义 ADC 句柄
ADC_HandleTypeDef hadc1; // 温度传感器
ADC_HandleTypeDef hadc2; // 压力传感器

// 读取温度传感器数据
float readTemperature() {
    HAL_ADC_Start(&hadc1); // 启动 ADC
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 读取 ADC 值
    HAL_ADC_Stop(&hadc1); // 停止 ADC
    float temperature = (adcValue / 4096.0) * 100; // 转换为温度(假设线性关系)
    return temperature;
}

// 读取压力传感器数据
float readPressure() {
    HAL_ADC_Start(&hadc2); // 启动 ADC
    HAL_ADC_PollForConversion(&hadc2, HAL_MAX_DELAY); // 等待转换完成
    uint32_t adcValue = HAL_ADC_GetValue(&hadc2); // 读取 ADC 值
    HAL_ADC_Stop(&hadc2); // 停止 ADC
    float pressure = (adcValue / 4096.0) * 700; // 转换为压力(假设线性关系)
    return pressure;
}

// 主函数
void main() {
    HAL_Init(); // 初始化 HAL 库
    // 初始化 ADC 和其他外设
    SystemClock_Config(); // 配置系统时钟
    MX_ADC1_Init(); // 初始化 ADC1
    MX_ADC2_Init(); // 初始化 ADC2
    MX_USART2_UART_Init(); // 初始化串口,用于调试

    while(1) {
        // 采集数据
        float temperature = readTemperature();
        float pressure = readPressure();

        // 通过 Wi-Fi 模块发送数据
        sendDataToCloud(temperature, pressure);

        HAL_Delay(1000); // 每秒采集一次数据
    }
}

说明:

  • 代码中使用 STM32F4 系列单片机的 ADC 进行传感器数据的采集。
  • readTemperature() 和 readPressure() 函数负责从温度传感器和压力传感器读取数据,并进行相应的转换。
  • 在主循环中,每秒采集一次数据并调用 sendDataToCloud() 函数将数据发送到云平台。

2. MQTT 发送数据代码

以下代码展示如何将采集到的数据通过 MQTT 协议发送到云平台。

import paho.mqtt.client as mqtt
import json
import time

# MQTT 连接设置
broker = "broker.hivemq.com"  # MQTT 代理服务器
port = 1883
topic = "factory/sensor/data"

# 连接回调函数
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

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

# 连接到 MQTT 代理
client.connect(broker, port, 60)

# 发送数据到云平台
def sendDataToCloud(temperature, pressure):
    # 构造数据包
    data = {
        "temperature": temperature,
        "pressure": pressure
    }

    # 发布数据
    client.publish(topic, json.dumps(data))
    print("Data sent: ", data)

# 启动 MQTT 客户端
client.loop_start()

# 示例数据发送
while True:
    temp = 25.0  # 示例温度
    press = 101.3  # 示例压力
    sendDataToCloud(temp, press)
    time.sleep(5)  # 每5秒发送一次数据

说明:

  • 使用 paho-mqtt 库实现 MQTT 客户端。
  • on_connect() 是连接成功后的回调函数。
  • sendDataToCloud() 函数用于构造数据包并将数据发送到指定的 MQTT 主题。
  • 在示例循环中,每5秒发送一次示例的温度和压力数据。

 

Web 应用后端代码

搭建后端环境

1. 安装 JDK

首先,需要确保你的计算机上安装了 Java Development Kit (JDK)。可以从 Oracle JDK 官网 下载并安装 JDK 11 或更高版本。安装完成后,可以通过命令行检查安装情况:

java -version
2. 安装 Maven

Maven 是一个项目管理工具,用于构建和管理 Java 项目。可以从 Maven 官网 下载并安装 Maven。安装完成后,检查 Maven 是否安装成功:

mvn -version
3. 创建 Spring Boot 项目

使用 Maven 创建一个新的 Spring Boot 项目。可以使用命令行工具或通过 Spring Initializr 网站(https://start.spring.io/)生成项目。

在命令行中输入以下命令:

mvn archetype:generate -DgroupId=com.example.iot -DartifactId=iot-backend -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
4. 添加依赖

在项目根目录中的 pom.xml 文件中,添加 Spring Boot 和其他必要的依赖项。修改 pom.xml 文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.iot</groupId>
    <artifactId>iot-backend</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>11</java.version>
        <spring.version>2.5.6</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
5. 创建应用主类

在 src/main/java/com/example/iot 目录下创建一个名为 IoTApplication.java 的文件,作为应用的入口。

package com.example.iot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class IoTApplication {
    public static void main(String[] args) {
        SpringApplication.run(IoTApplication.class, args);
    }
}

创建数据模型

创建一个数据模型类来表示传感器数据。在 src/main/java/com/example/iot 目录下创建一个名为 SensorData.java 的文件。

package com.example.iot;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "sensor_data") // MongoDB 集合名
public class SensorData {
    @Id
    private String id;
    private float temperature;
    private float pressure;
    private long timestamp;

    // 构造函数
    public SensorData(float temperature, float pressure, long timestamp) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.timestamp = timestamp;
    }

    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

创建数据访问层

创建一个接口用于与 MongoDB 交互。在 src/main/java/com/example/iot 目录下创建一个名为 SensorDataRepository.java 的文件。

package com.example.iot;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface SensorDataRepository extends MongoRepository<SensorData, String> {
    List<SensorData> findTop10ByOrderByTimestampDesc(); // 获取最新的10条数据
}

说明:

  • SensorDataRepository 接口继承自 MongoRepository,提供了 CRUD 操作和自定义查询功能。
  • findTop10ByOrderByTimestampDesc() 方法用于获取最新的 10 条传感器数据。

创建服务层

在服务层中实现业务逻辑。创建一个名为 SensorDataService.java 的文件。

package com.example.iot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SensorDataService {
    @Autowired
    private SensorDataRepository sensorDataRepository;

    // 保存传感器数据
    public SensorData saveSensorData(SensorData sensorData) {
        return sensorDataRepository.save(sensorData);
    }

    // 获取最新的传感器数据
    public List<SensorData> getLatestData() {
        return sensorDataRepository.findTop10ByOrderByTimestampDesc();
    }
}

说明:

  • SensorDataService 类负责处理与传感器数据相关的业务逻辑,提供保存和获取数据的方法。

创建控制器层

在控制器层中处理 HTTP 请求。创建一个名为 SensorDataController.java 的文件。

package com.example.iot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/sensors") // API 路径前缀
public class SensorDataController {
    @Autowired
    private SensorDataService sensorDataService;

    // 接收并保存传感器数据
    @PostMapping("/data")
    public ResponseEntity<SensorData> postSensorData(@RequestBody SensorData sensorData) {
        SensorData savedData = sensorDataService.saveSensorData(sensorData);
        return ResponseEntity.ok(savedData);
    }

    // 获取最新传感器数据
    @GetMapping("/latest")
    public ResponseEntity<List<SensorData>> getLatestSensorData() {
        List<SensorData> latestData = sensorDataService.getLatestData();
        return ResponseEntity.ok(latestData);
    }
}

说明:

  • SensorDataController 类处理与传感器相关的 HTTP 请求。
  • postSensorData() 方法接收传感器数据并保存到数据库,使用 POST 请求。
  • getLatestSensorData() 方法获取最新的传感器数据,使用 GET 请求。

配置 MongoDB 连接

在 src/main/resources/application.properties 文件中添加 MongoDB 连接信息:

spring.data.mongodb.uri=mongodb://localhost:27017/iot_db

说明:

  • 将 localhost:27017 替换为你的 MongoDB 实例地址。
  • iot_db 是 MongoDB 中的数据库名称,可以根据需求自定义。

启动应用

在项目根目录下,使用以下命令启动 Spring Boot 应用:

mvn spring-boot:run

测试 API

使用 Postman 或 cURL 测试 API。

1. 保存传感器数据

使用 POST 请求向 http://localhost:8080/api/sensors/data 发送 JSON 数据:

{
    "temperature": 25.0,
    "pressure": 101.3,
    "timestamp": 1625255040000
}

可以使用 Postman 或 cURL 进行请求测试:

使用 Postman:

  1. 打开 Postman。
  2. 创建一个新的请求,选择 POST 方法。
  3. 在请求 URL 中输入 http://localhost:8080/api/sensors/data
  4. 在 Body 选项卡中选择 raw,然后选择 JSON 格式。
  5. 输入上述 JSON 数据。
  6. 点击 Send 按钮。

使用 cURL:

可以通过命令行使用以下 cURL 命令:

curl -X POST http://localhost:8080/api/sensors/data -H "Content-Type: application/json" -d '{"temperature": 25.0, "pressure": 101.3, "timestamp": 1625255040000}'

预期结果:
如果数据保存成功,应该返回 200 OK 状态码,并返回保存的传感器数据,包括生成的 ID。

{
    "id": "60e6f8c1d5f1a34c8b3a7d9a",
    "temperature": 25.0,
    "pressure": 101.3,
    "timestamp": 1625255040000
}
2. 获取最新传感器数据

使用 GET 请求向 http://localhost:8080/api/sensors/latest 获取最新的传感器数据。

使用 Postman:

  1. 创建一个新的请求,选择 GET 方法。
  2. 在请求 URL 中输入 http://localhost:8080/api/sensors/latest
  3. 点击 Send 按钮。

使用 cURL:

可以通过命令行使用以下 cURL 命令:

curl -X GET http://localhost:8080/api/sensors/latest

预期结果:
如果请求成功,应该返回 200 OK 状态码,并返回最新的传感器数据列表。

[
    {
        "id": "60e6f8c1d5f1a34c8b3a7d9a",
        "temperature": 25.0,
        "pressure": 101.3,
        "timestamp": 1625255040000
    },
    {
        "id": "60e6f8c1d5f1a34c8b3a7d9b",
        "temperature": 26.0,
        "pressure": 102.0,
        "timestamp": 1625255100000
    }
]

项目总结

通过本项目,我们实现了一套完整的物联网工厂检测系统,涵盖了数据采集、传输、存储和可视化的各个环节。以下是项目的主要收获和总结:

  1. 硬件与传感器选择:通过 STM32 单片机和多种传感器的结合,成功实现了对温度、压力等数据的实时采集。
  2. 数据传输:使用 MQTT 协议,将采集的数据高效地发送到云平台,保证了数据传输的实时性和可靠性。
  3. 后端开发:通过 Spring Boot 框架创建 RESTful API,实现了数据的存储、检索和管理,提供了良好的扩展性。
  4. 数据可视化:通过前端开发实现了数据的实时可视化,为用户提供了直观的监控界面,提升了用户体验。
  5. 云服务应用:利用 MongoDB 存储传感器数据,通过有效的数据管理,便于后续的数据分析和挖掘。

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

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

相关文章

Python 教程(九):内置模块与第三方模块

目录 专栏列表前言1. 模块基础目录结构示例模块 mymodule.py 2. 导入模块3. 从模块中导入特定内容3.1 from … import *总结&#xff1a; 4. 包示例包结构moduleone.pymoduletwo.py__init__.py导入包 5. 模块搜索路径6. 内置模块示例 7. 第三方库8. __name__ 属性9. 初始化和清…

开源小项目-基于STM32F103的频率测量实现 V1.1(ADC+TIM+DMA+FFT)

目录 一、快速傅里叶变换&#xff08;FFT&#xff09; 1.1 工作原理 1.2 应用 1.3 FFT官方支持库 二、使用外设简介 2.1 ADC外设 2.2 TIM外设 3.3 DMA外设 三、代码设计过程 3.1 初始化 3.2 DMA中断数据处理 3.3 其他自定义函数 1. 计算信号频率 2. 计算信号幅度…

G-EVAL: NLG Evaluation using GPT-4 with Better Human Alignment

文章目录 题目摘要方法实验分析相关工作结论 题目 G-EVAL:使用GPT-4进行NLG评估&#xff0c;具有更好的人类一致 论文地址&#xff1a;https://arxiv.org/abs/2303.16634 项目地址&#xff1a;https://github.com/nlpyang/geval 摘要 自然语言生成(NLG)系统生成的文本质量难以…

网站开发涉及到的技术内容介绍——前端

一、网站开发涉及前后端交互模式 一般来说网站项目分为两种【前后端不分离、前后端分离】,其中前后端不分离的项目是(后端语言可以直接与前端的html等内容糅合在一起,后端语言可以操作数据进行动态渲染前端的html文件进行展示)。后端分离的项目是(后端语言不会直接对前端的…

c++| c++11左右值引用,完美转发,可变参数模板

c| c11的新特性 左&#xff0c;右值引用什么是左值&#xff0c;右值左值引用和右值引用右值引用解决什么问题呢&#xff1f;移动构造万能引用形式 完美转发格式 lambada表达式格式 可变参数模板可变参数模板实现打印不同类型emplace_push以list的emplace_back的实现举例 左&…

掌握 HTTP 请求的艺术:理解 cURL GET 语法

在 Web 开发和服务器通信领域&#xff0c;掌握 HTTP 请求对于寻求有效与 Web 服务和 API 交互的开发人员至关重要。在众多可用于发出 HTTP 请求的工具中&#xff0c;cURL 脱颖而出&#xff0c;成为全球开发人员信赖的强大且多功能的命令行工具。在这篇博文中&#xff0c;我们将…

MySQL分组查询有关知识总结

目录 4. 分组查询&#xff08;group by&#xff09; 4.1 概述 4.2 分组函数 4.2.1 单个使用 4.2.2 组合使用 4.2.3 注意&#xff01; 4.3 group by 4.3.1 单个字段 4.3.2 多个字段 4.3.3 提醒&#xff01; 4.4 having 4.5 分组查询演示 4. 分组查询&#xff08;…

海外仓怎么入局?货代还有发展的空间吗?

很多货代小伙伴可能都有一个疑惑&#xff1a;海外仓虽然火爆&#xff0c;但是怎么入局呢&#xff1f;显然&#xff0c;自建海外仓的试错代价太高了&#xff0c;成本高、选址难、管理起来更是一地鸡毛。既然无法自建&#xff0c;那转换赛道&#xff0c;管理别人的仓库&#xff0…

iOS面试之属性关键字(二):常见面试题

Q:ARC下&#xff0c;不显式指定任何属性关键字时&#xff0c;默认的关键字都有哪些&#xff1f; 对应基本数据类型默认关键字是:atomic,readwrite,assign 对于普通的 Objective-C 对象:atomic,readwrite,strong Q&#xff1a;atomic 修饰的属性是怎么样保存线程安全的&#x…

如何将本地下载的切片电影进行合成一个视频

合成后的时长1&#xff1a;41 没有合成前是50个电影切片 注明:电影切片不是真实的切片名称而是自定义从0-50的数字 import requests # with open("电影.m3u8","r") as f: # n0 # for line in f: # if line.startswith("#"): …

SpringBoot项目如何安装Selenium自动化(详解)

目录 一、打开intellij idea&#xff0c;创建Maven项目 二、添加依赖 三、在Test路径下创建自动化文件 3.1 项目结构 3.2 代码 四、运行自动化 前言&#xff1a; java版本最低要求为8。电脑至少已安装一种浏览器&#xff0c;如&#xff1a;Chrome&#xff08;推荐&#xff09;、…

十日Python项目——第五日(商品数据)

#前言&#xff1a; 在最近十天我会用Python做一个购物类项目&#xff0c;会用到DjangoMysqlRedisVue等。 今天是第五天&#xff0c;主要负责撰写响应具体的商品数据。若是有不懂大家可以先阅读我的前四篇博客以能够顺承。 若是大家基础有不懂的&#xff0c;小编前面已经关于…

RJ45空包弹网口描述与应用

RJ45空包弹网口&#xff0c;通常指的是RJ45接口的空芯线缆&#xff08;通常称为“空包”&#xff09;和相应的连接器。这种线缆和连接器组合常用于网络布线中&#xff0c;特别是在需要将网络信号从一端传输到另一端&#xff0c;同时保持信号完整性和隔离性的场合。 描述&#…

C++初阶:list的使用和模拟实现

关于list可以先看一下这个文档&#xff1a;list文档 一.list的介绍和使用 1.1 list的介绍 list实际上就是链表&#xff0c;是带头双向循环链表。 1.2 list的使用 list的使用跟我们以前用C语言实现时的一样。push&#xff0c;pop&#xff0c;insert等等。 1.2.1list的构造 …

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…

简单的 微服务netflix 学习

简单的 微服务netflix 学习 一.Eureka 学习 1. 服务简单搭建 1.1 首先确定pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-…

FPGA入门系列:计数器

目录 微信公众号获取更多FPGA相关源码&#xff0c;且微信公众号为首发&#xff0c;第一时间获取最新文章&#xff1a; 计数器是一种典型的时序器件&#xff0c;常用于对时钟脉冲的个数进行计数&#xff0c;还用于定时、分频、产生同步脉冲等 按触发方式分&#xff1a;同步计数…

国内SSL证书颁发机构哪家服务更优质?

SSL证书作为保障网站数据传输安全的关键工具&#xff0c;其重要性不言而喻。选择一个可靠的SSL证书代理商&#xff0c;不仅能够提供多样化的证书类型&#xff0c;而且能在众多品牌中进行比较&#xff0c;选择最适合自己的、性价比更高的产品。此外&#xff0c;优质的代理商还能…

JAVA项目基于Spring Boot的多媒体素材库

目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导&#xff0c;获取源码后台 一、前言 信息化管理时代已至&#xff0c;计算机与互联网技术深度融合于生活点滴。本系统源于对用户需求的深刻洞…

Spark学习之SaprkCore

FlinkCore 1、JavaAPI 1、创建一个Topic并写入数据 向Kafka写数据 如果topic不存在则会自动创建一个副本和分区数都是1的topic package com.shujia.kafka;import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord…