当前位置: 首页 > news >正文

STM32、Spring Boot、MQTT和React Native:智能停车管理系统的全栈开发详解(附代码示例)

1. 项目概述

随着城市化进程的加快,停车难已成为许多大中城市面临的普遍问题。为了提高停车效率,改善用户体验,本文设计并实现了一套智能停车管理系统。该系统利用STM32微控制器、各类传感器以及移动应用,实现了停车位实时监控、在线预约和自动支付等功能,为用户提供了便捷的停车服务。

本系统的主要功能包括:

  1. 实时监控停车位状态
  2. 提供停车位在线预约
  3. 自动识别车牌
  4. 移动应用支付功能
  5. 停车数据统计和分析

2. 系统设计

2.1 硬件设计

系统的硬件部分主要包括以下组件:

  • STM32F103微控制器:作为系统的核心控制单元
  • HC-SR04超声波传感器:检测车位是否有车辆占用
  • OV7670摄像头模块:采集车牌图像
  • ESP8266 Wi-Fi模块:实现与服务器的无线通信
  • LED指示灯:显示车位状态(红色表示占用,绿色表示空闲)

硬件连接示意图如下:

2.2 软件设计

软件架构采用前后端分离的设计,具体包括:

  • 前端:使用React Native开发跨平台移动应用
  • 后端:采用Spring Boot框架,提供RESTful API
  • 数据库:使用MySQL存储用户信息、停车记录等数据
  • 消息队列:使用RabbitMQ处理高并发场景下的消息传递
  • 缓存:使用Redis缓存热点数据,提高系统响应速度

软件架构图如下:

3. 代码实现

3.1 STM32固件代码

以下是STM32读取超声波传感器数据并通过MQTT上传的示例代码:

 

#include "stm32f1xx_hal.h"
#include "mqtt.h"// 定义引脚
#define TRIG_PIN GPIO_PIN_0
#define TRIG_PORT GPIOA
#define ECHO_PIN GPIO_PIN_1
#define ECHO_PORT GPIOA// 初始化超声波传感器
void init_hcsr04(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置TRIG引脚为输出GPIO_InitStruct.Pin = TRIG_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);// 配置ECHO引脚为输入GPIO_InitStruct.Pin = ECHO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
}// 获取距离数据
uint16_t get_distance(void) {uint32_t start_time, end_time;uint16_t distance;// 发送10us的触发脉冲HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);HAL_Delay_us(10);HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);// 等待回波while(HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET);start_time = HAL_GetTick();while(HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET);end_time = HAL_GetTick();// 计算距离 (声速约为340m/s,来回需要除以2)distance = (end_time - start_time) * 340 / 2 / 1000;return distance;
}// MQTT数据上传
void upload_data(uint16_t distance) {char payload[50];sprintf(payload, "{\"parkingId\": 1, \"distance\": %d}", distance);mqtt_publish("parking/status", payload);
}// 主循环
void main(void) {// 初始化硬件HAL_Init();init_hcsr04();mqtt_init();while(1) {uint16_t dist = get_distance();// 判断停车位状态if (dist < 50) {  // 如果距离小于50cm,认为有车HAL_GPIO_WritePin(LED_PORT, LED_PIN_RED, GPIO_PIN_SET);HAL_GPIO_WritePin(LED_PORT, LED_PIN_GREEN, GPIO_PIN_RESET);} else {HAL_GPIO_WritePin(LED_PORT, LED_PIN_RED, GPIO_PIN_RESET);HAL_GPIO_WritePin(LED_PORT, LED_PIN_GREEN, GPIO_PIN_SET);}upload_data(dist);HAL_Delay(1000);  // 每秒检测一次}
}

这段代码实现了以下功能:

  1. 初始化超声波传感器的GPIO引脚
  2. 通过超声波传感器测量距离
  3. 根据测量距离判断停车位状态,并控制LED指示灯
  4. 通过MQTT协议上传停车位状态数据

3.2 Spring Boot后端代码

以下是处理停车位状态更新的Spring Boot控制器示例:

@RestController
@RequestMapping("/api/parking")
public class ParkingController {@Autowiredprivate ParkingService parkingService;@PostMapping("/status")public ResponseEntity<?> updateStatus(@RequestBody ParkingStatus status) {try {ParkingSpot updatedSpot = parkingService.updateParkingStatus(status);return ResponseEntity.ok(updatedSpot);} catch (Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error updating parking status");}}@GetMapping("/available")public ResponseEntity<?> getAvailableSpots() {try {List<ParkingSpot> availableSpots = parkingService.getAvailableSpots();return ResponseEntity.ok(availableSpots);} catch (Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error fetching available spots");}}@PostMapping("/reserve")public ResponseEntity<?> reserveSpot(@RequestBody ReservationRequest request) {try {Reservation reservation = parkingService.reserveSpot(request);return ResponseEntity.ok(reservation);} catch (Exception e) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Error reserving spot: " + e.getMessage());}}
}

这个控制器实现了以下功能:

  1. 更新停车位状态
  2. 获取可用停车位列表
  3. 预约停车位

3.3 React Native前端代码

以下是React Native应用中显示可用停车位的组件示例:

import React, { useState, useEffect } from 'react';
import { View, Text, FlatList, StyleSheet } from 'react-native';
import axios from 'axios';const AvailableSpots = () => {const [spots, setSpots] = useState([]);useEffect(() => {const fetchSpots = async () => {try {const response = await axios.get('http://api.example.com/parking/available');setSpots(response.data);} catch (error) {console.error('Error fetching available spots:', error);}};fetchSpots();const interval = setInterval(fetchSpots, 30000); // 每30秒更新一次return () => clearInterval(interval);}, []);const renderSpot = ({ item }) => (<View style={styles.spotItem}><Text>Spot ID: {item.id}</Text><Text>Status: {item.status}</Text></View>);return (<View style={styles.container}><Text style={styles.title}>Available Parking Spots</Text><FlatListdata={spots}renderItem={renderSpot}keyExtractor={item => item.id.toString()}/></View>);
};const styles = StyleSheet.create({container: {flex: 1,padding: 10,},title: {fontSize: 20,fontWeight: 'bold',marginBottom: 10,},spotItem: {padding: 10,borderBottomWidth: 1,borderBottomColor: '#ccc',},
});export default AvailableSpots;

这个组件实现了以下功能:

  1. 在组件加载时获取可用停车位数据
  2. 每30秒自动更新数据
  3. 使用FlatList组件展示停车位列表

4. 项目总结

本智能停车管理系统通过整合硬件传感器、微控制器、后端服务和移动应用,实现了停车位的实时监控、在线预约和自动支付等功能,为用户提供了便捷的停车服务。系统的主要特点和优势包括:

  1. 实时监控:利用STM32微控制器和超声波传感器,实现了对停车位状态的实时监测,确保数据的及时性和准确性。

  2. 高效通信:采用MQTT协议进行设备与服务器之间的通信,保证了数据传输的可靠性和实时性。

  3. 可扩展性:采用前后端分离的架构设计,使用Spring Boot构建后端服务,便于系统的扩展和维护。

  4. 用户友好:通过React Native开发的移动应用,为用户提供了直观、易用的界面,方便查看停车位状态和进行预约操作。

  5. 性能优化:引入Redis缓存和RabbitMQ消息队列,有效提高了系统在高并发场景下的性能表现。

在实际应用中,本系统可以显著提高停车场的管理效率,减少用户寻找停车位的时间,从而缓解城市交通压力。同时,系统收集的数据也可用于进一步的分析和优化,如停车位使用率统计、高峰期预测等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • react-draft-wysiwyg API
  • Nacos 服务发现(订阅)源码分析(服务端)
  • 数据仓库事实表
  • 【微服务实战之Docker容器】第六章-复杂安装(Mysql主从Redis集群)
  • 代理伺服器分類詳解
  • ArcGIS Pro SDK (九)几何 10 弧
  • 【数据结构】初识数据结构
  • AI、AGI、AIGC与AIGC、NLP、LLM,ChatGPT区分
  • Nature子刊 | ATAC-seq、RNA-seq和蛋白组联合分析揭示脂质激活转录因子PPARα在肾脏代偿性肥大的作用机制
  • pdf怎么压缩的小一点?PDF压缩变小的6种方法(2024全新)
  • 数学基础【俗说矩阵】:初等矩阵和矩阵的初等行变化关系推导
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar
  • python内置zip函数详解
  • Linux——多路复用之poll
  • ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾
  • 30天自制操作系统-2
  • CSS 三角实现
  • javascript面向对象之创建对象
  • Java小白进阶笔记(3)-初级面向对象
  • Js基础知识(一) - 变量
  • Linux Process Manage
  • Linux链接文件
  • MaxCompute访问TableStore(OTS) 数据
  • mysql_config not found
  • nodejs:开发并发布一个nodejs包
  • php面试题 汇集2
  • Python打包系统简单入门
  • React-Native - 收藏集 - 掘金
  • v-if和v-for连用出现的问题
  • webpack4 一点通
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 电商搜索引擎的架构设计和性能优化
  • 基于HAProxy的高性能缓存服务器nuster
  • 技术发展面试
  • 入口文件开始,分析Vue源码实现
  • 入手阿里云新服务器的部署NODE
  • 实战|智能家居行业移动应用性能分析
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​如何在iOS手机上查看应用日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​用户画像从0到100的构建思路
  • # SpringBoot 如何让指定的Bean先加载
  • #define,static,const,三种常量的区别
  • (04)odoo视图操作
  • (2.2w字)前端单元测试之Jest详解篇
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)二分查找 超详细
  • (C语言)字符分类函数
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现