赞
踩
随着工业4.0和物联网(IoT)技术的发展,越来越多的工厂借助智能化手段进行生产数据的采集和实时监控。本项目设计并实现一个物联网工厂检测系统,通过传感器采集关键参数,并利用云平台进行数据存储和分析,以提高生产效率和产品质量。
系统设计分为四个层次:硬件层、网络层、平台层和应用层。
硬件层是系统的基础,包括:
嵌入式系统:使用 STM32F4 单片机,具备强大的处理能力和丰富的外设接口,通过 ADC 连接各类传感器。
传感器:
通信模块:
网络层负责设备通信,采用协议包括:
平台层负责数据存储与处理,包括:
应用层提供用户交互界面,包括:
Web 开发:
以下代码展示如何使用 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); // 每秒采集一次数据
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
说明:
readTemperature()
和 readPressure()
函数负责从温度传感器和压力传感器读取数据,并进行相应的转换。sendDataToCloud()
函数将数据发送到云平台。以下代码展示如何将采集到的数据通过 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秒发送一次数据
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
说明:
paho-mqtt
库实现 MQTT 客户端。on_connect()
是连接成功后的回调函数。sendDataToCloud()
函数用于构造数据包并将数据发送到指定的 MQTT 主题。
首先,需要确保你的计算机上安装了 Java Development Kit (JDK)。可以从 Oracle JDK 官网 下载并安装 JDK 11 或更高版本。安装完成后,可以通过命令行检查安装情况:
java -version
Maven 是一个项目管理工具,用于构建和管理 Java 项目。可以从 Maven 官网 下载并安装 Maven。安装完成后,检查 Maven 是否安装成功:
mvn -version
使用 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
在项目根目录中的 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>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
在 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;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
创建一个接口用于与 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();
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
说明:
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);
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
说明:
SensorDataController
类处理与传感器相关的 HTTP 请求。postSensorData()
方法接收传感器数据并保存到数据库,使用 POST 请求。getLatestSensorData()
方法获取最新的传感器数据,使用 GET 请求。在 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
使用 Postman 或 cURL 测试 API。
使用 POST 请求向 http://localhost:8080/api/sensors/data
发送 JSON 数据:
- {
- "temperature": 25.0,
- "pressure": 101.3,
- "timestamp": 1625255040000
- }
可以使用 Postman 或 cURL 进行请求测试:
使用 Postman:
http://localhost:8080/api/sensors/data
。使用 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
- }
使用 GET 请求向 http://localhost:8080/api/sensors/latest
获取最新的传感器数据。
使用 Postman:
http://localhost:8080/api/sensors/latest
。使用 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
- }
- ]
通过本项目,我们实现了一套完整的物联网工厂检测系统,涵盖了数据采集、传输、存储和可视化的各个环节。以下是项目的主要收获和总结:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。