一、前言
1.1 项目介绍
【1】项目开发背景
森林火灾是全球范围内频繁发生的自然灾害之一,不仅对生态环境造成严重破坏,还可能威胁到人类的生命财产安全。传统的森林防火措施主要依赖人工巡逻和地面观测站,这种方式效率低下,且在森林中难以实现全面覆盖。随着物联网技术的发展,智能监测系统逐渐成为预防森林火灾的有效手段。基于此背景,设计了一款基于STM32F103RCT6的森林火灾监测系统,通过现代传感技术和无线通讯技术提高森林火灾预警的及时性和准确性。
该系统集成了多种传感器,包括用于检测环境温度和湿度的SHT30传感器、能够识别火焰的火光检测传感器以及用于监测烟雾浓度的MQ2气体传感器。这些传感器可以实时收集环境数据,一旦检测到异常情况如温度骤升、烟雾浓度增加或出现火焰等,将立即启动蜂鸣器发出警报,同时通过Air724UG-4G模块将数据上传至华为云IOT物联网服务器。这一过程不仅实现了对森林火灾的快速响应,也为后续的救援工作提供了准确的信息支持。
为了便于森林管理员无论身处何地都能及时接收到火灾报警信息,本项目还特别开发了适用于Android手机和平板电脑的应用程序及Windows上位机软件,用户可以通过这些客户端实时查看由监测点上传的数据,了解各监测区域的环境状况。此外,考虑到森林地区的特殊地理条件,系统设计时充分考虑了能源供应的问题,采用了太阳能充电方案,确保监测系统能够在远离电网的野外长期稳定运行。
综上所述,本项目构建一个高效、可靠、易于管理的森林火灾监测平台,通过集成先进的传感技术和网络通信技术,为森林防火提供了一种新的解决方案,有助于提升森林防火工作的智能化水平,减少森林火灾造成的损失。
【2】设计实现的功能
(1)环境温湿度监测:通过SHT30传感器实时检测森林内的环境温度和湿度,并将数据发送给主控芯片STM32F103RCT6进行处理。
(2)火焰检测:使用火光检测传感器监控森林区域内是否有火焰出现,一旦发现火焰,立即将信号传递给主控芯片,作为火灾预警的一部分。
(3)烟雾浓度监测:利用MQ2气体传感器检测空气中的烟雾浓度,当烟雾浓度超过预设阈值时,向主控芯片发送警报信号。
(4)自动报警功能:当系统检测到火焰或烟雾浓度超标时,会自动激活有源蜂鸣器发出声音警报,提醒现场人员注意安全并采取相应措施。
(5)数据远程传输:通过Air724UG-4G模块,采用MQTT协议将采集到的环境参数和报警信息上传至华为云IOT物联网服务器,实现数据的远程监控和管理。
(6)移动设备实时监控:开发了专门的Android手机APP和Windows上位机软件,森林管理员可以通过这些客户端实时查看监测点上传的数据,包括温度、湿度、烟雾浓度等信息,以及接收火灾报警通知。
(7)OLED显示屏本地显示:在监测站点安装0.96寸SPI接口OLED显示屏,用于实时显示环境参数和系统状态,方便护林员现场检查设备工作情况和传感器读数是否正常。
(8)太阳能充电支持:为了解决森林地区供电不便的问题,系统配备了太阳能充电装置,确保即使在偏远无电源的情况下也能持续运行。
【3】项目硬件模块组成
(1)主控模块:选用STM32F103RCT6作为系统的主控芯片,负责协调各个传感器的工作、处理数据、控制报警以及与4G模块进行数据交换。
(2)环境温湿度传感器模块:采用SHT30数字温湿度传感器,用于精确测量环境中的温度和湿度,并将数据传输给主控芯片进行处理。
(3)火焰检测模块:使用火焰传感器来检测是否有明火出现,一旦检测到火焰,立即将信号反馈给主控芯片,作为火灾预警的重要依据。
(4)烟雾浓度检测模块:通过MQ2气体传感器监测空气中烟雾的浓度,当烟雾浓度达到一定阈值时,触发报警机制。
(5)报警模块:采用高电平触发的有源蜂鸣器,当系统检测到火灾风险时,蜂鸣器将自动发出警报声,提醒周边人员注意安全。
(6)数据传输模块:利用Air724UG-4G模块,结合MQTT协议,将采集到的数据上传至华为云IOT物联网服务器,实现远程监控和管理。
(7)本地数据显示模块:配备0.96寸SPI接口的OLED显示屏,用于实时显示环境参数(如温度、湿度、烟雾浓度等)和系统状态,便于现场工作人员快速了解设备运行情况。
(8)太阳能充电模块:设计了太阳能充电系统,包括太阳能电池板、充电控制器和蓄电池,以解决森林内无固定电源供应的问题,保证监测系统长时间稳定运行。
(9)外部电源模块:为了确保系统的可靠性,在太阳能充电模块之外,还提供了5V 2A的外置电源供电选项,可以在需要时为系统提供电力支持。
【4】研究背景与意义
森林火灾是全球面临的一大环境挑战,不仅会导致严重的生态破坏,还会造成巨大的经济损失和人员伤亡。传统的森林防火措施多依赖于人工巡逻和定点监测,这种模式效率低下,覆盖范围有限,难以及时发现和应对突发火灾。近年来,随着物联网、大数据、云计算等技术的迅速发展,智能监测系统开始应用于森林防火领域,极大地提高了火灾预警的准确性和响应速度。基于此背景,本项目提出了一套基于STM32F103RCT6的森林火灾监测系统,旨在通过集成先进的传感器技术和无线通信技术,构建一个高效、可靠的火灾预警平台。
本项目的设计实现了对森林环境中温度、湿度、烟雾浓度和火焰等关键参数的实时监测,并通过4G网络将数据上传至云端,利用华为云IOT平台进行数据分析和处理。当监测到异常情况时,系统能够自动触发警报,并通过移动应用和上位机软件将警报信息推送给森林管理员,确保他们能够第一时间了解火灾情况并采取相应的应急措施。此外,系统还支持太阳能充电,解决了森林内部署监测设备时面临的供电难题,保证了系统的长期稳定运行。
研究的意义在于,本项目不仅为森林防火提供了一种新的解决方案,还促进了物联网技术在环境保护领域的应用和发展。通过精准监测和及时预警,可以有效降低森林火灾的发生率,减少火灾造成的生态破坏和经济损失,保护人民生命财产安全。同时,该项目的成功实施也将为其他类似应用场景提供参考,推动智慧林业的发展,助力实现可持续发展目标。
1.2 设计思路
在设计基于STM32F103RCT6的森林火灾监测系统时,首先明确了系统的主要目标:实现对森林环境中温度、湿度、烟雾浓度和火焰的实时监测,并能够及时发出警报,同时将数据上传至云端,以便森林管理员能够远程监控和管理。为了达成这一目标,在设计过程中遵循了以下几个核心思路:
选择高性能的主控芯片STM32F103RCT6作为系统的控制中心。STM32F103RCT6具有强大的处理能力和丰富的外设接口,能够高效地处理来自多个传感器的数据,并支持复杂的算法运算,满足系统对数据处理的高要求。此外,它还具备低功耗特性,适合长时间在野外运行。
选用了多种高精度传感器来实现对环境参数的全面监测。SHT30温湿度传感器能够提供准确的温度和湿度数据;火焰传感器和MQ2烟雾传感器则分别用于检测火焰和烟雾浓度。这些传感器的选择确保了系统能够及时捕捉到火灾的早期迹象,从而提前发出预警。
为了实现数据的远程传输,采用了Air724UG-4G模块。该模块支持4G网络,能够通过MQTT协议将采集到的数据上传至华为云IOT物联网服务器。这样,森林管理员无论身处何地,都可以通过手机APP或Windows上位机软件实时查看监测数据和接收警报信息,大大提高了火灾响应的速度和效率。
在用户界面方面,设计了一个0.96寸的SPI接口OLED显示屏,用于显示本地采集的环境参数和系统状态。这不仅方便了现场工作人员的日常维护和检查,还能在没有网络连接的情况下提供重要的信息反馈。
考虑到森林地区的特殊环境,特别加入了太阳能充电功能。通过太阳能电池板将太阳能转换为电能,并储存在蓄电池中,为整个系统供电。这一设计不仅解决了偏远地区供电困难的问题,还使得系统更加环保和可持续。
为了确保系统的稳定性和可靠性,在软件设计中加入了多种故障检测和自我恢复机制。例如,当传感器发生故障时,系统能够自动切换到备用传感器;当网络连接中断时,系统会自动尝试重新连接。这些措施有效提高了系统的鲁棒性,确保其在复杂多变的自然环境中能够长期稳定运行。
本项目的设计思路围绕着高效、可靠、易用的目标展开,通过集成先进的传感技术、无线通信技术和太阳能供电技术,构建了一个完整的森林火灾监测解决方案。这不仅有助于提高森林防火的智能化水平,也为生态环境保护提供了有力的技术支持。
1.3 系统功能总结
功能模块 | 描述 |
环境温湿度监测 | 通过SHT30传感器实时检测森林内的环境温度和湿度,并将数据发送给主控芯片进行处理。 |
火焰检测 | 使用火焰传感器监控森林区域内是否有火焰出现,一旦发现火焰,立即将信号传递给主控芯片。 |
烟雾浓度监测 | 利用MQ2气体传感器检测空气中的烟雾浓度,当烟雾浓度超过预设阈值时,向主控芯片发送警报信号。 |
自动报警功能 | 当系统检测到火焰或烟雾浓度超标时,会自动激活有源蜂鸣器发出声音警报,提醒现场人员注意安全并采取相应措施。 |
数据远程传输 | 通过Air724UG-4G模块,采用MQTT协议将采集到的环境参数和报警信息上传至华为云IOT物联网服务器,实现数据的远程监控和管理。 |
移动设备实时监控 | 开发了专门的Android手机APP和Windows上位机软件,森林管理员可以通过这些客户端实时查看监测点上传的数据,包括温度、湿度、烟雾浓度等信息,以及接收火灾报警通知。 |
OLED显示屏本地显示 | 在监测站点安装0.96寸SPI接口OLED显示屏,用于实时显示环境参数和系统状态,方便护林员现场检查设备工作情况和传感器读数是否正常。 |
太阳能充电支持 | 配备太阳能充电系统,包括太阳能电池板、充电控制器和蓄电池,以解决森林地区供电不便的问题,确保监测系统在偏远无电源的情况下也能持续运行。 |
外部电源模块 | 提供5V 2A的外置电源供电选项,可以在需要时为系统提供电力支持,确保系统的可靠性。 |
1.4 开发工具的选择
【1】设备端开发
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
【2】上位机开发
上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。
1.5 参考文献
1. 1. 厦门大学航空航天学院2. 闽西职业技术学院信息工程学院.改进TDM-LoRa低功耗森林火灾监测预警系统[J].福州大学学报(自然科学版),2024.
2. 武风波,张会可,吕茜彤.森林防火监测系统的设计与开发[J].现代电子技术,2018.
3. 杨春迪,陆娟,储增帮等.基于STM32F103RBT6单片机的新型森林火灾监测报警装置研究[J].科技创新与生产力,2023.
4. 曾旻,唐治东,张保磊.基于STM32控制电路及Atlas 200加速模块的森林防火机器人集成应用[J].中国仪器仪表,2023.
5. 徐崇奇,解建国,毕佳琦等.基于STM32的智能火灾监测及灭火系统设计[J].河南科技,2022.
6. Wu Fengbo, L. Xitong et al. “Design and Development of Forest Fire Monitoring Terminal.” 2018 International Conference on Sensor Networks and Signal Processing (SNSP)(2018).
7. 安徽三联学院机器人工程学院.森林灭火辅助机器人设计[J].技术与市场,2021.
8. 张会可.基于STM32的森林防火监测终端的设计与开发[D].西安科技大学,2017.
9. Min Yu, Taoyun Zhou et al. “Design of Forest Security Defense System Based on Beidou-Positioning.” Journal of Physics: Conference Series(2021).
10. 杨晨,祁晋东,谢鑫焱等.基于无线传感网络的智能森林火灾防控系统的设计[J].数字技术与应用,2022.
11. 秦钰林,周若麟,张珂欣等.基于NB-IoT窄带通信和多传感器组网技术的森林火灾监测预警系统[J].物联网技术,2020.
12. 李春成,杨云,陈亮等.自供电低功耗森林火灾无线监测系统[J].电子器件,2021.
13. Rohan Arunkumar, Atul Kumar Dubey. “FireSense: Integrating Deep Learning with ESP32 Microcontrollers for Enhanced Forest Fire Surveillance.” 2024 IEEE 48th Annual Computers, Software, and Applications Conference (COMPSAC)(2024).
14. 王洋.基于嵌入式的森林火灾监测平台设计与实现[D].大连交通大学,2021.
15. Ziliu Ye, Fuwen Su et al. “Intelligent Fire-fighting robot based on STM32.” 2019 Chinese Automation Congress (CAC)(2019).
16. 蔡志伟,张伟光,高亮等.基于物联网的森林环境智能监测系统终端监测节点的设计[J].哈尔滨师范大学自然科学学报,2019.
17. 大连民族大学信息与通信工程学院.基于物联网技术的智能山火报警系统[J].智能计算机与应用,2024.
18. 蒋鹏.基于STM32的无线遥控山区物资运输车研究与设计[J].内燃机与配件,2023.
19. 王强强,李玉丽.基于物联网云平台的火灾监测报警系统设计 附视频[J].技术与市场,2024.
20. Tammana Viswanadha Muralidhar, Vytla Venkata Sai Sandeep et al. “An IoT based Real Time Forest Fire Detection & Alerting System Using LoRa Communication.” 2024 11th International Conference on Signal Processing and Integrated Networks (SPIN)(2024).
21. Zhao Minhua. “A Wireless Fire Detection and Alarm System Based on the Information Fusion Technology.” Electronic Science and Technology(2012).
22. 李光辉,赵军,王智.基于无线传感器网络的森林火灾监测预警系统[J].传感技术学报,2006.
23. 赵英,陈淑娟.基于多传感器数据融合的火灾预警系统[J].现代电子技术,2010.
24. 刘燕燕,杨帮华,丁丽娜等.基于STM32的红外火灾探测系统设计[J].计算机测量与控制,2013.
25. L. Niu, Zhubing Hu. “Information Fusion Technology Based on Wireless Fire Detection and Alarm System.” Advanced Materials Research(2013).
26. Yazhou Zhong, Fei Wu et al. “Design of smoke alarm system based on STM32.” International Journal of Engineering Research and(2017).
27. 朱黎,全斐,王磊等.基于无线网络的环境监测系统[J].电子制作,2022.
28. 曲惠泽,魏东辉.基于STM32的林间信息采集机器人[J].林业机械与木工设备,2019.
29. Cao Bin-qia. “Design of data acquisition system based on STM32+FPGA.” Computer Engineering and Design(2014).
30. K. Zhao. “Design of Distributed Smoke and Heat Detector Based on STM32.” Control and Instruments in Chemical Industry(2015).
二、部署华为云物联网平台
华为云官网: https://www.huaweicloud.com/
打开官网,搜索物联网,就能快速找到 设备接入IoTDA
。
2.1 物联网平台介绍
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
2.2 开通物联网服务
地址: https://www.huaweicloud.com/product/iothub.html
点击立即创建
。
正在创建标准版实例,需要等待片刻。
创建完成之后,点击实例名称。 可以看到标准版实例的设备接入端口和地址。
在上面也能看到 免费单元的限制。
开通之后,点击总览
,也能查看接入信息。 当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。
总结:
端口号: MQTT (1883)| MQTTS (8883)
接入地址:ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
**根据域名地址得到IP地址信息: **
打开Windows电脑的命令行控制台终端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.4170]
(c) Microsoft Corporation。保留所有权利。
C:\Users\11266>ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=93
来自 117.78.5.125 的回复: 字节=32 时间=39ms TTL=93
117.78.5.125 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 35ms,最长 = 39ms,平均 = 36ms
C:\Users\11266>
MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。
2.3 创建产品
(1)创建产品
(2)填写产品信息
根据自己产品名字填写,下面的设备类型选择自定义类型。
(3)产品创建成功
创建完成之后点击查看详情。
(4)添加自定义模型
产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。
模型简单来说: 就是存放设备上传到云平台的数据。
你可以根据自己的产品进行创建。
比如:
烟雾可以叫 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协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
业务流程:
(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)主题订阅格式
帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
对于设备而言,一般会订阅平台下发消息给设备 这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。
如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。
以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主题发布格式
对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。
这个操作称为:属性上报。
帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:
发布的主题格式:
$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":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.6 MQTT三元组
MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。
接下来介绍,华为云平台的MQTT三元组参数如何得到。
(1)MQTT服务器地址
要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。
帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。
根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)
华为云的MQTT服务器地址:117.78.5.125
华为云的MQTT端口号:1883
如何得到IP地址?如何域名转IP? 打开Windows的命令行输入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元组
华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。
下面是打开的页面:
填入设备的信息: (上面两行就是设备创建完成之后保存得到的)
直接得到三元组信息。
得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
2.7 模拟设备登录测试
经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。
(1)填入登录信息
打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。
(2)打开网页查看
完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。
点击详情页面,可以看到上传的数据:
到此,云平台的部署已经完成,设备已经可以正常上传数据了。
(3)MQTT登录测试参数总结
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":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}
2.8 创建IAM账户
创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】获取项目凭证 ** 点击左上角用户名,选择下拉菜单里的我的凭证
项目凭证:
28add376c01e4a61ac8b621c714bf459
【2】创建IAM用户
鼠标放在左上角头像上,在下拉菜单里选择统一身份认证
。
点击左上角创建用户
。
创建成功:
【3】创建完成
用户信息如下:
主用户名 l19504562721
IAM用户 ds_abc
密码 DS12345678
2.9 获取影子数据
帮助文档:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
设备影子介绍:
设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性
简单来说:设备影子就是保存,设备最新上传的一次数据。
设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。
如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。
调试完成看右下角的响应体,就是返回的影子数据。
设备影子接口返回的数据如下:
{
"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写代码访问此链接,获取影子数据,完成上位机开发。
链接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
三、上位机开发
为了方便查看设备上传的数据,接下来利用Qt开发一款Android手机APP 和 Windows上位机。
使用华为云平台提供的API接口获取设备上传的数据,进行可视化显示,以及远程控制设备。
3.1 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/![image-20221207160550486](https://led-obs.obs.cn-north-1.myhuaweicloud.com/Blog/img/image-20221207160550486.png)
QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6
或者去网盘里下载:https://pan.quark.cn/s/145a9b3f7f53
打开下载链接后选择下面的版本进行下载:
qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details
软件安装时断网安装,否则会提示输入账户。
安装的时候,第一个复选框里勾选一个mingw 32
编译器即可,其他的不管默认就行,直接点击下一步继续安装。
选择MinGW 32-bit 编译器: (一定要看清楚了)
说明: 我这里只是介绍PC端,也就是Windows系统下的Qt环境搭建。 Android的开发环境比较麻烦,如果想学习Android开发,想编译Android程序的APP,需要自己去搭建Android环境。
也可以看下面这篇文章,不过这个文章是在Qt开发专栏里付费的,需要订阅专栏才可以看。 如果不想付费看,也可以自行找其他教程,自己搭建好必须的环境就行了
Android环境搭建的博客链接: https://blog.csdn.net/xiaolong1126626497/article/details/117254453
3.2 新建上位机工程
前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。
【1】新建工程
【2】设置项目的名称。
【3】选择编译系统
【4】选择默认继承的类
【5】选择编译器
【6】点击完成
【7】工程创建完成
3.3 设计UI界面与工程配置
【1】打开UI文件
打开默认的界面如下:
【2】开始设计界面
根据自己需求设计界面。
3.5 编译Windows上位机
点击软件左下角的绿色三角形按钮进行编译运行。
3.6 配置Android环境
如果想编译Android手机APP,必须要先自己配置好自己的Android环境。(搭建环境的过程可以自行百度搜索学习)
然后才可以进行下面的步骤。
【1】选择Android编译器
【2】创建Android配置文件
创建完成。
【3】配置Android图标与名称
【3】编译Android上位机
Qt本身是跨平台的,直接选择Android的编译器,就可以将程序编译到Android平台。
然后点击构建。
成功之后,在目录下可以看到生成的apk
文件,也就是Android手机的安装包,电脑端使用QQ
发送给手机QQ,手机登录QQ接收,就能直接安装。
生成的apk
的目录在哪里呢? 编译完成之后,在控制台会输出APK文件的路径。
知道目录在哪里之后,在Windows的文件资源管理器里,找到路径,具体看下图,找到生成的apk文件。
D:/linux-share-dir/QT/build-app_Huawei_Eco_tracking-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk
四、STM32代码开发
以下是基于STM32F103RCT6的“森林火灾监测系统”的 main.c
的完整代码示例。
#include "stm32f10x.h"
#include "sht30.h" // 环境温湿度传感器库
#include "mq2.h" // 烟雾传感器库
#include "flame_sensor.h" // 火焰传感器库
#include "oled.h" // OLED显示屏库
#include "buzzer.h" // 蜂鸣器库
#include "air724ug.h" // 4G模块通信库
#include "delay.h" // 延时函数库
#include "mqtt.h" // MQTT协议库
// 全局变量
float temperature, humidity;
uint16_t smoke_concentration;
uint8_t flame_detected;
char data_buffer[50];
// 函数声明
void System_Init(void);
void Read_Sensors(void);
void Display_Data(void);
void Check_Alarm(void);
void Upload_Data(void);
int main(void) {
System_Init(); // 系统初始化
while (1) {
Read_Sensors(); // 读取传感器数据
Display_Data(); // 在OLED上显示数据
Check_Alarm(); // 检查报警条件
Upload_Data(); // 上传数据到云端
Delay_ms(5000); // 每隔5秒运行一次
}
}
// 系统初始化
void System_Init(void) {
Delay_Init(); // 初始化延时
SHT30_Init(); // 初始化温湿度传感器
MQ2_Init(); // 初始化烟雾传感器
Flame_Sensor_Init(); // 初始化火焰传感器
OLED_Init(); // 初始化OLED显示
Buzzer_Init(); // 初始化蜂鸣器
Air724UG_Init(); // 初始化4G模块
MQTT_Init(); // 初始化MQTT协议
}
// 读取传感器数据
void Read_Sensors(void) {
// 读取温湿度
SHT30_ReadData(&temperature, &humidity);
// 读取烟雾浓度
smoke_concentration = MQ2_ReadData();
// 读取火焰传感器状态
flame_detected = Flame_Sensor_Read();
}
// 在OLED显示屏上显示数据
void Display_Data(void) {
OLED_Clear();
OLED_ShowString(0, 0, "Temp:");
OLED_ShowFloat(40, 0, temperature, 2, 1);
OLED_ShowString(80, 0, "C");
OLED_ShowString(0, 1, "Humidity:");
OLED_ShowFloat(64, 1, humidity, 2, 1);
OLED_ShowString(104, 1, "%");
OLED_ShowString(0, 2, "Smoke:");
OLED_ShowNum(48, 2, smoke_concentration, 4, 10);
OLED_ShowString(0, 3, "Flame:");
if (flame_detected) {
OLED_ShowString(48, 3, "YES");
} else {
OLED_ShowString(48, 3, "NO");
}
}
// 检查报警条件
void Check_Alarm(void) {
// 检测到火焰或烟雾浓度超出阈值则报警
if (flame_detected || smoke_concentration > 300) {
Buzzer_On();
} else {
Buzzer_Off();
}
}
// 上传数据到云端
void Upload_Data(void) {
// 将数据格式化为字符串
snprintf(data_buffer, sizeof(data_buffer),
"{\"temperature\": %.1f, \"humidity\": %.1f, \"smoke\": %d, \"flame\": %d}",
temperature, humidity, smoke_concentration, flame_detected);
// 使用MQTT协议上传数据
MQTT_Publish("forest_fire_monitor/data", data_buffer);
}
代码说明
1. System_Init():初始化所有硬件模块,包括传感器、OLED显示屏、蜂鸣器、4G模块和MQTT协议。
2. Read_Sensors():读取各传感器数据。
3. Display_Data():将采集的数据在OLED显示屏上显示,方便现场查看。
4. Check_Alarm():检测火灾报警条件,若检测到火焰或烟雾浓度超出阈值,触发蜂鸣器报警。
5. Upload_Data():通过4G模块上传数据到华为云物联网平台。数据格式化成JSON字符串并通过MQTT协议发布到云服务器的指定主题。
运行逻辑
系统每5秒循环一次,执行数据采集、显示、报警检测和数据上传。
五、总结
森林火灾是全球面临的一大环境挑战,不仅导致严重的生态破坏,还会造成巨大的经济损失和人员伤亡。传统的森林防火措施多依赖于人工巡逻和定点监测,效率低下且覆盖范围有限。为此,本项目设计了一套基于STM32F103RCT6的森林火灾监测系统。该系统集成了多种传感器,包括SHT30温湿度传感器、火焰传感器和MQ2烟雾传感器,能够实时监测森林环境中的温度、湿度、烟雾浓度和火焰情况。当检测到异常情况时,系统会自动触发蜂鸣器报警,并通过Air724UG-4G模块将数据上传至华为云IOT物联网服务器。此外,系统还开发了专门的Android手机APP和Windows上位机软件,森林管理员可以通过这些客户端实时查看监测数据和接收火灾报警信息。为了适应森林地区的特殊环境,系统支持太阳能充电,确保长期稳定运行。本项目旨在提高森林火灾预警的准确性和响应速度,减少火灾造成的损失,为森林防火提供了一种新的解决方案。