简介:基于STM32与华为云物联网平台的酒后驾车监测报警系统设计文档,以单个PDF文件呈现,包体大小61.24MB。内容面向嵌入式与物联网方向开发者、毕业设计及课程设计学生,完整覆盖项目从背景分析到硬件选型、系统框架、原理图与实物图的全过程。文档重点讲解酒精浓度传感器、定位模块、4G通信模块、STM32开发板、继电器和蜂鸣器等组件选型;详细演示华为云物联网平台的产品创建、设备接入、三元组生成、订阅发布等部署步骤,以及模拟登录测试;随后深入解析STM32端代码的数据采集、上传与显示逻辑,并介绍基于跨平台框架的Windows与Android上位机开发,包括界面设计、认证令牌获取、云端数据解析和离线判断等关键代码。已有146人学习浏览。读者可借此掌握完整的物联网报警系统架构,理解传感器数据采集、4G联网上云、云端数据可视化与远程监控的实现方法,可直接借鉴用于项目开发、竞赛或论文撰写。 做毕设或者课题项目选到“酒后驾车监测报警”这个方向的人,大概率都冲着同一个目标——把STM32、传感器、物联网云平台串成一条完整的链路。这类系统听起来不复杂,但真正跑通“本地采集→数据处理→云端上报→远程告警”这条路径,需要解决的问题远比想象中多。我最初拿到这个题目的时候,第一反应是“酒精传感器加个蜂鸣器不就行了”,结果从硬件选型到华为云IoT接入,前前后后踩了十几个坑才把整套系统稳定跑起来。这篇文章就围绕这套基于STM32设计的酒后驾车监测报警系统,把整体架构、硬件选型、核心代码、华为云IoT接入流程,以及调试过程中最折磨人的几个问题一次性讲透,给正在做同类项目的人一个可以直接参考的完整方案。
1. 系统整体架构与设计思路
1.1 这个项目到底要解决什么问题
酒后驾车监测报警系统的核心价值,不是在车里装一个传感器那么简单。真正的需求链条是:驾驶员上车后,系统能自动采集环境中的酒精浓度,超过安全阈值立刻本地报警,同时通过物联网平台把数据传到远端,让车队管理者、家人或监控中心能实时看到状态。换句话说,这是一套“端侧采集判断+云端远程监控”的双层系统。
我设计的这套方案以STM32F103C8T6作为主控芯片,搭配MQ-3酒精传感器模块做气体浓度采集,本地报警部分用蜂鸣器和LED灯实现声光提示,联网部分通过ESP8266 WiFi模块走MQTT协议接入华为云IoT平台。整个链条可以拆成三个环节:传感器把气体浓度转化为电信号,STM32通过ADC读取并做数据处理,最后ESP8266把处理结果上报云端。三个环节之间是串行依赖关系,任何一个环节出问题,整套系统的可靠性都会打折扣。
这里要特别强调一个容易被忽略的点:这套系统本质上是一个“电子鼻+物联网告警器”的组合,传感器采集到的原始数据必须经过清洗、换算、阈值判断之后才能交给报警逻辑和云平台使用。我在第一次原型验证时就发现,MQ-3模块输出的模拟电压波动很大,如果直接把原始值拿去和阈值比较,误报率会高到没法用。所以在架构设计阶段就要考虑清楚:数据在本地先做滤波平均、再做浓度换算,换算结果再参与判断和上报。
1.2 为什么选用STM32+华为云这套组合
STM32F103C8T6这颗芯片在这个项目里有几个不可替代的优势:首先是ADC外设足够用,12位分辨率、多个通道,单通道采集酒精传感器的模拟电压完全够用;其次是生态成熟,HAL库和标准库的资料铺天盖地,遇到问题搜一下基本都有答案;最重要的是价格便宜、买起来方便,十几块钱一片,做毕业设计或者产品原型都很合适。
华为云IoT平台的选择逻辑则更偏向工程实用性。目前主流的物联网云平台无非就是华为云、阿里云、腾讯云三家,我选华为云是因为它的IoTDA服务对MQTT协议的支持很规范,设备接入流程清晰,而且免费配额对教学和原型验证足够友好。更关键的一点是,华为云IoT平台提供了一整套设备影子、消息下发、数据转发规则的功能,后面如果要扩展远程控制(比如远程关窗、远程断电),不用重新搭框架。
还有一层考量是平台无关性。ESP8266走MQTT协议上报数据,本质上只要会构造Topic和Payload,换到其他平台也只需要改动接入参数,不需要改STM32端的代码。这种“云平台可替换”的设计思路,对后续项目扩展和维护都很重要,我见过不少人在硬件端写死平台地址,结果换平台要改一堆代码,实在得不偿失。
2. 硬件选型与测量原理
2.1 酒精传感器选型与工作原理
酒精传感器是整套系统的“鼻子”,选型直接影响测量准确度。市面上最常见的酒精传感器模块是MQ-3,也有用MQ-303A或者ZE03这类更高精度模块的方案。MQ-3的核心元件是二氧化锡半导体气敏材料,它在洁净空气中的电导率较低,当接触到酒精蒸气时电导率会随浓度升高而增大,通过模块上的负载电阻可以把这种电导率变化转化为电压信号输出。
MQ-3模块有几个关键特性需要上手前就搞清楚。第一是加热电压,模块内部的加热丝需要持续供电才能让传感器工作在合适的温度区间,上电后需要预热一段时间才能稳定输出,我实测下来大约需要3到5分钟的预热时间,前两三分钟的数据基本不能用。第二是灵敏度可调,模块上有一个电位器,可以调节比较器的阈值从而改变数字输出(DO引脚)的触发点,同时模拟输出(AO引脚)的电压绝对值也会受影响。第三是交叉敏感问题,MQ-3对汽油、酒精、甲烷等挥发性气体都有反应,这在实际车载场景中意味着“喷香水也可能触发报警”,所以在算法层面要用相对变化量而不是绝对电压值来做判断。
| 模块型号 | 输出类型 | 量程特点 | 适用场景 |
|---|---|---|---|
| MQ-3 | 模拟电压+数字电平 | 0.05~10mg/L酒精 | 教学、低成本原型 |
| MQ-303A | 模拟电压 | 更适合低浓度检测 | 对精度要求较高的场景 |
| ZE03 | 模拟电压+串口输出 | 直接输出浓度值 | 工业级应用 |
2.2 核心硬件搭配与引脚连接
主控芯片选择STM32F103C8T6,理由是性价比极高且资源足够。ESP8266-01作为WiFi透传模块,通过UART串口和STM32通信。蜂鸣器选用有源蜂鸣器,用一个NPN三极管(S8050)做驱动,因为STM32的GPIO驱动能力有限,直接推蜂鸣器会电压跌落。LED指示灯直接串联一个220欧姆限流电阻接在GPIO上即可。
我实际使用的引脚分配方案如下:
// 硬件引脚映射 // 酒精传感器AO -> PA0 (ADC1_IN0) // ESP8266 RX -> PA2 (USART2_TX) // ESP8266 TX -> PA3 (USART2_RX) // 蜂鸣器控制 -> PB0 // LED指示灯 -> PB1接线时注意几个细节。传感器模块的供电要尽量干净,最好从稳压芯片的输出端取电,不要直接和ESP8266的供电混在一起,否则WiFi发射时电流波动会严重影响ADC采样值。ESP8266的供电要求电流峰值到300mA左右,普通的AMS1117-3.3可以带得动,但要注意在模块电源脚旁边加一个大电容(470uF以上)做储能缓冲。
另外一个实战经验:所有模块的GND必须共地。听起来像是废话,但我见过不少新手接完线之后发现读数乱跳,查了半天最后是传感器模块和主控板没有共地导致的。
2.3 酒精浓度换算与阈值设定逻辑
MQ-3模块的模拟输出(AO引脚)电压与酒精浓度之间的关系近似正相关,但并不是严格的线性关系。模块的灵敏度特性曲线在不同浓度区间斜率不同,因此在实际项目中,通常采用“标定+查表”的方式来换算浓度。
比较实用的做法是两点标定法:在纯净空气中记录基线电压值(baseVolt),然后在一个已知浓度的酒精环境下记录另一个电压值,用这两点建立一个近似的线性映射关系。注意这个线性映射只在标定区间内有效,超出区间后偏差会变大。
关于酒驾判断阈值,国家相关标准规定驾驶员血液酒精浓度大于等于20mg/100ml属于饮酒驾车,大于等于80mg/100ml属于醉酒驾车。呼出气体酒精浓度与血液酒精浓度的大致换算关系约为2200比1,也就是说呼气中酒精浓度达到约0.09mg/L时对应血液20mg/100ml。但MQ-3在低浓度下的输出变化不明显,直接用气体浓度去映射血液浓度需要足够的标定基础,所以我在项目中采用了“双阈值+延时确认”的策略来减少误报:
// 阈值设定 #define ALCOHOL_TOLERATE_LIMIT 0.10f // 饮酒阈值 (mg/L) #define ALCOHOL_DRUNK_LIMIT 0.40f // 醉酒阈值 (mg/L) #define CONFIRM_TIME_MS 3000 // 连续确认时间连续三秒超过阈值才触发报警,这个延时确认机制非常重要。因为传感器数据本身有波动,瞬间尖峰不应该直接触发报警,连续采样取平均再加延时确认,能有效过滤掉绝大部分误报。实测下来,加了3秒确认窗口后误报率至少降低60%。
3. 核心代码实现与数据采集细节
3.1 ADC采样与数据滤波处理
STM32的ADC采集逻辑是这套系统的数据源头,处理得好不好直接影响后续所有判断。我使用HAL库配置ADC1通道0(PA0),采用单通道DMA多次采样模式,一次采集16个样本取平均值。这样做的原因是ADC单次采样结果噪声较大,DMA自动搬运多次数据到缓冲区,再由软件做中值平均滤波,能有效去除传感器上的随机噪声和工频干扰。
初始化代码关键部分如下:
// ADC1 初始化 - 单通道DMA采集 void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; HAL_ADC_Init(&hadc1); sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK; sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); }采样时间这里我选择55.5个周期,对中低速变化的酒精浓度信号完全够用,而且采样值相对稳定。如果采样时间太短,内部采样电容充电不足,转换结果会偏低,数据抖动也更明显。
滤波函数我用了滑动中值平均的思路:维护一个长度为16的环形缓冲区,每次取中位数附近若干点求平均。实际测试中,这种组合滤波方式比单纯算术平均的效果好很多,尤其是遇到偶发尖峰时,中值滤波能把异常值直接剔除。
// 冒泡法取中位数的简化实现 uint16_t getMedianValue(uint16_t *buf, uint8_t len) { uint16_t temp; for (uint8_t i = 0; i < len - 1; i++) { for (uint8_t j = 0; j < len - 1 - i; j++) { if (buf[j] > buf[j + 1]) { temp = buf[j]; buf[j] = buf[j + 1]; buf[j + 1] = temp; } } } return buf[len / 2]; }3.2 本地报警逻辑与状态机设计
报警逻辑不能简单写成“浓度大于阈值就报警”,否则在阈值边界附近会频繁跳变。我在代码中实现了一个三状态状态机:正常状态、预警状态、报警状态。
正常状态下,系统持续采集并上报数据,一旦酒精浓度超过饮酒阈值,状态机进入预警状态,此时LED以1Hz频率闪烁,提示驾驶员注意,但暂时不触发蜂鸣器。如果浓度在预警状态下持续超过3秒,状态机进入报警状态,蜂鸣器以急促节奏鸣叫,同时向云端上报告警事件。如果浓度回落到阈值以下,则状态机回归正常状态,所有报警输出复位。
typedef enum { STATE_NORMAL = 0, STATE_WARNING, STATE_ALARM } SystemState; // 状态机更新逻辑(简化版) void update_alarm_state(float concentration) { static SystemState state = STATE_NORMAL; static uint32_t warning_start_time = 0; switch (state) { case STATE_NORMAL: if (concentration >= ALCOHOL_TOLERATE_LIMIT) { state = STATE_WARNING; warning_start_time = HAL_GetTick(); } break; case STATE_WARNING: if (concentration < ALCOHOL_TOLERATE_LIMIT) { state = STATE_NORMAL; } else if (concentration >= ALCOHOL_TOLERATE_LIMIT && (HAL_GetTick() - warning_start_time) >= CONFIRM_TIME_MS) { state = STATE_ALARM; } break; case STATE_ALARM: if (concentration < ALCOHOL_TOLERATE_LIMIT) { state = STATE_NORMAL; } break; default: state = STATE_NORMAL; break; } }状态机的设计让整个报警流程变得可预测、可调试,而且这段逻辑不依赖操作系统,纯裸机轮询也能跑得很稳。要特别注意HAL_GetTick()这个函数依赖SysTick中断,如果你的代码其他地方重写了SysTick或者关闭了全局中断,这个函数会卡死,后面我会单独讲这个坑。
3.3 ESP8266数据上报与AT指令控制
ESP8266-01模块在项目中有两种驱动方式:一种是使用AT指令通过串口控制,另一种是直接用SDK刷固件做二次开发。这个项目中我选择用AT指令方式,原因是逻辑简单、代码量少、调试方便。STM32通过USART2发送AT指令给ESP8266,模块返回的数据通过串口中断接收解析。
连接华为云IoT平台的上报流程分三步:配置WiFi、建立TCP连接、发送MQTT报文。第一步通过AT指令配置ESP8266的工作模式并连接路由器;第二步通过AT指令建立与华为云IoT平台接入地址的TCP连接,端口号1883;第三步则是通过MQTT协议发送数据。
// ESP8266 AT指令序列 AT+CWMODE=1\r\n // 配置为Station模式 AT+CWJAP="SSID名称","WiFi密码"\r\n // 连接WiFi热点 AT+CIPSTART="TCP","broker地址",1883\r\n // 建立TCP连接 AT+CIPSEND=<报文长度>\r\n // 发送数据这条指令链里最容易出问题的环节是AT+CIPSTART。ESP8266-01的固件版本不同,支持的指令格式略有差异,而且如果路由器信号不好,TCP连接会反复失败。建议在发送AT指令之前先发AT测试模块是否就绪,每次指令等待返回OK再继续下一步,并且要加超时重试机制。
需要特别提醒的是:实测发现ESP8266-01在TCP连接成功后,如果长时间没有数据收发,会被路由器或云平台主动断开连接。所以主循环里的数据上报间隔最好不要超过60秒。如果间隔太长,需要定期发送心跳包或者重连。
4. 华为云IoT设备接入与云端配置
4.1 创建产品与注册设备的完整流程
华为云IoT平台设备接入部分的配置,是整个项目云端链路的基础。登录华为云控制台,进入IoTDA服务,首先要创建一个产品。创建产品时选择所属行业、设备类型,协议类型选择MQTT,数据格式选择JSON,其他选项保持默认即可。
产品创建完成后,需要在产品下注册设备。注册时填写设备标识码(也就是设备ID),平台会生成一对设备ID和设备密钥,这两个参数在设备端连接时要用到。我建议设备标识码使用有一定规律的名字,比如“car_001”,后续设备多了方便管理。注册成功后,平台会分配一个设备ID,格式类似于“64f8xxxx_test_001_0001”,这个ID是MQTT连接的ClientId组成部分。
平台的接入信息可以在“总览”页面看到,包括接入地址(形如xxxx.iot-mqtts.cn-north-4.myhuaweicloud.com)、端口号等。注意平台地址每个区域不同,我用的华北北京四区域的地址形如“broker-cn-north-4.iotda-device.cn-north-4.myhuaweicloud.com”,端口默认1883。这里要提醒一点:MQTT协议接入端口有1883(明文)和8883(TLS加密)两个选择,开发测试阶段用1883更方便,产品化阶段务必切到8883。
4.2 MQTT连接参数构造与主题设计
华为云IoT平台使用MQTT协议时的连接参数构造比较特殊。连接时需要用到三个核心字段:ClientId、Username、Password。
ClientId的构造格式是“设备ID_0_0_时间戳”,其中设备ID就是注册时返回的那一串;Username固定为“设备ID”;Password不是设备密钥本身,而是用HMAC-SHA256算法对“设备ID”加上时间戳进行签名得到的密文,然后拼接成“时间戳_签名值”的格式。这个构造过程如果手动拼很容易出错,建议参考官方文档使用在线工具或者编程生成。
设备连接上之后,上报数据的Topic格式是固定的:
// 设备属性上报Topic $oc/devices/{设备ID}/sys/properties/report // 上报数据Payload格式 {"services": [{"service_id": "alcohol_detection", "properties": {"alcohol_concentration": 0.23, "status": "warning"}}]}这里“service_id”要和产品模型里定义的“服务”保持一致,“properties”里的属性名也要和产品模型一致,否则平台会报错或者数据无法解析。所以注册产品时建好产品模型是很有必要的,避免后台上线时到处找字段不匹配的问题。
4.3 云端数据可视化与告警配置
数据上报到华为云IoT平台之后,可以在控制台的“设备详情”里看到实时上报的数据,但更实用的做法是把数据转发到应用侧做可视化展示。华为云的IoTDA提供了规则引擎功能,可以配置“数据转发规则”把设备上报的数据转发到其他云服务,比如OBS存储、Mysql数据库或者API网关。
我在实际项目中把数据转发到了华为云的图形化开发服务,通过简单的拖拽组件搭了一个驾驶状态看板,能显示设备在线状态、实时酒精浓度曲线、告警事件记录。这个看板配合设备影子,还能反查历史数据,对后续写项目报告或者做演示很有帮助。
云端远程告警的配置同样通过规则引擎实现。设置一条规则:当上报的属性值中“alcohol_concentration”大于等于0.4时,触发告警动作,向指定手机号发送短信通知。这样即使驾驶员不在本地、报警信息没有及时被注意到,远端的管理员也能第一时间收到提醒。
5. 常见问题与排查技巧实录
5.1 ST-Link下载器连接报错
做STM32开发绕不开下载器报错,尤其是ST-Link在MDK环境里出现“Error: No STM32 Target Found! If your product embeds Debug Authentication”这类提示。我刚开始遇到这个报错的时候也懵了一下,后来排查发现罪魁祸首是目标板供电不足。
ST-Link通过SWD接口连接目标板时,虽然可以给目标板供电,但ST-Link的供电能力有限(通常只有几百毫安),而STM32F103C8T6最小系统板加传感器模块和ESP8266后,整体电流需求超过500mA,就会导致目标板电压跌落,SWD通信失败。
解决思路有两种:第一种是断开ST-Link的供电输出,用外部稳压电源单独给目标板供电;第二种是先把ESP8266断电,程序烧录完成后再接上外设,让下载时目标板电流需求降到最低。我建议优先使用外部供电方案,一劳永逸。
此外,检查SWDIO和SWCLK两根信号线是否接反,BOOT0引脚是否被拉高导致芯片进入ISP模式,也是排查这个报错的传统步骤。如果目标板上之前烧录过禁用SWD引脚的代码,无法重新连接下载器的话,需要先用串口ISP模式擦除Flash才能恢复。
5.2 虚拟串口设备出现黄色感叹号
在使用板载USB转串口芯片时,电脑设备管理器经常会出现“STMicroelectronics Virtual COM Port”带有黄色感叹号,无法识别。这类问题几乎都是驱动缺失或驱动版本不对引起的。
不同型号的开发板使用的USB转串口芯片不同。早期的板子常用CH340G,需要装CH340驱动;有的板子用CP2102芯片,对应的是CP210x VCP驱动;ST官方板子则用STM32F103C8T6内置的USB外设虚拟串口,需要的是ST官方驱动。可以在设备管理器里查看“未知设备”的硬件ID,根据厂商ID和产品ID来判断对应驱动类型,安装正确驱动后感叹号就会消失。
我曾经遇到过一个很隐蔽的问题:串口芯片的驱动正确安装了,但设备管理器中显示的串口号和调试软件里选择的串口号不一致,导致数据收发异常。这种情况只需要在设备管理器里手动更换串口号,改成和软件一致即可。
5.3 酒精传感器数据漂移和误报问题
传感器漂移是气体传感器项目里的老生常谈,但实际操作中影响非常大。MQ-3模块在刚上电的时候,输出会从较高值逐渐下降,需要预热几分钟才能稳定。另外环境温湿度的变化也会影响传感器的输出,尤其是冬天从冷环境进入温暖环境时,数据波动会明显加大。
处理这个问题的方案是在软件里做动态基线校准。系统上电后,延时5分钟让传感器完成预热,然后采集20次空气环境下ADC值的平均值作为基线。运行过程中每10分钟重新计算一次基线,但只允许基线缓慢变化,避免把突发高浓度误当成新基线。校准过程中如果检测到浓度异常,暂停基线更新。
我还做了一个额外的保护逻辑:如果检测到ESP8266联网失败,系统仍然保持本地报警功能,只会在云端数据上标记“离线状态”。这样即使网络异常,最基本的安全告警能力也不会丢。需要注意的另一个坑是蜂鸣器和LED的驱动电流问题——蜂鸣器直接接在GPIO上会导致GPIO口电压跌落,影响ADC参考电压,连带影响采样精度。因此蜂鸣器必须通过三极管或者MOS管驱动,且驱动电路要和传感器模块的供电回路分开布线。
5.4 延时函数卡死和系统运行不稳定
在调试过程中,我遇到过系统运行一段时间后“卡死”的现象,现象是LED不再闪烁、串口无输出、云端掉线。查了很长时间才定位到是HAL_Delay函数卡死。
HAL库的HAL_Delay依赖SysTick中断,如果系统中的其他中断服务函数执行时间过长,或者某个中断里调用了HAL_Delay,就会导致SysTick中断无法及时响应,最终卡死。此外,如果代码中不小心关掉了全局中断,HAL_Delay也会永久阻塞。
排查思路是:先用调试器打断点,查看卡死时程序停在哪个函数;如果是HAL_Delay,检查是否有中断优先级配置不当导致SysTick被抢占;再检查中断回调函数里是否有阻塞操作。我最终把中断回调里的数据处理逻辑搬到了主循环中,只在中断里置标志位,问题就彻底解决了。
另一个不稳定的来源是ESP8266串口数据解析。如果主循环处理串口数据不及时,缓冲区溢出会导致AT指令回复解析错乱。我增加了环形缓冲区接收数据,并提升了串口接收中断的优先级,问题得到明显改善。
5.5 排查技巧速查表与避坑经验
我把这段时间遇到的典型问题和解决方案整理成表格,方便大家排查时对照:
| 现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| 程序烧录报错No target found | 目标板供电不足、SWD接线错误、BOOT0拉高 | 检查供电电压,测量SWDIO引脚对地阻抗 | 外部供电、接线复查、BOOT0拉低 |
| 虚拟串口黄色感叹号 | 驱动缺失或版本不匹配 | 通过硬件ID识别芯片型号 | 手动安装对应型号驱动 |
| 传感器数据波动大 | 预热不足、供电不干净、采样时间短 | 示波器观察电源纹波,对比不同采样时间数据 | 增加预热时间、ADC采样加滤波、独立供电 |
| HAL_Delay卡死 | SysTick中断被阻塞或关闭 | 打断点查看卡死位置 | 中断里避免阻塞调用,主循环处理业务 |
| 云端设备离线 | SPI8266断网、TCP连接被断开 | 查看串口日志,检查WiFi信号强度 | 缩短上报周期、增加重连机制 |
| 酒精浓度换算偏差大 | 标定不准、传感器灵敏度漂移 | 用标准浓度气体测试线性度 | 重新标定、采用分段线性映射 |
实操中还有一个容易忽略的问题:ESP8266模块的供电。ESP8266在WiFi发射瞬间工作电流达到200到300毫安,如果电源模块输出能力不足或者走线过细,压降会导致模块复位,进而频繁重新连接WiFi。我在远程模块供电线上并联了一个470uF的电解电容,并在模块的VCC和GND之间靠近引脚处加了一个0.1uF的瓷片电容滤波,稳定度明显提升。
这套系统从硬件焊接、驱动调试到云端打通,我前后花了一个多星期的时间。最大的体会是:STM32和传感器部分相对成熟,真正的坑集中在联网稳定性和数据可靠性上。如果你跟我一样在华为云IoT接入环节卡了很久,建议先用MQTT客户端工具(比如MQTTX)模拟设备上报,验证Topic和Payload格式没问题之后,再让STM32去对接,这样可以将“平台配置问题”和“设备端问题”分开排查,效率会高很多。
本文还有配套的精品资源,点击获取