基于单片机+毫米波雷达技术设计的车内生命体征监测系统

一、前言

1.1 项目介绍

【1】项目开发背景

随着汽车智能化和网联化的不断推进,越来越多的安全技术被集成到车辆中,以提升驾驶体验与乘车安全。尤其是在新能源车型中,由于其结构更为封闭,空调系统运行时更趋于密闭循环,一旦在车内遗留儿童或宠物,在高温或空气不流通的环境下极易引发窒息、中暑等严重事故。近年来,关于儿童被遗忘在车内导致伤亡的事件屡有报道,引起了社会的广泛关注。因此,如何在车辆静止状态下有效检测车内生命体征并及时报警,成为亟需解决的重要课题。

毫米波雷达技术以其高精度、强穿透能力和对微动目标的灵敏感知能力,在生命体征检测领域得到了广泛应用。相比传统的红外或摄像头方式,毫米波雷达更适用于复杂光照或遮挡环境,能够稳定检测呼吸、心跳等微弱的生命特征信号。将毫米波雷达与车载系统相结合,能够实现车内是否有人员滞留的实时判断,为智能汽车安全技术的升级提供了新路径。

此外,车内环境变化也是影响乘员安全的重要因素。高温、高湿、高浓度二氧化碳等都可能对滞留人员造成健康威胁。因此,在系统中集成温湿度、二氧化碳浓度监测,能够更全面评估车内安全环境。同时,结合GPS定位功能、震动感知、车辆姿态识别等手段,可实现车辆运行状态的综合判断,并通过数据上云功能实现远程监控和紧急报警响应,极大提高了系统的智能化和实用性。

为了实现更完善的远程交互与数据可视化,系统还开发了支持Android平台的手机APP与Windows平台的上位机软件,基于Qt5框架设计,提供实时数据显示、历史记录查询与报警弹窗等功能,并通过集成百度地图接口实现车辆位置的可视化定位展示。硬件端采用STM32F103C8T6作为主控芯片,配合多种传感器模块和4G通信模块,构建起完整的数据采集、处理、传输与响应机制,形成一套低功耗、高可靠性、高集成度的智能监测系统。

本项目的开发不仅有助于提升车辆安全管理水平,还具有良好的社会意义与应用前景,特别是在当前国家大力推动智慧交通和车载安全系统建设的背景下,基于单片机与毫米波雷达技术的车内生命体征监测系统具有广阔的市场价值与推广潜力。

【2】设计实现的功能

(1)支持人体检测:通过24GHz毫米波雷达模块LD2402实现车内人体的存在检测,可识别静止和微动目标,用于判断车内是否遗留儿童或人员。

(2)支持二氧化碳检测:采用SGP30传感器,实时检测车内空气中二氧化碳浓度,用于评估车内空气质量与安全性。

(3)支持震动检测:通过震动传感器判断车辆是否发生震动,用于辅助判断车辆是否被非法破坏或移动。

(4)支持通风风扇控制:当监测到车内温度或二氧化碳浓度超过阈值时,可自动控制外循环风扇启停,实现通风换气。

(5)支持GPS定位:采用中科微GPS模块,实现对车辆实时定位,位置数据上传至云端并在APP与上位机上实时展示。

(6)支持温度和湿度检测:采用SHT30传感器采集车内温湿度信息,用于判断车内环境的舒适度与安全风险。

(7)支持车辆姿态检测:通过ADXL345三轴加速度传感器,检测车辆当前的姿态状态(如静止或行驶),作为系统自动报警条件判断的依据。

(8)支持数据上云:使用合宙Air780e 4G模块,通过MQTT协议将数据上传至华为云IOT物联网平台,支持远程访问与数据管理。

(9)支持本地显示屏显示:使用0.96寸OLED屏幕显示车内各类传感器实时数据,便于现场查看系统运行状态。

(10)支持自动报警:当车辆静止、检测到车内有人,且温度或二氧化碳浓度超过阈值时,系统将触发蜂鸣器报警,同时在APP与上位机上弹窗提示,并通过4G模块向指定联系人发送短信报警。

(11)支持主动SOS求助:用户可通过本地按键触发求助信号,系统将立即向APP与上位机弹窗报警,并通过短信通知联系人,实现紧急求救功能。

【3】项目硬件模块组成

(1)主控模块:采用STM32F103C8T6单片机作为核心控制器,负责各传感器数据的采集、处理、显示和通信控制。

(2)人体检测模块:使用海凌科LD2402 24GHz毫米波雷达模块,用于检测车内人员存在及微动状态。

(3)二氧化碳检测模块:采用SGP30传感器模块,检测车内空气中的二氧化碳浓度和空气质量参数。

(4)震动检测模块:使用震动传感器模块(高低电平输出),用于检测车辆是否受到外力震动或移动。

(5)通风控制模块:通过控制外部风扇的继电器开关,实现通风换气控制,改善车内空气质量。

(6)GPS定位模块:选用中科微电子的GPS模块,实时获取车辆的经纬度位置信息。

(7)环境温湿度检测模块:采用SHT30温湿度传感器,用于监测车内环境温度和湿度。

(8)车辆姿态检测模块:使用ADXL345三轴加速度传感器,检测车辆姿态及静止/运动状态。

(9)4G通信模块:采用合宙Air780e模块,实现数据通过MQTT协议上传至华为云IOT平台,并支持短信发送功能。

(10)本地显示模块:采用0.96寸IIC接口OLED显示屏,用于显示车内检测到的各类传感器数据和系统状态。

(11)蜂鸣器报警模块:使用高电平触发有源蜂鸣器模块,在检测到危险或报警条件时发出声音警报。

(12)按键模块:设置有4个独立按键,实现翻页显示、人为触发SOS求助等功能。

(13)电源模块:整套系统由可充电锂电池供电,支持移动便携使用,确保系统在断电情况下仍能持续工作。

【4】设计意义

随着新能源汽车的普及和智能驾驶技术的发展,车内安全问题日益受到社会关注,特别是因儿童被遗忘在车内导致的高温窒息等悲剧屡有发生,严重威胁人身安全。因此,设计一套可靠、智能的车内生命体征监测系统具有重要的现实意义和社会价值。

本项目基于STM32单片机和毫米波雷达技术,结合多种传感器实现对车内环境及人员状态的实时监测,能够有效检测车内是否有人存在,配合温湿度、二氧化碳、震动等信息进行综合判断,当出现异常情况时,能主动触发本地蜂鸣器报警,并通过4G网络向用户发送短信报警,提升车内安全防护能力。

系统还支持GPS定位与数据上云功能,通过与华为云IOT平台连接,实现了远程数据可视化及告警推送,用户可通过APP或上位机软件实时查看车辆位置及各项环境参数,远程获取预警信息,第一时间做出响应,有效避免因信息滞后而导致的风险扩大。

此外,项目采用低功耗设计和锂电池供电方式,保证系统在车辆熄火或断电状态下依然能持续运行,增强了系统的实用性与可靠性。通过主动求助按键等人性化设计,还能在紧急情况下手动触发SOS报警,进一步完善了整套车内安全预警体系。

综上所述,该系统从技术实现到功能集成,紧扣实际需求,具有良好的推广应用前景,不仅提升车辆的智能化水平,也为守护乘客特别是儿童的生命安全提供了坚实的技术保障。

【5】市面上同类产品研究现状

目前,车内生命体征监测系统作为智能汽车安全技术的重要组成部分,已逐渐在部分中高端车型中得到应用和推广,主要采用毫米波雷达、红外传感、视觉识别等技术手段来实现车内人员存在检测与环境监测,具有较高的商业价值和技术成熟度。以下是市面上几种典型的同类产品与实际应用案例:

1. 蔚来(NIO)车型内置的"儿童遗留检测系统" 蔚来在其智能电动车中率先应用了毫米波雷达生命体征检测技术,系统通过高精度雷达传感器检测车内微动(如婴儿呼吸),在车辆锁车后仍持续工作。当检测到车内有人存在时,会通过APP、车载屏幕和声音发出警告,并主动触发空调通风,提升车内安全等级。

2. 理想汽车(Li Auto)L系列生命体征监测系统 理想L9等车型配备了基于60GHz毫米波雷达的"乘员感知系统",可实现对车内静止人员的存在识别。在极端天气或停车场长时间停放时,该系统可有效避免儿童被遗留风险,一旦检测到车内有生命体征且车内温度异常,即启动空调降温并通过手机App提醒车主。

3. 特斯拉(Tesla)座舱监控系统 特斯拉在部分新款车型中集成了"车内乘员感知系统",结合座舱内雷达和热成像技术对人员位置、体温、呼吸等状态进行实时监控。该系统可在锁车状态下持续监测车内人员并预警,一旦异常检测,会通过车载蜂鸣器和APP通知进行提醒。

4. 现代(Hyundai)和起亚(Kia) Rear Occupant Alert 系统 现代和起亚推出的"后排乘员提醒系统"则使用超声波传感器检测后排是否有乘员存在,若锁车后仍检测到人存在,会通过汽车喇叭和灯光报警。这一技术在北美市场已作为法规要求强制安装于新款车型中。

5. 德赛西威(Desay SV)生命体征检测方案 作为国内领先的车载系统供应商,德赛西威推出了基于24GHz毫米波雷达的车内乘员感知方案,可实时监测车内人体存在、姿态和呼吸频率,并已在部分合资品牌车型中商用,技术成熟度较高。

综上,当前主流车企和汽车电子企业已纷纷布局车内生命体征监测技术,毫米波雷达成为实现该功能的核心传感方式之一,具备非接触、高穿透性、适应性强等优点。但部分入门或低价车型仍缺乏该类系统,为本项目基于低成本STM32方案提供了技术可行性与市场应用空间。

【6】摘要

随着智能汽车技术的不断发展与社会对车内乘员安全问题的重视,车内生命体征监测系统在汽车领域中的应用日益广泛。本文设计并实现了一种基于STM32单片机与毫米波雷达技术的车内生命体征监测系统。系统采用海凌科LD2402毫米波雷达模块实现人体存在检测,结合温湿度、二氧化碳浓度、震动、姿态等多种环境与状态传感器,完成对车内生命迹象与环境安全状态的综合感知。通过Air780E 4G模块实现数据远程上云,系统支持MQTT协议接入华为云IOT平台,Android手机APP与Windows上位机软件采用QT(C++)开发,可实时查看车辆定位及各项传感器数据。本地OLED屏可显示所有检测数据,蜂鸣器和短信功能实现自动或手动报警提醒。本系统具有实时性强、响应快速、部署成本低等特点,具备良好的实用性和推广价值。

关键词: STM32;毫米波雷达;车内生命体征监测;华为云IOT;MQTT;环境监测;自动报警;智能汽车安全

1.2 设计思路

本系统的设计以"保障车内乘员安全,防止人员遗留风险"为核心目标,结合毫米波雷达技术与多种环境传感手段,构建一个低功耗、实时响应、远程互联的智能监测系统。系统总体采用模块化设计,主控芯片选用STM32F103C8T6,以提高系统的处理效率与稳定性,同时方便后期拓展。

在核心功能实现方面,人体检测采用24GHz毫米波雷达模块LD2402,可精准识别车内人体的微动信号(如呼吸),实现静止状态下的人员检测。结合二氧化碳浓度传感器SGP30以及温湿度传感器SHT30,可全面监测车内环境状态,判断是否存在高温、高湿或缺氧风险。在车辆静止且检测到生命体征存在的前提下,若环境指标超过设定阈值,系统将自动触发声光报警并推送警报信息至远程终端。

为了增强车辆状态判断能力,系统引入震动传感器与ADXL345三轴加速度模块,实现对车辆是否行驶、静止或剧烈晃动状态的判断。通过GPS模块获取车辆地理位置,并在APP和上位机中调用百度地图接口进行定位展示,便于用户第一时间掌握车辆位置与状态。

通信方面,系统采用合宙Air780E 4G模块,通过MQTT协议接入华为云IOT物联网平台,将各项监测数据实时上传。用户可通过Android手机APP或Windows上位机远程查看车辆状态信息,并接收自动或手动报警通知。同时,系统支持本地按键触发SOS求助功能,及时发送位置信息与报警短信,提升应急处理能力。

数据展示方面,系统配备0.96寸OLED显示屏用于本地数据显示,便于调试与现场查看。蜂鸣器模块用于异常状态下的本地报警提示,提高现场警示效果。系统整体供电采用可充电锂电池方案,支持移动部署,便于安装在车内不同位置。

本设计通过软硬件的协同工作,实现车内生命体征的高精度检测、环境监测、状态判断和远程数据交互,具备良好的实用性、可移植性和工程实现性。

1.3 系统功能总结

序号 功能名称 功能描述
1 人体存在检测 使用24GHz毫米波雷达检测车内是否存在生命体征,如呼吸、心跳等微动信号。
2 二氧化碳浓度检测 使用SGP30传感器检测车内CO₂浓度,判断通风状况与人员安全。
3 震动检测 检测车辆是否发生震动,辅助判断车辆状态及异常情况。
4 通风风扇控制 若CO₂浓度过高或温度过高,自动控制风扇通风降温。
5 GPS定位 使用GPS模块实现车辆定位,可在APP或上位机地图上查看当前位置。
6 温湿度检测 使用SHT30传感器检测车内环境温度与湿度,评估舒适度与安全性。
7 姿态检测 使用ADXL345检测车辆姿态,判断是否处于静止、移动或翻覆状态。
8 数据上云 通过Air780E模块将数据通过MQTT协议上传至华为云IOT平台。
9 本地OLED显示 使用0.96寸OLED屏幕显示所有传感器采集的实时数据,便于查看与调试。
10 自动报警 当检测到有人且环境异常(如高温、高CO₂浓度),触发蜂鸣器报警并发送短信。
11 主动SOS求助 按下本地按键后触发SOS,远程APP弹窗并发送求助短信至预设联系人。
12 APP与上位机远程监控 QT开发的Android APP与Windows上位机实时显示数据,并接收警报信息。
13 百度地图定位显示 APP中集成百度地图接口,展示车辆当前位置与状态信息。

1.4 开发工具的选择

【1】设备端开发

硬件设备端的开发主要依赖于C语言,利用该语言直接操作硬件寄存器,确保系统运行的高效性和低延迟。C语言在嵌入式开发中具有广泛的应用,它能够直接访问硬件,满足对资源消耗和响应速度的严格要求。为了编写高效、稳定的代码,开发工具选择了Keil uVision 5作为主要的开发环境。Keil是一个专业的嵌入式开发工具,广泛应用于基于ARM架构的微控制器(如STM32)开发。Keil提供了完善的调试、编译和仿真支持,能够帮助在软件开发过程中高效地进行调试、单步执行以及断点设置,确保开发的稳定性和高效性。 STM32F103RCT6是项目中使用的主控芯片,它基于ARM Cortex-M3架构,拥有强大的计算能力和丰富的外设接口。在硬件编程中,寄存器级编程是常用的方式,这要求开发者对芯片的硬件寄存器有深入的理解。在Keil环境中,通过STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以满足各个硬件模块(如传感器、执行器、显示屏等)与主控芯片的交互。使用寄存器编程能够提供更高效、精确的控制,避免了外部库的开销,同时也能深入调控硬件特性,提升系统性能。

【2】上位机开发

本项目的上位机开发基于Qt 5框架,使用**C++**作为主要编程语言。Qt是一个跨平台的应用开发框架,广泛用于开发GUI应用程序。Qt提供了丰富的GUI组件和工具,能够高效地实现图形界面的设计与开发。C++则作为Qt的底层语言,具有高效的性能和良好的控制力,非常适合用于处理设备与系统之间的数据交互、通信协议的实现和复杂的计算任务。在项目中,Qt被用于开发Windows平台的桌面应用程序以及Android平台的手机APP。Qt框架的跨平台特性使得开发者能够使用同一套代码在不同操作系统上进行构建和部署,大大提高了开发效率。

为了方便开发和调试,上位机的开发采用了Qt Creator 作为主要的集成开发环境(IDE)。Qt Creator是一款由Qt官方提供的开发工具,专为Qt应用程序开发设计,支持C++、QML和JavaScript等语言。Qt Creator提供了丰富的功能,如代码编辑、调试、构建、版本控制集成等,能够显著提升开发者的生产力。在本项目中,Qt Creator为开发者提供了自动化构建、界面设计工具(如Qt Designer)和调试工具(如QDebug和QML调试工具),使得开发过程更加高效和流畅。 上位机与硬件设备端的通信采用了基于TCP/IP协议的数据传输方式。为了实现这一功能,Qt提供了丰富的网络编程支持,尤其是QTcpSocketQTcpServer类,使得上位机能够轻松地与硬件设备建立TCP连接,进行数据收发。上位机通过WIFI连接ESP8266-WIFI模块,ESP8266模块创建TCP服务器,上位机应用则作为客户端连接到服务器,进行实时的数据传输与控制命令的下发。 为了满足不同用户的需求,本项目需要支持Windows平台的桌面应用和Android平台的移动APP。Qt的跨平台特性使得开发人员能够在一个代码库下完成多平台应用的开发和移植。开发者仅需要编写一次应用逻辑和用户界面,就可以通过Qt的跨平台构建工具生成Windows和Android两个平台的可执行文件。此外,Qt提供了丰富的文档和社区支持,帮助开发者解决平台差异和兼容性问题,确保应用在不同平台上都能稳定运行。

总体而言,上位机开发环境采用了Qt 5框架和C++语言,结合Qt Creator集成开发环境,提供了一个高效、稳定、跨平台的开发工具链。通过Qt强大的GUI设计、网络通信、多线程支持以及数据库管理功能,开发者能够轻松实现与硬件设备的交互、控制设备、处理传感器数据,并为用户提供直观、流畅的操作体验。

1.5 模块的技术详情介绍


(1)STM32F103C8T6 主控芯片

  • 功能:作为系统的核心控制器,负责各传感器数据采集、逻辑判断、显示控制、数据上传与通信管理等任务。
  • 特点:性能稳定,资源充足(64KB Flash,20KB SRAM),支持多种外设接口(I2C、UART、SPI、ADC等),价格低廉,易于开发,适合嵌入式系统应用。

(2)LD2402 24GHz毫米波雷达模块

  • 功能:用于检测车内是否存在生命体征(呼吸、心跳等微动信号)。
  • 特点:支持静止人体检测、运动人体检测、微动感应,抗干扰能力强,不受温湿度和光照影响,适用于密闭车内环境。

(3)SGP30 二氧化碳浓度检测模块

  • 功能:检测车内空气中CO₂浓度,判断空气是否清新或存在安全隐患。
  • 特点:集成多种气体检测能力,响应速度快,精度高,输出为数字信号,便于与MCU通信。

(4)SHT30 温湿度传感器

  • 功能:实时采集车内温度和湿度数据,供系统评估环境状况。
  • 特点:高精度、低功耗、响应快,I2C通信接口,体积小,抗干扰能力强,适合车载应用。

(5)Air780E 4G通信模块

  • 功能:通过MQTT协议连接华为云物联网平台,实现数据上传、远程控制与短信发送。
  • 特点:支持全网通4G通信、低功耗、具备短信收发功能,支持串口通信,适合物联网应用。

(6)GPS模块(中科微电子)

  • 功能:获取车辆的实时地理位置信息,上传至云平台并显示于地图中。
  • 特点:定位精度高,冷启动速度快,兼容性好,支持串口输出NMEA格式数据。

(7)ADXL345 三轴加速度传感器

  • 功能:检测车辆的姿态状态(加速度、倾斜、晃动等),辅助判断是否静止或行驶中。
  • 特点:三轴输出,分辨率高,支持I2C/SPI通信,功耗低,体积小。

(8)震动传感器(数字输出型)

  • 功能:检测车辆是否发生震动,用于判断外部冲击或非法进入。
  • 特点:高低电平输出,结构简单,响应灵敏,便于与MCU集成。

(9)0.96寸 OLED 显示屏(IIC接口)

  • 功能:实时显示各项传感器数据和系统运行状态,方便本地查看与调试。
  • 特点:显示清晰,功耗低,支持图形与字符显示,I2C通信简化连线。

(10)蜂鸣器(高电平触发有源型)

  • 功能:在系统检测到报警条件(如有人+高温+高CO₂)时发出声响报警。
  • 特点:高电平触发,声音大,驱动简单,适合现场警示场景。

(11)独立按键模块

  • 功能:实现页面切换、手动SOS报警等操作功能。
  • 特点:结构简单,响应灵敏,便于实现用户输入功能。

(12)锂电池供电模块

  • 功能:为整个系统提供稳定的工作电源,支持系统移动部署。
  • 特点:可充电,容量大,体积小,适合便携式设备使用。

1.6 上传华为云的属性字段

基于单片机+毫米波雷达技术的车内生命体征监测系统,向华为云物联网平台上传的数据(属性字段)主要是各个传感器和模块采集的关键状态和数值,以及报警和设备状态信息。详细字段如下:


1. 人体存在检测状态(humanPresence)

  • 类型:布尔值或枚举(0/1 或 true/false)
  • 含义:表示车内是否检测到有人存在(通过毫米波雷达LD2402判断)
  • 示例:1 表示有人,0 表示无人

2. 呼吸微动状态(breathingStatus)

  • 类型:布尔值或枚举
  • 含义:反映检测到的微动信号状态,如呼吸微动是否存在
  • 示例:1 表示检测到微动,0 表示无微动

3. 二氧化碳浓度(co2Concentration)

  • 类型:整数,单位 ppm(百万分之一)
  • 含义:车内空气中CO2的浓度值
  • 范围:一般 400 ppm(正常环境)到数千 ppm
  • 示例:800 ppm

4. 温度(temperature)

  • 类型:浮点数,单位 ℃
  • 含义:车内环境温度值(SHT30采集)
  • 示例:27.5 ℃

5. 湿度(humidity)

  • 类型:浮点数,单位 %RH
  • 含义:车内空气湿度值(SHT30采集)
  • 示例:55.0 %

6. 车辆震动状态(vibrationStatus)

  • 类型:布尔值或枚举
  • 含义:车辆是否处于震动状态(震动传感器检测)
  • 示例:1 表示有震动,0 表示无震动

7. 风扇工作状态(fanStatus)

  • 类型:布尔值
  • 含义:风扇是否正在工作,用于通风换气控制反馈
  • 示例:1 运行,0 停止

8. 车辆姿态信息(attitude)

  • 类型:结构体或多个字段,包含三轴加速度值
  • 含义:通过ADXL345采集的X、Y、Z轴加速度数据,判断车辆行驶或静止状态
  • 示例:
    • accX: -0.03 g
    • accY: 0.01 g
    • accZ: 1.00 g

9. GPS定位信息(gpsLocation)

  • 类型:结构体或字符串
  • 含义:车辆当前GPS坐标位置
  • 示例:
    • latitude: 39.9042
    • longitude: 116.4074

10. 报警状态(alarmStatus)

  • 类型:布尔值或枚举
  • 含义:当前系统是否处于报警状态(检测到车内有人且温度或CO2超阈值)
  • 示例:1 报警,0 正常

11. SOS请求状态(sosStatus)

  • 类型:布尔值
  • 含义:是否触发了SOS求助按钮
  • 示例:1 触发,0 未触发

12. 设备电量状态(batteryLevel)

  • 类型:百分比或电压值
  • 含义:设备当前电池电量或电压,方便远程监控供电状态
  • 示例:85 %

二、部署华为云物联网平台

华为云官网: www.huaweicloud.com/

打开官网,搜索物联网,就能快速找到 设备接入IoTDA

2.1 物联网平台介绍

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。

业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

2.2 开通物联网服务

地址: www.huaweicloud.com/product/iot...

开通免费单元。

点击立即创建

正在创建标准版实例,需要等待片刻。

创建完成之后,点击详情。 可以看到标准版实例的设备接入端口和地址。

下面框起来的就是端口号域名

点击实例名称,可以查看当前免费单元的配置情况。

开通之后,点击接入信息,也能查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。

总结:

scss 复制代码
端口号:   MQTT (1883)| MQTTS (8883)    
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

根据域名地址得到IP地址信息:

打开Windows电脑的命令行控制台终端,使用ping 命令。ping一下即可。

ini 复制代码
Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Lenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44

117.78.5.125 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 37ms,最长 = 37ms,平均 = 37ms

C:\Users\Lenovo>

MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口合适

2.3 创建产品

链接:console.huaweicloud.com/iotdm/?regi...

(1)创建产品

(2)填写产品信息

根据自己产品名字填写,下面的设备类型选择自定义类型。

(3)产品创建成功

创建完成之后点击查看详情。

(4)添加自定义模型

产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。

模型简单来说: 就是存放设备上传到云平台的数据。

你可以根据自己的产品进行创建。

比如:

cpp 复制代码
烟雾可以叫  MQ2
温度可以叫  Temperature
湿度可以叫  humidity
火焰可以叫  flame
其他的传感器自己用单词简写命名即可。 这就是你的单片机设备端上传到服务器的数据名字。

先点击自定义模型。

再创建一个服务ID。

接着点击新增属性。

2.4 添加设备

产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。

(1)注册设备

(2)根据自己的设备填写

(3)保存设备信息

创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。

(4)设备创建完成

(5)设备详情

2.5 MQTT协议主题订阅与发布

(1)MQTT协议介绍

当前的设备是采用MQTT协议与华为云平台进行通信。

MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。

MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。

华为云的MQTT协议接入帮助文档在这里: support.huaweicloud.com/devg-iothub...

业务流程:

(2)华为云平台MQTT协议使用限制

描述 限制
支持的MQTT协议版本 3.1.1
与标准MQTT协议的区别 支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg
MQTTS支持的安全等级 采用TCP通道基础 + TLS协议(最高TLSv1.3版本)
单帐号每秒最大MQTT连接请求数 无限制
单个设备每分钟支持的最大MQTT连接数 1
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关 3KB/s
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝 1MB
MQTT连接心跳时间值 心跳时间限定为30至1200秒,推荐设置为120秒
产品是否支持自定义Topic 支持
消息发布与订阅 设备只能对自己的Topic进行消息发布与订阅
每个订阅请求的最大订阅数 无限制

(3)主题订阅格式

帮助文档地址:support.huaweicloud.com/devg-iothub...

对于设备而言,一般会订阅平台下发消息给设备 这个主题。

设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。

如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。

cpp 复制代码
以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down

(4)主题发布格式

对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。

这个操作称为:属性上报。

帮助文档地址:support.huaweicloud.com/usermanual-...

根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:

cpp 复制代码
发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
 
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。

上传的JSON数据格式如下:

{
  "services": [
    {
      "service_id": <填服务ID>,
      "properties": {
        "<填属性名称1>": <填属性值>,
        "<填属性名称2>": <填属性值>,
        ..........
      }
    }
  ]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。

根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

2.6 MQTT三元组

MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。

接下来介绍,华为云平台的MQTT三元组参数如何得到。

(1)MQTT服务器地址

要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。

帮助文档地址:console.huaweicloud.com/iotdm/?regi...

MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。

根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)

cpp 复制代码
华为云的MQTT服务器地址:117.78.5.125
华为云的MQTT端口号:1883

如何得到IP地址?如何域名转IP? 打开Windows的命令行输入以下命令。

cpp 复制代码
ping  ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

(2)生成MQTT三元组

华为云提供了一个在线工具,用来生成MQTT鉴权三元组: iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。

下面是打开的页面:

填入设备的信息: (上面两行就是设备创建完成之后保存得到的)

直接得到三元组信息。

得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。

cpp 复制代码
ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

2.7 模拟设备登录测试

经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。

MQTT软件下载地址【免费】: download.csdn.net/download/xi...

(1)填入登录信息

打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。

(2)打开网页查看

完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。

点击详情页面,可以看到上传的数据:

到此,云平台的部署已经完成,设备已经可以正常上传数据了。

(3)MQTT登录测试参数总结

cpp 复制代码
MQTT服务器:  117.78.5.125
MQTT端口号:  183

//物联网服务器的设备信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"

//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"  //发布


发布的数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

2.8 创建IAM账户

创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。

地址: console.huaweicloud.com/iam/?region...

**【1】获取项目凭证 ** 点击左上角用户名,选择下拉菜单里的我的凭证

项目凭证:

cpp 复制代码
28add376c01e4a61ac8b621c714bf459

【2】创建IAM用户

鼠标放在左上角头像上,在下拉菜单里选择统一身份认证

点击左上角创建用户

创建成功:

【3】创建完成

用户信息如下:

cpp 复制代码
主用户名  l19504562721
IAM用户  ds_abc
密码     DS12345678

2.9 获取影子数据

帮助文档:support.huaweicloud.com/api-iothub/...

设备影子介绍:

cpp 复制代码
设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性

简单来说:设备影子就是保存,设备最新上传的一次数据。

我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。

如果对接口不熟悉,可以先进行在线调试:apiexplorer.developer.huaweicloud.com/apiexplorer...

在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。

调试完成看右下角的响应体,就是返回的影子数据。

设备影子接口返回的数据如下:

cpp 复制代码
{
 "device_id": "663cb18871d845632a0912e7_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "DHT11_T": 18,
     "DHT11_H": 90,
     "BH1750": 38,
     "MQ135": 70
    },
    "event_time": "20240509T113448Z"
   },
   "version": 3
  }
 ]
}

调试成功之后,可以得到访问影子数据的真实链接,接下来的代码开发中,就采用Qt写代码访问此链接,获取影子数据,完成上位机开发。

链接如下:

cpp 复制代码
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow

三、Qt开发入门与环境搭建

当前项目的上位机是采用Qt开发的,这一章节主要是介绍Qt开发环境的安装,以及Qt开发环境入门的使用。如果你Qt没有任何基础,仔细看一遍。

3.1 Qt是什么?

Qt 是一个功能强大、跨平台的应用程序开发框架,主要用于创建图形用户界面(GUI)应用程序,但它不仅仅局限于GUI编程。它由挪威的奇趣科技(TrollTech)最初于1991年开发,并在后续的发展历程中经历了多次所有权变更,包括诺基亚和Digia等公司接手,现在Qt属于The Qt Company所有。

Qt 主要特点和优势包括:

(1)跨平台:Qt 支持多种操作系统,开发者可以使用同一份源代码在不同平台上编译运行,如Windows、Linux、macOS、Android以及各种嵌入式系统(如RTOS),实现"一次编写,到处编译"。

(2)C++ 开发:Qt 的核心是基于C++编程语言构建,提供了一套丰富的类库,通过面向对象的设计方式简化了开发过程。

(3)图形用户界面:Qt 提供了完整的GUI组件集,包含窗口、按钮、标签、文本框等各种标准控件,以及布局管理器、样式表等功能,使得开发者能够高效地创建美观且功能完善的桌面应用或移动应用界面。

(4)工具链完整:Qt 包含一系列集成开发环境(IDE)和辅助工具,例如Qt Creator是一个全能的跨平台IDE,Qt Designer用于可视化拖拽设计UI界面,Qt Linguist支持国际化资源文件的翻译,还有Qt Assistant和大量文档资源方便开发者的使用。

(5)非GUI功能丰富:除了GUI功能外,Qt 还提供了众多非图形化功能模块,如网络通信、数据库访问、XML处理、多媒体处理(音频视频)、文件I/O、线程与并发处理、OpenGL和3D图形渲染等。

(6)元对象系统:Qt 使用元对象系统(Meta-Object System, MOC)实现了信号与槽机制(Signals and Slots),这是一种高级事件处理机制,允许在不同对象之间安全地进行异步通信。

(7)可扩展性与灵活性:Qt 架构高度灵活,支持插件体系结构,开发者可以根据需要自定义组件并轻松地集成到Qt应用中。

Qt 以其强大的跨平台能力和全面的功能集合成为许多企业和个人开发者选择用来开发高性能、高稳定性的应用程序的重要工具之一,被广泛应用于各类桌面软件、嵌入式设备、移动应用以及服务器端组件等领域。

3.2 Qt版本介绍

在Qt发行版本中将要涉及两个版本:Qt商业授权和Qt开源授权。

(1)Qt商业授权是设计商业软件的开发环境,这些商业软件使用了传统的商业来发布,它包含了一些更新的功能、技术上的支持和大量的解决方案,开发了使用于行业的一些特定的组件,有一些特殊的功能只在商业用户中使用。

(2)Qt开源授权是用来开发开源的软件,它提供了一些免费的支持,并遵循QPL协议。

开放源代码是免费的软件,不牵涉用户的某些权益。任何人都有使用开源软件和参与它的修改的机会,这就意味着其他的人同样可获得你开发的代码。目前 Qt 的开源授权有两种,一种是 GPL 授权,另一种是 LGPL 授权。

3.3 Qt开发环境安装

Qt的中文官网: www.qt.io/zh-cn/![ima...

QT5.12.6的下载地址:download.qt.io/archive/qt/...

打开下载链接后选择下面的版本进行下载:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

软件安装时断网安装,否则会提示输入账户。

如果下载不了,可以在网盘里找到安装包下载: 飞书文档记录的网盘地址:ccnr8sukk85n.feishu.cn/wiki/QjY8we...

安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。

选择MinGW 32-bit 编译器:

3.4 开发第一个QT程序

在QT开发过程中,可以手动编写代码也可以使用UI设计师直接拖拽控件的方式编写界面和布局,在实际的开发过程中一般是两种方式结合使用,提高开发效率。

本小节用一个简单的 "Hello QT" 程序介绍一下使用QtCreator新建工程的步骤

(1)打开QtCreator软件,选择New Project,新建一个工程。

(2)项目模板选择QT Widgets Application

(3)设置项目名称和存放路径

注意:QT项目路径和名称不能出现中文字符。

(4)编译工具套件选择

编译工具套件可以后面自己增加,比如增加Android的。套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合。

(5)设置生成的类信息

在类信息设置界面选择基类,目前有三种基类:QMainWindow,QWidget,QDialog。在基类里选择QMainWindow,类名和文件名会根据基类自动修改,一般不需要修改,默认即可。

(6)项目管理

在项目管理界面可以设置作为子项目,以及加入版本控制系统。这两个功能暂时用不到,都用默认的 ,然后点击 "完成"。

(7)创建完成

(8) 编辑代码

展开main.cpp文件,添加内容如下:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    QLabel *label =new QLabel("Hello Qt!");
    label->setGeometry(400,100,100,20);
    label->show();
    return a.exec();
}

代码解析:

cpp 复制代码
1)	#include <QApplication>和 #include <QLabel>是QT的类声明头文件,对于每个QT类都有一个与该类同名的头文件,在这个头文件包含了对该类的定义。
2)	main(int argc, char *argv[]) :main函数的标准写法。
3)	QApplication a(argc, argv):创建一个QApplication对象,用于管理应用程序的资源,QApplication类的构造函数需要两个参数。
4)	QLabel *label =new QLabel("Hello Qt!") :创建QLabel窗口部件,QLabel是一个Qt提供的窗口部件,可以用来显示一行文本。
5)	label->setGeometry(400,100,100,20) : 设置控件显示的位置。
6)	label->show():使Qlabel创建的窗口可见,就是显示设置的文本。
7)	return a.exec():应用程序将控制权传递给QT,让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。

(9)行程序

运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。

3.5 调试输出

QT中使用QDebug类输出调试信息。主要用于调试代码,类似于std::cout的替代品,支持QT的数据类型。使用前需要包含头文件。

调试输出的分类

qDebug 调试信息提示
qWarning 一般的警告提示
qCritical 严重错误提示
qFatal 致命错误提示

示例代码:

cpp 复制代码
qDebug("调试信息输出");
qWarning("一般警告信息输出");
qCritical("严重错误输出");
qFatal("致命错误输出");

qDebug输出的信息会打印到QT软件下边的输出面板。

在上节的HelloQt工程上加上调试输出代码,增加的main.cpp代码如下:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    qDebug()<<"QT调试信息输出";
    int data_int=8888;
    qDebug()<<data_int;
    float data_float=123.888;
    qDebug()<<data_float;
    return a.exec();
}

运行程序,观察输出的调试信息:

3.6 QT Creator常用的快捷键

掌握一些适用的快捷键,可以提高程序开发的效率。

(1)F1 键,快速切换光标选中的函数或者类的帮助信息,按一次半屏显示,按下两次全屏显示。

(2)F2 键,快速切换到光标选中的函数或者类的源码定义处。

(3)F4键,快速在源文件和头文件之间切换。

(4)Ctrl(按住)+ Tab,快速切换已打开的文件

(5)Ctrl+ I ,缩进光标选中行代码(自动与上层代码对齐)。

(6)Ctrl + / ,快速注释或者取消注释光标选中行。

(7)快速修改全局变量名

鼠标光标选中变量名,按下Ctrl+Shift+R,当变量名称出现红色框表示已经激活全局修改功能。修改一处,整个工程对应变量名称全部会修改。修改完毕之后,光标移开,再按下Ctrl+Shift+R保存修改。

(8)快速修改全局函数名

快捷方式与变量修改一样按下Ctrl+Shift+R,一处修改整个工程对应的函数名称也会跟着改。选中函数后,按下Ctrl+Shift+R后整个工程的对应的函数名会高亮,并且在软件下方弹出修改框。

3.7 QT帮助文档

Qt 帮助文档太多,难以全部翻译成中文,即使翻译了一部分,翻译花的时间太多,翻译更新的时效性也难以保证,最终还是得看英文帮助,QtCreator 集成了帮助系统,查找非常方便。

打开QtCreator,选择菜单栏的最左边的帮助选项,界面如下:

(1)查看Qlabel控件的帮助信息:

3.8 UI设计师使用

上节的Hello QT程序使用纯C++代码编写,这一节使用QT界面设计模式实现与上一节Hello QT程序一样的功能。仿照着上节新创建一个工程。双击打开mainwindow.ui文件,进入到UI设计界面。

(1)拖一个Label控件到编辑区,双击Label控件可以修改文本内容。

(2)运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。

(3)UI设计师界面功能介绍

3.9 按钮控件组

QT Creator UI设计师界面的按钮组截图如下:

以下是对按钮组控件的一些功能介绍:

(1)Push Button按压按钮:最普通的按钮,按(点击)按钮命令计算机执行一些动作,或者回答问题,比如windows开始菜单里的重启,注销,关机等按钮。

(2)Tool Button工具按钮:工具按钮通常是一个集合,一般集成在工具栏里。比如打开,保存,复制,粘贴,剪切等常用的操作。

(3)Radio Button单选按钮:单选按钮通常是两个以上的形式出现在一块,按钮之间有互斥关系,每次只能选中一个。比如:一个人的性别只能选择一个,不能同时是男性又是女性。

(4)Check Box复选框:复选框与单选按钮概念相反,复选框通常表示多个可以同时存在的选项,比如一个人可以同时拥有多个爱好,比如读书、看电影、爬山、游泳等。

(5)Command Link Button命令链接按钮:一般用来打开的窗口或者网页链接。

(6)Dialog Button Box标准按钮盒:标准按钮盒通常用于对话框程序;比如:常见的确认对话框有 "确定""取消"等标准按钮,Qt 将这些典型的按钮做成标准按钮盒,并将相应的信号加以封装,方便程序员使用。

3.10 布局控件组

开发一个图形界面应用程序,界面的布局影响到界面的美观。前面的程序中都是使用UI界面拖控件,如果有多个按钮,会出现大小难调整、位置难对齐等问题。Qt 提供的"布局管理"就很好的解决了控件摆放的问题。

以下是UI设计师界面的布局相关控件组:

功能介绍:

(1)Vertical Layout:垂直布局

(2)Horizontal Layout:水平布局

(3)Grid Layout:网格布局

(4)Form Layout:窗体中布局

(5)Horizontal Spacers:水平空格,在布局中用来占位。

(6)Vertical Spacer:垂直空格,在布局中用来占位。

3.11 基本布局控件

在UI设计界面添加一个布局控件,然后将需要布局的其他控件放入布局控件中即可完成布局,布局控件可以互相嵌套使用。(本节只介绍基本布局控件的使用)

以下是4种布局控件的效果:

3.12 UI设计师的布局功能

在UI设计界面的左上角有一排快捷的布局选项,使用时选中两个以上的控件,点击其中一种布局方式就可以切换布局。

以下为布局的简单示例图:

(1)为布局的选项。

(2)控件层次图,可以看到控件的布局摆放层次。

如果想要控制某个控件的固定大小,不随着布局改变大小,可以限定最大最小尺寸。选中控件鼠标右键-->大小限定->设置大小。

水平布局与垂直布局:

水平布局将控件按照水平方式摆放,垂直布局将控件按照垂直方式摆放。鼠标拖动红色布局框上的黑色方点,可以调整布局框的大小。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。

分裂器水平布局与垂直布局:

分裂器方式布局,包含控件的高度和宽度都会随着布局框的拉伸而改变。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。

窗体中布局与栅格布局:

栅格(网格)布局器的基本单元是单元格,而窗体中布局(表单)的基本单元是行。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。

设置主窗体布局方式:

设置主窗体的布局方式后,包含在主窗体内的控件会随着窗体的拉伸自动调整大小。

四、上位机开发

4.1 Qt开发环境安装

Qt的中文官网: www.qt.io/zh-cn/![ima...

QT5.12.6的下载地址:download.qt.io/archive/qt/...

打开下载链接后选择下面的版本进行下载:

如果下载不了,可以在网盘里找到安装包下载: 飞书文档记录的网盘地址:ccnr8sukk85n.feishu.cn/wiki/QjY8we...

软件安装时断网安装,否则会提示输入账户。

安装的时候,第一个复选框里的编译器可以全选,直接点击下一步继续安装。

选择编译器: (一定要看清楚了)

4.2 新建上位机工程

前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。

【1】新建工程

【2】设置项目的名称。

【3】选择编译系统

【4】选择默认继承的类

【5】选择编译器

【6】点击完成

【7】工程创建完成

4.3 切换编译器

在左下角是可以切换编译器的。 可以选择用什么样的编译器编译程序。

目前新建工程的时候选择了2种编译器。 一种是mingw32这个编译Windows下运行的程序。 一种是Android编译器,可以生成Android手机APP。

不过要注意:Android的编译器需要配置一些环境才可以正常使用,这个大家可以网上找找教程配置一下就行了。

windows的编译器就没有这么麻烦,安装好Qt就可以编译使用。

下面我这里就选择的 mingw32这个编译器,编译Windows下运行的程序。

4.4 编译测试功能

创建完毕之后,编译测试一下功能是否OK。

点击左下角的绿色三角形按钮

正常运行就可以看到弹出一个白色的框框。这就表示工程环境没有问题了。 接下来就可以放心的设计界面了。

4.5 设计UI界面与工程配置

【1】打开UI文件

打开默认的界面如下:

【2】开始设计界面

根据自己需求设计界面。

4.6 设计代码

【1】获取token

调用华为云的API都需要填token参数,先看帮助文章,了解如何获取token。

帮助文档:support.huaweicloud.com/api-iam/iam...

根据帮助文档,写完成下面代码编写:

这段代码的功能是通过华为云IAM服务获取Token,以便后续调用华为云API时使用。以下是代码的详细功能解释:


1. 设置功能标识
cpp 复制代码
function_select = 3;
  • function_select是一个标识变量,用于区分当前请求的功能类型。这里设置为3,表示当前请求是获取Token。

2. 构造请求URL
cpp 复制代码
QString requestUrl;
QNetworkRequest request;

// 设置请求地址
QUrl url;

// 获取token请求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
             .arg(SERVER_ID);
  • 构造获取Token的请求URL,URL格式为:https://iam.{SERVER_ID}.myhuaweicloud.com/v3/auth/tokens
  • SERVER_ID是华为云服务器的区域ID(如cn-north-1),通过QStringarg方法动态替换到URL中。

3. 设置请求头
cpp 复制代码
// 设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
  • 设置HTTP请求头,指定请求体的数据格式为application/json;charset=UTF-8,表示发送的数据是JSON格式。

4. 设置请求URL
cpp 复制代码
// 构造请求
url.setUrl(requestUrl);
request.setUrl(url);
  • 将构造好的URL设置到QUrl对象中,并将其绑定到QNetworkRequest对象。

5. 构造请求体
cpp 复制代码
QString text = QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":"
"{\"user\":{\"domain\": {"
"\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}},"
"\"scope\":{\"project\":{\"name\":\"%4\"}}}}")
        .arg(MAIN_USER)
        .arg(IAM_USER)
        .arg(IAM_PASSWORD)
        .arg(SERVER_ID);
  • 构造JSON格式的请求体,用于向华为云IAM服务请求Token。请求体包含以下字段:
    • auth:认证信息。
      • identity:身份信息。
        • methods:认证方法,这里使用密码认证(password)。
        • password:密码认证的具体信息。
          • user:用户信息。
            • domain:用户所属的域名。
              • name:域名名称(MAIN_USER)。
            • name:用户名(IAM_USER)。
            • password:用户密码(IAM_PASSWORD)。
      • scope:请求的范围。
        • project:项目信息。
          • name:项目名称(SERVER_ID)。
  • 使用QStringarg方法动态替换请求体中的变量(如MAIN_USERIAM_USER等)。

6. 发送HTTP POST请求
cpp 复制代码
// 发送请求
manager->post(request, text.toUtf8());
  • 使用QNetworkAccessManagerpost方法发送HTTP POST请求。
  • request是构造好的请求对象,text.toUtf8()是将请求体转换为UTF-8编码的字节数组。

7. 总结

这段代码的核心功能是:

  1. 构造获取Token的HTTP请求:包括请求URL、请求头和请求体。
  2. 发送请求 :通过QNetworkAccessManager发送POST请求,向华为云IAM服务请求Token。
  3. Token的作用:获取到的Token将用于后续调用华为云API时的身份验证。

通过这段代码,QT上位机能够获取华为云的Token,为后续的设备数据查询、控制等操作提供身份验证支持。

【2】获取影子数据

前面章节介绍了影子数据获取接口。下面是对应编写的代码:

这段代码的功能是向华为云IoT平台查询设备的属性信息(设备状态)。以下是对代码的详细功能含义解释:

代码功能含义解释:

(1)function_select = 0;

  • 这行代码设置function_select为0,表示当前操作是查询设备属性。这个变量用于标识不同的操作,可以帮助后续根据不同的操作类型执行不同的处理逻辑。

(2)QString requestUrl; QNetworkRequest request;

  • requestUrl:用于存储请求的URL地址,后续将构造一个用于查询设备属性的URL。
  • request:用来封装HTTP请求的对象,包含请求的所有信息,包括请求头、URL等。

(3)QUrl url;

  • url:用于存储并处理请求的URL对象,确保请求使用正确的地址。

(4)构造请求URL:

cpp 复制代码
requestUrl = QString("https://%1:443/v5/iot/%2/devices/%3/shadow")
             .arg(IP_ADDR)
             .arg(PROJECT_ID)
             .arg(device_id);

这行代码构建了一个URL,用于查询设备的状态(属性)。URL包括了:

IP_ADDR:华为云IoT平台的IP地址或域名。

PROJECT_ID:项目的ID,用于区分不同的项目。

device_id:设备的唯一标识符,用于查询指定设备的属性。

:443指定使用HTTPS协议(端口443)进行安全通信。

最终构造出的URL形如:https://<IP_ADDR>:443/v5/iot/<PROJECT_ID>/devices/<device_id>/shadow,这是查询设备状态的API接口。

(1)request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

  • 设置请求头的内容类型为application/json,表明请求体中的数据格式是JSON。

(2)request.setRawHeader("X-Auth-Token", Token);

  • 设置请求头中的X-Auth-Token字段,传递身份验证令牌(Token)。这个令牌用于验证请求的合法性,确保只有授权的用户可以查询设备的状态。

(3)url.setUrl(requestUrl);

  • 将前面构建好的请求URL赋值给url对象,确保后续的请求使用正确的URL。

(4)request.setUrl(url);

  • url对象设置到request对象中,准备发送请求。

(5)manager->get(request);

  • 使用QNetworkAccessManagerget方法发送GET请求,查询设备的属性。request中包含了URL、请求头以及Token等信息,服务器接收到请求后将返回设备的属性信息(如设备状态、属性值等)。

代码整体功能:

该代码实现了通过华为云IoT平台的API查询设备的属性信息。具体步骤包括:

  1. 构造查询设备属性的API请求URL。
  2. 设置请求头,指定数据格式为JSON,并传递Token进行身份验证。
  3. 使用QNetworkAccessManager发送GET请求,向服务器请求设备的状态数据。
  4. 服务器将返回设备的属性数据,供后续处理。

总结:

这段代码的功能是向华为云IoT平台查询指定设备的属性信息,并通过GET请求将设备的状态返回给客户端。通过Token进行身份验证,确保请求的合法性。

【3】解析数据更新界面

根据接口返回的数据更新界面。

【4】判断设备是否离线

这段代码用于判断设备是否离线。通过获取设备上传到服务器数据的时间与本地的系统时间差进行对比。

这段代码的核心功能是通过比较设备上传数据的时间和本地系统时间来判断设备是否处于离线状态,以下是其详细解释:


(1)功能分析

显示最新更新时间

cpp 复制代码
ui->label_update_time->setText("最新时间:" + update_time);

将设备上传的最新时间 update_time 显示在界面上的 label_update_time 控件中,格式为 最新时间:yyyy-MM-dd HH:mm:ss

方便用户了解设备数据的最近更新时间。

获取本地当前时间

cpp 复制代码
QDateTime currentDateTime = QDateTime::currentDateTime();

使用 QDateTime::currentDateTime() 获取系统当前时间,作为对比基准。

计算时间差

cpp 复制代码
qint64 secondsDiff = currentDateTime.secsTo(dateTime);

secsTo: 计算 currentDateTime 和设备上传时间 dateTime 之间的时间差(单位:秒)。

dateTime 是通过解析 JSON 数据提取到的设备数据上传时间,并已转换为本地时间格式。

判断设备状态

cpp 复制代码
if (qAbs(secondsDiff) >= 5 * 60)

使用 qAbs 获取时间差的绝对值。

如果时间差超过 5 分钟(300秒),表示设备长时间未上传数据,判定为"离线"。


(2)离线处理

更新状态显示

cpp 复制代码
ui->label_dev_state->setText("设备状态:离线");

在界面 label_dev_state 控件中显示设备当前状态为"离线"。


(3)在线处理

状态更新ui->label_dev_state->setText("设备状态:在线");如果时间差小于 5 分钟,显示"设备状态:在线"。

【5】获取设备最新数据上传时间

这是解析华为云API接口返回的数据,解析出来里面设备数据的时间,进行显示。

这段代码的主要作用是解析华为云 API 返回的 JSON 数据中的设备数据时间字段,转换为本地时间格式,并最终以用户友好的标准格式输出到界面。


(1)详细代码解析

(1)提取时间字段

cpp 复制代码
QString event_time = obj3.take("event_time").toString();
qDebug() << "event_time:" << event_time;

obj3.take("event_time"):从 JSON 数据中的 reported 对象提取 event_time 字段,值为一个字符串,表示设备上传数据的时间。

toString():将提取的字段值转换为 QString 类型,便于后续操作。

调试输出:使用 qDebug() 输出提取的时间值,例如:20231121T120530Z

2. 转换为 QDateTime 对象

cpp 复制代码
QDateTime dateTime = QDateTime::fromString(event_time, "yyyyMMddTHHmmssZ");

QDateTime::fromString:

使用指定格式解析 event_time 字符串为 QDateTime 对象。

格式说明:

  • yyyyMMdd: 年、月、日(如 20231121)。

  • T: 时间部分的分隔符(固定为 T)。

  • HHmmss: 时、分、秒(如 120530)。

  • Z: 表示时间是 UTC 时间。

  • 如果时间字符串格式不匹配,会返回一个无效的 QDateTime 对象。

3. 转换时区到本地时间

cpp 复制代码
dateTime.setTimeSpec(Qt::UTC);
dateTime = dateTime.toLocalTime();

setTimeSpec(Qt::UTC):

  • 明确告知 dateTime 对象,当前时间是 UTC 时间。
  • 确保时间转换准确,避免因为默认时区不明确导致的误差。

toLocalTime():

  • 将时间从 UTC 转换为本地时区时间,例如中国标准时间(CST, UTC+8)。

4. 格式化输出为标准时间字符串

cpp 复制代码
QString update_time = dateTime.toString("yyyy-MM-dd HH:mm:ss");

toString():将 QDateTime 转换为指定格式的字符串。

格式说明:

  • yyyy-MM-dd: 年-月-日。
  • HH:mm:ss: 小时:分钟:秒。

示例结果:2023-11-21 20:05:30

用户显示友好性:转换后的格式易读,符合国际通用的日期时间表示规范。


(2)代码运行效果

API 返回的时间字段值为 20231121T120530Z

转换流程:

  1. 解析为 QDateTime 对象:2023-11-21 12:05:30 (UTC);
  2. 转换为本地时间:2023-11-21 20:05:30 (CST)
  3. 格式化输出:"2023-11-21 20:05:30"

输出到界面时,显示为:

makefile 复制代码
最新时间: 2023-11-21 20:05:30

4.5 编译Windows上位机

点击软件左下角的绿色三角形按钮进行编译运行。

4.6 配置Android环境

如果想编译Android手机APP,必须要先自己配置好自己的Android环境。(搭建环境的过程可以自行百度搜索学习)

然后才可以进行下面的步骤。

【1】选择Android编译器

选择编译器。

切换编译器。

【2】创建Android配置文件

创建完成。

【3】配置Android图标与名称

根据自己的需求配置 Android图标与名称。

【3】编译Android上位机

Qt本身是跨平台的,直接选择Android的编译器,就可以将程序编译到Android平台。

然后点击构建。

成功之后,在目录下可以看到生成的apk文件,也就是Android手机的安装包,电脑端使用QQ发送给手机QQ,手机登录QQ接收,就能直接安装。

生成的apk的目录在哪里呢? 编译完成之后,在控制台会输出APK文件的路径。

知道目录在哪里之后,在Windows的文件资源管理器里,找到路径,具体看下图,找到生成的apk文件。

cpp 复制代码
File: D:/QtProject/build-333_QtProject-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk

4.7 设备仿真调试

通过MQTT客户端模拟设备登录华为云服务器。进行设备联调,实现数据上传和下发测试。

五、STM32代码设计

5.1 硬件连线说明

(1)主控芯片 STM32F103C8T6

  • 这是核心芯片,所有外设都通过它的GPIO和通信接口连接。

(2)SHT30温湿度传感器(I2C接口)

  • 连接单片机I2C接口的引脚:
    • PB6 ------ I2C1_SCL
    • PB7 ------ I2C1_SDA

(3)24G毫米波雷达模块LD2402(一般为串口通信)

  • 连接单片机串口UART接口引脚(使用USART1):
    • PA9 ------ USART1_TX(单片机发射给雷达)
    • PA10 ------ USART1_RX(单片机接收雷达数据)

(4)SGP30二氧化碳传感器(I2C接口)

  • 共享I2C接口,与SHT30共用同一I2C总线:
    • PB6 ------ I2C1_SCL
    • PB7 ------ I2C1_SDA

(5)Air780e 4G模块(串口通信 + 控制引脚)

  • 串口连接(使用USART2):
    • PA2 ------ USART2_TX
    • PA3 ------ USART2_RX
  • 其他控制引脚(如开关机、状态引脚)可连接至普通GPIO,比如:
    • PC0、PC1等GPIO口

(6)0.96寸OLED显示屏(I2C接口)

  • 同样与SHT30、SGP30共用I2C接口:
    • PB6 ------ I2C1_SCL
    • PB7 ------ I2C1_SDA

(7)高电平触发有源蜂鸣器

  • 连接普通GPIO控制引脚(带PWM或普通GPIO均可),例如:
    • PA8 ------ GPIO输出控制蜂鸣器开关

(8)GPS模块(串口通信)

  • 连接另一组串口(使用USART3):
    • PB10 ------ USART3_TX
    • PB11 ------ USART3_RX

(9)4颗独立按键

  • 连接4个普通GPIO输入引脚,带上拉输入:
    • PC13 ------ 按键1(翻页)
    • PC14 ------ 按键2(翻页)
    • PC15 ------ 按键3(求救发送)
    • PB0 ------ 按键4(备用)

(10)ADXL345三轴加速度传感器(SPI或I2C接口)

  • 采用I2C接口(同I2C总线):
    • PB6 ------ I2C1_SCL
    • PB7 ------ I2C1_SDA
  • 如果采用SPI,则:
    • SPI1_NSS ------ PA4
    • SPI1_SCK ------ PA5
    • SPI1_MISO ------ PA6
    • SPI1_MOSI ------ PA7

(11)震动检测传感器(高低电平输出)

  • 连接普通GPIO输入引脚,带外部中断功能:
    • PA0 ------ 外部中断输入

(12)可充电锂电池供电

  • 电源模块直接给STM32供电,单片机供电引脚如下:
    • VDD, VBAT --- 连接电池供电电压(需稳压)
    • GND --- 接地

5.2 传感器代码

传感器模块的代码可以通过商家给的例子程序进行移植,也可以去网盘寻找下载:ccnr8sukk85n.feishu.cn/wiki/QjY8we...

5.3 项目核心框架

c 复制代码
#include "stm32f10x.h"

// 假设你已有的各子模块函数声明(初始化和主功能调度)
extern void SystemClock_Config(void);
extern void GPIO_Init_All(void);

extern void USART1_Init(void);
extern void USART2_Init(void);
extern void ADC1_Init(void);

extern void SHT30_Init(void);
extern void LD2402_Init(void);
extern void SGP30_Init(void);
extern void Air780e_4G_Init(void);
extern void OLED_Init(void);
extern void Buzzer_Init(void);
extern void GPS_Init(void);
extern void Keys_Init(void);
extern void ADXL345_Init(void);
extern void VibrationSensor_Init(void);
extern void Battery_Init(void);

extern void Read_HumanPresence(void);
extern void Read_CO2(void);
extern void Read_Vibration(void);
extern void Control_Fan(void);
extern void Read_GPS(void);
extern void Read_TempHumidity(void);
extern void Read_Attitude(void);
extern void Upload_Data_Cloud(void);
extern void Display_Update(void);
extern void Alarm_Check(void);
extern void SOS_Process(void);

// 延时函数(简单实现)
void Delay_ms(uint32_t ms)
{
    uint32_t i,j;
    for(i=0;i<ms;i++)
        for(j=0;j<7200;j++);
}

int main(void)
{
    // 1. 系统时钟配置
    SystemClock_Config();

    // 2. 初始化所有GPIO口
    GPIO_Init_All();

    // 3. 初始化各硬件模块
    USART1_Init();          // 上位机串口
    USART2_Init();          // 4G模块串口
    ADC1_Init();            // ADC模块

    SHT30_Init();           // 温湿度传感器
    LD2402_Init();          // 毫米波雷达人体检测
    SGP30_Init();           // CO2传感器
    Air780e_4G_Init();      // 4G模块
    OLED_Init();            // OLED显示
    Buzzer_Init();          // 蜂鸣器
    GPS_Init();             // GPS模块
    Keys_Init();            // 按键
    ADXL345_Init();         // 姿态传感器
    VibrationSensor_Init(); // 震动传感器
    Battery_Init();         // 电池供电检测

    while(1)
    {
        // 4. 读取传感器数据
        Read_HumanPresence();   // 人体存在检测
        Read_CO2();             // CO2浓度检测
        Read_Vibration();       // 震动检测
        Read_GPS();             // GPS定位
        Read_TempHumidity();    // 温湿度检测
        Read_Attitude();        // 姿态检测

        // 5. 控制风扇和其他设备
        Control_Fan();

        // 6. 数据上传云端
        Upload_Data_Cloud();

        // 7. 本地显示更新
        Display_Update();

        // 8. 报警检测与处理
        Alarm_Check();

        // 9. SOS求助处理
        SOS_Process();

    }
}

整体设计思路说明

  1. 系统时钟配置 使用 SystemClock_Config() 函数配置系统主频(例如72MHz),确保所有外设运行在稳定时钟下。
  2. GPIO初始化 所有需要的GPIO口统一初始化,包括按键输入、LED指示灯、电机方向控制口、继电器控制口、传感器接口GPIO(单总线、模拟输入)等。
  3. 外设初始化
    • 串口USART1 用于与PC上位机通信,支持调试与数据显示。
    • 串口USART2 用于与ESP8266通信,实现WIFI连接和远程数据上传。
    • ADC 用于读取模拟量光敏传感器、电位器等。
    • 单总线设备初始化(DS18B20、DHT11)分别用于温度和湿度采集。
    • LCD显示初始化,实现本地数据显示界面。
    • 继电器和电机控制GPIO初始化,确保输出稳定。
  4. 主循环功能划分
    • 传感器采集:定时读取各传感器数据,更新全局变量或缓存区。
    • 控制逻辑:根据采集数据和预设阈值,控制电机方向与速度、继电器开关。
    • 通信处理:处理与上位机或WIFI模块的数据收发,实现远程监控和控制。
    • 显示刷新:根据最新状态更新LCD显示内容,提供实时反馈。
  5. 模块解耦与函数划分 各功能模块封装成独立函数,main()中仅做调用,结构清晰,便于维护和扩展。
  6. 时序与延时 主循环内有短暂延时,避免CPU高速空转,同时可根据需要在传感器采集与通信等模块内部实现更精细的定时。
  7. 异常处理和状态监测 在各子模块实现错误检测与异常报警,主循环可加入异常状态判断,做出相应处理(如蜂鸣器报警、断电保护等)。

5.4 程序下载

也有视频教程:

讲解如何编译代码,下载STM32程序: www.bilibili.com/video/BV1Cw...

打STM32的keil工程,编译代码、然后,使用USB线将开发板的左边的USB口(串口1)与电脑的USB连接,打开程序下载软件下载程序。

具体下载过程看下面图:

打开程序下载软件:[软件就在资料包里的软件工具目录下]

5.5 程序正常运行效果

设备运行过程中会通过串口打印调试信息,我们可以通过串口打印了解程序是否正常。

程序下载之后,可以打开串口调试助手查看程序运行的状态信息。[软件就在资料包里的软件工具目录下]

5.6 取模软件的使用

显示屏上会显示中文,字母,数字等数据,可以使用下面的取模软件进行取模设置。

软件就在资料包里的软件工具目录下

打开软件之后:

六、总结

本系统通过STM32F103C8T6单片机为核心,集成毫米波雷达、SGP30二氧化碳浓度传感器、SHT30温湿度传感器、GPS模块、加速度传感器及4G通信模块等多种传感器与通信模块,构建了一个功能完善的车内生命体征检测与环境监测系统。系统能够实现对车内是否有人员存在的实时识别,同时监测环境温湿度、CO₂浓度、车辆姿态与震动状态,在异常情况下主动报警并联动风扇通风,同时支持GPS定位与远程云平台数据上传,提升了车内安全管理的智能化与自动化水平。

该设计结构清晰、功能实用、响应迅速,具备良好的可扩展性和应用前景。无论是在防止儿童与宠物被遗留车内的场景,还是在车辆智能环境监测、远程运维等方面,都具有较高的实际应用价值。通过本课题的研究与实践,不仅提升了对嵌入式系统软硬件协同开发的理解,也为今后深入物联网智能终端的设计与开发打下了坚实基础。

相关推荐
it_czz14 小时前
LangSmith vs LangFlow vs LangGraph Studio 可视化配置方案对比
后端
蓝色王者15 小时前
springboot 2.6.13 整合flowable6.8.1
java·spring boot·后端
花哥码天下15 小时前
apifox登录后设置token到环境变量
java·后端
hashiqimiya16 小时前
springboot事务触发滚动与不滚蛋
java·spring boot·后端
TeamDev17 小时前
基于 Angular UI 的 C# 桌面应用
前端·后端·angular.js
PPPHUANG17 小时前
一次 CompletableFuture 误用,如何耗尽 IO 线程池并拖垮整个系统
java·后端·代码规范
用户83562907805117 小时前
用Python轻松管理Word页脚:批量处理与多节文档技巧
后端·python
想用offer打牌17 小时前
一站式了解Spring AI Alibaba的流式输出
java·人工智能·后端
秋说17 小时前
华为 DevKit 25.2.rc1 源码迁移分析使用教程(openEuler + ARM64)
后端
ServBay17 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net