网站针对爬虫爬取做的优化,wordpress搜索框删除,网站建设补救方法,网站建设用哪个app一、项目介绍
在商业街、小吃街和景区等人流密集的场所#xff0c;垃圾桶的及时清理对于提供良好的游客体验至关重要。然而#xff0c;传统的垃圾桶清理方式通常是定时或定期进行#xff0c;无法根据实际情况进行及时响应#xff0c;导致垃圾桶溢满#xff0c;影响环境卫…一、项目介绍
在商业街、小吃街和景区等人流密集的场所垃圾桶的及时清理对于提供良好的游客体验至关重要。然而传统的垃圾桶清理方式通常是定时或定期进行无法根据实际情况进行及时响应导致垃圾桶溢满影响环境卫生给游客带来不便和不满。
为了解决这一问题本项目基于STM32F103ZET6主控芯片和华为云物联网平台设计了一套智能垃圾桶管理系统。该系统通过NBIOT-BC26模块连接到华为云物联网平台实现了垃圾桶数据的实时采集和上传。
在本地垃圾桶通过多种传感器进行数据采集。使用DHT11模块实时监测环境温度和湿度以了解垃圾桶所处环境的状态。采用中科微电子出品的GPS模块通过串口输出GPS数据实现垃圾桶的定位功能。垃圾桶口还配备了红外传感器用于检测垃圾桶是否已满。
通过NBIOT-BC26模块采集到的数据被实时上传到华为云物联网平台。在保洁人员管理中心开发了一个数据大屏采用Qt开发运行在Windows系统下。数据大屏展示了该区域内垃圾桶的详细情况包括环境温度、湿度、GPS定位和垃圾桶的满溢状态。
当垃圾桶满了时上位机会实时发送短信通知保洁人员进行清理并提供垃圾桶的位置信息以便保洁人员快速响应并进行清理操作。
通过这套智能垃圾桶管理系统垃圾桶的清理可以根据实际情况进行及时调度提高了垃圾桶的使用效率改善了环境卫生状况提升了游客的体验感。同时保洁人员能够更加高效地管理垃圾桶提升工作效率减少资源浪费。整个系统的设计在提供一个智能、高效的垃圾桶管理解决方案为公共场所的环境卫生管理带来便利和改进。 二、设计思路总结
2.1 硬件选型
【1】主控芯片STM32F103ZET6
STM32F103系列是意法半导体STMicroelectronics推出的低功耗、高性能的32位ARM Cortex-M3微控制器系列。选择STM32F103ZET6作为主控芯片是因为它具有较高的计算能力和丰富的外设接口能够满足项目的需求。
【2】通信模块NBIOT-BC26
NBIOT-BC26是一种窄带物联网NB-IoT通信模块支持低功耗、广覆盖、远距离的物联网通信。它能够将垃圾桶采集到的数据通过NB-IoT网络上传到云平台实现实时监测和远程管理。
【3】传感器模块
DHT11模块用于采集环境温度和湿度数据。DHT11是一种低成本、数字式温湿度传感器具有简单的接口和良好的性能适用于本项目的温湿度监测需求。GPS模块用于实现垃圾桶的定位功能。选择中科微电子出品的GPS模块通过串口输出GPS数据能够准确获取垃圾桶的位置信息。红外传感器用于检测垃圾桶是否已满。红外传感器能够通过红外线的反射来判断垃圾桶内是否有垃圾从而判断垃圾桶的满溢状态。
【5】数据大屏采用Qt开发运行在Windows系统下。数据大屏通过图形界面展示垃圾桶的详细情况包括环境温度、湿度、GPS定位和垃圾桶的满溢状态。
项目的硬件选型包括主控芯片、通信模块、传感器模块、红外传感器和数据大屏。这些硬件组件相互配合实现了智能垃圾桶管理系统的功能包括数据采集、通信传输、定位功能和信息展示。
2.2 硬件设计
【1】主控芯片选择 作为整个系统的核心选择了STM32F103ZET6作为主控芯片。该芯片具有较高的计算能力和丰富的外设接口能够满足项目的需求。主控芯片负责与各个硬件模块进行通信和数据处理同时控制通信模块的数据传输。
【2】通信模块选择 为了实现垃圾桶数据的实时采集和上传选择了NBIOT-BC26通信模块。NBIOT-BC26支持窄带物联网通信具有低功耗、广覆盖和远距离传输的特点能够将采集到的数据通过NB-IoT网络上传到华为云物联网平台。
【3】传感器模块选择
DHT11模块用于采集环境温度和湿度数据。DHT11是一种低成本、数字式温湿度传感器通过数字信号输出温湿度数值具有简单的接口和良好的性能适用于本项目的温湿度监测需求。GPS模块用于实现垃圾桶的定位功能。选择中科微电子出品的GPS模块通过串口输出GPS数据能够准确获取垃圾桶的位置信息。红外传感器设计 为了检测垃圾桶是否已满采用红外传感器。红外传感器能够通过红外线的反射来判断垃圾桶内是否有垃圾从而判断垃圾桶的满溢状态。红外传感器与主控芯片相连通过数字输入口接收传感器的信号并进行处理判断。
【4】数据大屏设计 数据大屏采用Qt开发运行在Windows系统下。通过图形界面展示垃圾桶的详细情况包括环境温度、湿度、GPS定位和垃圾桶的满溢状态。主控芯片通过与数据大屏的通信接口实时传输数据数据大屏根据接收到的数据进行展示。
整个硬件设计思路是将各个硬件模块与主控芯片相连接通过主控芯片的控制和数据处理实现数据的采集、通信传输、定位功能和信息展示。通过合理选择硬件组件并进行适当的连接和接口设计实现了智能垃圾桶管理系统的功能。
2.3 软件设计
【1】系统架构设计 软件设计的第一步是确定系统的整体架构。根据项目需求可以采用分层架构设计将系统划分为应用层、业务逻辑层和驱动层。应用层负责与用户交互业务逻辑层处理具体的业务逻辑驱动层与硬件模块进行通信和控制。
【2】硬件驱动设计 针对每个硬件模块需要编写相应的驱动程序。主控芯片与通信模块、传感器模块和红外传感器进行通信通过串口、I2C、SPI等接口与它们进行数据交互。每个硬件模块的驱动程序应包括初始化、数据采集和控制等功能。
【3】数据处理与逻辑控制 主控芯片负责接收来自各个硬件模块的数据并进行处理和逻辑控制。例如从DHT11传感器读取温湿度数据后可以进行数据的校验和转换然后根据设定的阈值判断是否需要进行烘干操作。同时主控芯片还负责控制红外传感器进行垃圾桶满溢状态的检测。
【4】通信与数据上传 通过NBIOT-BC26通信模块将采集到的数据通过NB-IoT网络上传到华为云物联网平台。主控芯片与通信模块进行通信将需要上传的数据打包成相应的格式并通过串口等接口发送给通信模块实现数据的上传。
【5】用户界面设计 软件还需要设计用户界面以便用户可以直观地查看垃圾桶的状态和数据信息。可以使用Qt等工具进行界面设计展示环境温度、湿度、GPS定位和垃圾桶的满溢状态等信息。用户界面与主控芯片进行通信接收数据并进行展示。
整个软件设计思路是基于系统架构设计通过硬件驱动、数据处理与逻辑控制、通信与数据上传以及用户界面设计等模块的开发实现智能垃圾桶管理系统的功能。软件设计需要与硬件设计相结合保证数据的采集、处理、传输和展示的协调运作。
2.4 系统交互流程
【1】用户打开智能垃圾桶管理系统的应用程序。
【2】系统初始化
系统进行硬件初始化包括主控芯片、通信模块、传感器模块和红外传感器的初始化。确保通信模块连接到NB-IoT网络并与华为云物联网平台建立通信连接。
【3】环境监测
系统开始监测环境温度和湿度并获取垃圾桶的定位信息。主控芯片通过DHT11传感器获取温湿度数据通过GPS模块获取垃圾桶的位置信息。
【4】数据处理与逻辑控制
主控芯片对采集到的数据进行处理和逻辑控制。可以根据温度和湿度数据判断垃圾桶是否需要进行清理并通过红外传感器检测垃圾桶的满溢状态。
【5】数据上传
主控芯片将处理后的数据通过通信模块上传到华为云物联网平台。数据可以包括环境温度、湿度、GPS定位和垃圾桶的满溢状态等信息。上传的数据可以以JSON等格式进行打包通过NB-IoT网络传输到华为云物联网平台。
【6】数据展示
用户界面接收从主控芯片传输过来的数据并进行展示。用户可以在界面上查看环境温度、湿度、GPS定位和垃圾桶的满溢状态等信息。数据展示可以通过图表、文字、图像等形式进行呈现以便用户直观地了解系统的状态和数据信息。
整个系统的交互流程涉及到硬件模块的数据采集、主控芯片的数据处理与逻辑控制、通信模块的数据上传以及用户界面的数据展示和用户交互。通过这些步骤用户可以方便地监测和管理智能垃圾桶的状态和数据信息。
三、部署华为云物联网平台
华为云官网: https://www.huaweicloud.com/
打开官网搜索物联网就能快速找到 设备接入IoTDA。 3.1 物联网平台介绍
华为云物联网平台IoT 设备接入云服务提供海量设备的接入和管理能力将物理设备联接到云支撑设备数据采集上云和云端下发命令给设备进行远程控制配合华为云其他产品帮助我们快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层屏蔽了各种复杂的设备接口实现设备的快速接入同时提供强大的开放能力支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API实现设备数据采集、命令下发、设备管理等业务场景。 3.2 开通物联网服务
地址 https://www.huaweicloud.com/product/iothub.html 进来默认会提示开通标准版在2023的1月1号年之后没有基础版了。 开通之后点击总览查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台这里可以看到MQTT协议的地址和端口号等信息。 总结:
端口号 MQTT (1883)| MQTTS (8883)
接入地址 7445c6bcd3.st1.iotda-app.cn-north-4.myhuaweicloud.com根据域名地址得到IP地址信息:
Microsoft Windows [版本 10.0.19044.2728]
(c) Microsoft Corporation。保留所有权利。C:\Users\11266ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com正在 Ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节32 时间42ms TTL30
来自 117.78.5.125 的回复: 字节32 时间35ms TTL30
来自 117.78.5.125 的回复: 字节32 时间36ms TTL30
来自 117.78.5.125 的回复: 字节32 时间36ms TTL30117.78.5.125 的 Ping 统计信息:数据包: 已发送 4已接收 4丢失 0 (0% 丢失)
往返行程的估计时间(以毫秒为单位):最短 35ms最长 42ms平均 37msC:\Users\11266MQTT协议接入端口号有两个1883是非加密端口8883是证书加密端口单片机无法加载证书所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。
3.3 创建产品
1创建产品
点击产品页再点击左上角创建产品。 2填写产品信息
根据自己产品名字填写。 3产品创建成功 4添加自定义模型
产品创建完成之后点击进入产品详情页面翻到最下面可以看到模型定义。
先点击自定义模型。 再创建一个服务ID。 接着点击新增属性。 3.4 添加设备
产品是属于上层的抽象模型接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起完成数据交互。
1注册设备 2根据自己的设备填写 3保存设备信息
创建完毕之后点击保存并关闭得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。 (4) 设备创建完成 3.5 MQTT协议主题订阅与发布
1MQTT协议介绍
当前的设备是采用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 msgMQTTS支持的安全等级采用TCP通道基础 TLS协议最高TLSv1.3版本单帐号每秒最大MQTT连接请求数无限制单个设备每分钟支持的最大MQTT连接数1单个MQTT连接每秒的吞吐量即带宽包含直连设备和网关3KB/sMQTT单个发布消息最大长度超过此大小的发布请求将被直接拒绝1MBMQTT连接心跳时间建议值心跳时间限定为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/6419627e40773741f9fbdac7_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/6419627e40773741f9fbdac7_dev1/sys/properties/report
发布主题时需要上传数据这个数据格式是JSON格式。上传的JSON数据格式如下:{services: [{service_id: 填服务ID,properties: {填属性名称1: 填属性值,填属性名称2: 填属性值,..........}}]
}
根据JSON格式一次可以上传多个属性字段。 这个JSON格式里的服务ID属性字段名称属性值类型在前面创建产品的时候就已经介绍了不记得可以翻到前面去查看。根据这个格式组合一次上传的属性数据:
{services: [{service_id: stm32,properties:{DS18B20:18,motor_water:1,motor_oxygen:1,temp_max:10,water_hp:130,motor_food:0,time_food:0,oxygen_food:3}}]}3.6 MQTT三元组
MQTT协议登录需要填用户ID设备ID设备密码等信息就像我们平时登录QQ微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数一般称为MQTT三元组。
接下来介绍华为云平台的MQTT三元组参数如何得到。
1MQTT服务器地址
要登录MQTT服务器首先记得先知道服务器的地址是多少端口是多少。
帮助文档地址https://console.huaweicloud.com/iotdm/?regioncn-north-4#/dm-portal/home MQTT协议的端口支持1883和8883它们的区别是8883 是加密端口更加安全。但是单片机上使用比较困难所以当前的设备是采用1883端口进连接的。
根据上面的域名和端口号得到下面的IP地址和端口号信息 如果设备支持填写域名可以直接填域名不支持就直接填写IP地址。 IP地址就是域名解析得到的
华为云的MQTT服务器地址114.116.232.138
域名7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com
华为云的MQTT端口号18832生成MQTT三元组
华为云提供了一个在线工具用来生成MQTT鉴权三元组 https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具填入设备的信息也就是刚才创建完设备之后保存的信息点击生成就可以得到MQTT的登录信息了。
下面是打开的页面 填入设备的信息 上面两行就是设备创建完成之后保存得到的
直接得到三元组信息。 得到三元组之后设备端通过MQTT协议登录鉴权的时候填入参数即可。
ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108
Username 6419627e40773741f9fbdac7_dev1
Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e3.7 模拟设备登录测试
经过上面的步骤介绍已经创建了产品设备数据模型得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。
1填入登录信息
打开MQTT客户端软件对号填入相关信息就是上面的文本介绍。然后点击登录订阅主题发布主题。 2打开网页查看
完成上面的操作之后打开华为云网页后台可以看到设备已经在线了。
点击详情页面可以看到上传的数据。
到此云平台的部署已经完成设备已经可以正常上传数据了。
四、上位机开发
为了方便查看设备上传的数据对设备进行远程控制接下来利用Qt开发一款Android和windows系统的上位机。
使用华为云平台提供的API接口获取设备上传的数据也可以给设备下发指令控制设备。
为了方便查看设备上传的数据对设备进行远程控制接下来利用Qt开发一款Android和windows系统的上位机。
使用华为云平台提供的API接口获取设备上传的数据也可以给设备下发指令控制设备。
4.1 Qt开发环境安装
Qt的中文官网 https://www.qt.io/zh-cn/ QT5.12.6的下载地址https://download.qt.io/archive/qt/5.12/5.12.6
打开下载链接后选择下面的版本进行下载
qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details
软件安装时断网安装否则会提示输入账户。
安装的时候第一个复选框里勾选一个mingw 32编译器即可其他的不管默认就行直接点击下一步继续安装。 说明 我这里只是介绍PC端的环境搭建这个比较简单。 Android的开发环境比较麻烦可以去我的博客里看详细文章。
选择MinGW 32-bit 编译器 4.2 创建IAM账户
创建一个IAM账户因为接下来开发上位机需要使用云平台的API接口这些接口都需要token进行鉴权。简单来说就是身份的认证。 调用接口获取Token时就需要填写IAM账号信息。所以接下来演示一下过程。
地址: https://console.huaweicloud.com/iam/?regioncn-north-4#/iam/users
获取Token时除了AIM账号外还需要项目凭证:
faa0973835ab409ab48182e2590f4ad3鼠标点击自己昵称点击统一身份认证。 点击左上角创建用户。 创建成功 4.3 获取影子数据
帮助文档https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
设备影子介绍
设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线都可以通过该影子获取和设置设备的属性简单来说设备影子就是保存设备最新上传的一次数据。
我们设计的软件里如果想要获取设备的最新状态信息就采用设备影子接口。
如果对接口不熟悉可以先进行在线调试https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?productIoTDAapiShowDeviceShadow
在线调试接口可以请求影子接口了解请求与返回的数据格式。 设备影子接口返回的数据如下
{device_id: 6419627e40773741f9fbdac7_dev1,shadow: [{service_id: stm32,desired: {properties: null,event_time: null},reported: {properties: {DS18B20: 18,motor_water: 1,motor_oxygen: 1,temp_max: 10,water_hp: 130,motor_food: 0,time_food: 0,oxygen_food: 3},event_time: 20230321T081126Z},version: 0}]
}4.4 修改设备属性
地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html
接口说明
设备的产品模型中定义了物联网平台可向设备下发的属性应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备并将设备执行属性结果同步返回。修改设备属性的接口可以让服务器给设备下发指令如果需要控制设备。
在线调试地址
https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?productIoTDAapiUpdateProperties
修改设备属性是属于同步命令需要设备在线才可以进行调试先使用MQTT客户端登录服务器模拟设备上线。
然后进行调试测试数据远程下发给设备。
【1】利用MQTT客户端先登录设备 (这是同步命令必须在线才能调试) 【2】点击调试 {services:{temp_max:100}}【4】可以看到MQTT客户端软件上已经收到了服务器下发的消息 由于是同步命令服务器必须要收到设备的响应才能顺利完成一个流程设备响应了服务器才能确定数据下发成功。 MQTT设备端如何响应呢
设备响应格式说明https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html 下面进行实操
当服务器通过在线调试发送指令下来之后客户端将请求ID复制下来添加到发布主题的格式里再回复回去服务器收到了响应一次属性修改就完美完成了。 就是成功的状态 **下面是请求的总结 ** (响应服务器的修改设备属性请求)
上报主题的格式$oc/devices/{device_id}/sys/properties/set/response/request_id$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/set/response/request_id响应的数据:
{result_code: 0,result_desc: success}4.5 设计上位机
前面2讲解了需要用的API接口接下来就使用Qt设计上位机设计界面完成整体上位机的逻辑设计。
【1】新建Qt工程 选择工程路径放在英文路径下。 创建完毕。
新建Android的模板 【2】界面设计 【4】代码设计配置参数读取与保存
/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{/*保存数据到文件,方便下次加载*/QString file;fileQCoreApplication::applicationDirPath()/ConfigFile;QFile filesrc(file);filesrc.open(QIODevice::WriteOnly);QDataStream out(filesrc);out text; //序列化写字符串filesrc.flush();filesrc.close();
}/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{//读取配置文件QString text,data;textQCoreApplication::applicationDirPath()/ConfigFile;//判断文件是否存在if(QFile::exists(text)){QFile filenew(text);filenew.open(QIODevice::ReadOnly);QDataStream in(filenew); // 从文件读取序列化数据in data; //提取写入的数据filenew.close();}return data; //返回值读取的值
}
【3】代码设计云端数据解析
//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{QString displayInfo;int statusCode reply-attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();//读取所有数据QByteArray replyData reply-readAll();qDebug()状态码:statusCode;qDebug()反馈的数据:QString(replyData);//更新tokenif(function_select3){displayInfotoken 更新失败.;//读取HTTP响应头的数据QListQNetworkReply::RawHeaderPair RawHeaderreply-rawHeaderPairs();qDebug()HTTP响应头数量:RawHeader.size();for(int i0;iRawHeader.size();i){QString firstRawHeader.at(i).first;QString secondRawHeader.at(i).second;if(firstX-Subject-Token){Tokensecond.toUtf8();displayInfotoken 更新成功.;//保存到文件SaveDataToFile(Token);break;}}QMessageBox::information(this,提示,displayInfo,QMessageBox::Ok,QMessageBox::Ok);return;}//判断状态码if(200 ! statusCode){//解析数据QJsonParseError json_error;QJsonDocument document QJsonDocument::fromJson(replyData, json_error);if(json_error.error QJsonParseError::NoError){//判断是否是对象,然后开始解析数据if(document.isObject()){QString error_str;QJsonObject obj document.object();QString error_code;//解析错误代码if(obj.contains(error_code)){error_codeobj.take(error_code).toString();error_str错误代码:;error_strerror_code;error_str\n;}if(obj.contains(error_msg)){error_str错误消息:;error_strobj.take(error_msg).toString();error_str\n;}//显示错误代码QMessageBox::information(this,提示,error_str,QMessageBox::Ok,QMessageBox::Ok);}}return;}//设置属性if(function_select12 || function_select13){//解析数据QJsonParseError json_error;QJsonDocument document QJsonDocument::fromJson(replyData, json_error);if(json_error.error QJsonParseError::NoError){//判断是否是对象,然后开始解析数据if(document.isObject()){QJsonObject obj document.object();if(obj.contains(response)){QJsonObject obj1obj.take(response).toObject();int val0;QString success;if(obj1.contains(result_code)){valobj1.take(result_code).toInt();}if(obj1.contains(result_desc)){successobj1.take(result_desc).toString();}if(val0 success success){//显示状态QMessageBox::information(this,提示,远程命令操作完成.,QMessageBox::Ok,QMessageBox::Ok);return;}else{//显示状态QMessageBox::information(this,提示,设备未正确回应.请检查设备网络.,QMessageBox::Ok,QMessageBox::Ok);return;}}}}}//查询设备属性if(function_select0){//解析数据QJsonParseError json_error;QJsonDocument document QJsonDocument::fromJson(replyData, json_error);if(json_error.error QJsonParseError::NoError){//判断是否是对象,然后开始解析数据if(document.isObject()){QJsonObject obj document.object();if(obj.contains(shadow)){QJsonArray arrayobj.take(shadow).toArray();for(int i0;iarray.size();i){QJsonObject obj2array.at(i).toObject();if(obj2.contains(reported)){QJsonObject obj3obj2.take(reported).toObject();if(obj3.contains(properties)){QJsonObject propertiesobj3.take(properties).toObject();qDebug()开始解析数据....;}}}}}}return;}
}五、代码实现
5.1 BC26连接云平台实现代码
下面是使用STM32F103ZET6和BC26连接华为云物联网平台实现MQTT设备登录、主题订阅和主题发布的实现代码
#include stdio.h
#include string.h
#include stdlib.h// 定义华为云物联网平台的服务器地址、端口号、设备ID和设备密码
#define MQTT_SERVER mqtt://xxxxxx.iotplatform.com // 请替换为实际的服务器地址
#define MQTT_PORT 1883 // 请根据实际情况修改端口号
#define DEVICE_ID your_device_id // 请替换为实际的设备ID
#define DEVICE_PASSWORD your_device_password // 请替换为实际的设备密码// 定义MQTT相关的参数
#define MQTT_CLIENT_ID your_client_id // 请替换为实际的客户端ID
#define MQTT_TOPIC your_topic // 请替换为实际的主题// 定义MQTT消息接收回调函数
void mqtt_message_received(char *topic, char *payload) {printf(Received message on topic: %s\n, topic);printf(Payload: %s\n, payload);
}// 建立MQTT连接
void mqtt_connect() {// 连接到华为云物联网平台的MQTT服务器// 这里使用的是MQTT的QoS 1级别// 请根据实际情况修改QoS级别和其他参数char command[256];sprintf(command, ATQMTCFG\aliauth\,0,%d,\%s\,\%s\, MQTT_PORT, DEVICE_ID, DEVICE_PASSWORD);printf(Sending command: %s\n, command);// 发送AT指令连接到MQTT服务器// ...// 订阅主题sprintf(command, ATQMTSUB0,1,\%s\,1, MQTT_TOPIC);printf(Sending command: %s\n, command);// 发送AT指令订阅主题// ...
}// 发布MQTT消息
void mqtt_publish(char *payload) {// 发布消息到指定的主题char command[256];sprintf(command, ATQMTPUB0,0,0,0,\%s\, MQTT_TOPIC);printf(Sending command: %s\n, command);// 发送AT指令设置发布的主题// ...sprintf(command, ATQMTPUB0,1,0,0,%d, strlen(payload));printf(Sending command: %s\n, command);// 发送AT指令设置消息的长度// ...printf(Sending payload: %s\n, payload);// 发送消息的内容// ...// 等待MQTT服务器返回发布结果// ...
}int main() {// 初始化串口和其他硬件模块// ...// 连接到华为云物联网平台的MQTT服务器mqtt_connect();// 进入主循环while (1) {// 处理其他任务// ...// 检查是否有需要发布的消息// 如果有调用mqtt_publish函数发布消息// ...// 检查是否有接收到的MQTT消息// 如果有调用mqtt_message_received函数处理消息// ...}return 0;
}5.2 BC26模块的MQTT协议指令
BC26模块是一款支持NB-IoT通信技术的物联网模块可以通过AT指令与外部设备进行通信和控制。
下面是BC26模块与MQTT协议相关的一些常用AT指令及其功能
【1】ATQMTOPEN打开MQTT客户端连接。
功能通过该指令连接到MQTT服务器。参数服务器地址、端口号、用户名和密码等。示例ATQMTOPEN0,“mqtt://xxxxxx.iotplatform.com”,1883
【2】ATQMTCLOSE关闭MQTT客户端连接。
功能通过该指令关闭与MQTT服务器的连接。参数无。示例ATQMTCLOSE0
【3】ATQMTCONN建立MQTT连接。
功能通过该指令建立与MQTT服务器的连接。参数客户端ID、用户名、密码等。示例ATQMTCONN0,“your_client_id”,“your_username”,“your_password”
【4】ATQMTDISC断开MQTT连接。
功能通过该指令断开与MQTT服务器的连接。参数无。示例ATQMTDISC0
【5】ATQMTSUB订阅MQTT主题。
功能通过该指令订阅指定的MQTT主题。参数主题、QoS级别等。示例ATQMTSUB0,1,“your_topic”,1
【6】ATQMTUNS取消订阅MQTT主题。
功能通过该指令取消订阅指定的MQTT主题。参数主题。示例ATQMTUNS0,1,“your_topic”
【7】ATQMTPUB发布MQTT消息。
功能通过该指令发布消息到指定的MQTT主题。参数主题、消息内容、QoS级别等。示例ATQMTPUB0,0,0,0,“your_topic”
【8】ATQMTRECV接收MQTT消息。
功能通过该指令接收从MQTT服务器接收到的消息。参数无。示例ATQMTRECV0
这些是BC26模块中与MQTT协议相关的一些常用AT指令。
5.3 读取DHT11传感器的温湿度数据
以下是使用STM32F103ZET6读取DHT11传感器的温湿度数据的实现代码
#include stm32f10x.h
#include dht11.hint main(void)
{// 初始化DHT11传感器DHT11_Init();while (1){// 读取DHT11传感器的温湿度数据DHT11_Result result DHT11_Read();if (result.status DHT11_OK){// 温度数据uint8_t temperature result.temperature;// 湿度数据uint8_t humidity result.humidity;// 在这里进行温湿度数据的处理和使用// ...// 延时一段时间后再次读取DelayMs(2000);}else{// 读取失败可以进行相应的错误处理// ...}}
}在主函数中通过循环不断读取DHT11传感器的温湿度数据。如果读取成功可以从result结构体中获取温度和湿度数据并进行相应的处理。如果读取失败可以根据需要进行错误处理。
5.4 DHT11.c和DHT11.h代码
dht11.h
#ifndef DHT11_H
#define DHT11_H#include stm32f10x.htypedef struct
{uint8_t status; // 读取状态0表示成功其他表示失败uint8_t humidity; // 湿度值uint8_t temperature; // 温度值
} DHT11_Result;void DHT11_Init(void);
DHT11_Result DHT11_Read(void);#endifdht11.c
#include dht11.h#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_0static void DHT11_Delay(uint32_t us)
{uint32_t count us * 8;while (count--){__NOP();}
}static void DHT11_SetOutput(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin DHT11_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(DHT11_PORT, GPIO_InitStructure);
}static void DHT11_SetInput(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin DHT11_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_Init(DHT11_PORT, GPIO_InitStructure);
}static uint8_t DHT11_ReadByte(void)
{uint8_t byte 0;for (uint8_t i 0; i 8; i){while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){// 等待低电平结束}DHT11_Delay(30);if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){byte | (1 (7 - i));}while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){// 等待高电平结束}}return byte;
}void DHT11_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin DHT11_PIN;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(DHT11_PORT, GPIO_InitStructure);GPIO_SetBits(DHT11_PORT, DHT11_PIN);
}DHT11_Result DHT11_Read(void)
{DHT11_Result result;result.status 1;DHT11_SetOutput();GPIO_ResetBits(DHT11_PORT, DHT11_PIN);DHT11_Delay(18000);GPIO_SetBits(DHT11_PORT, DHT11_PIN);DHT11_Delay(20);DHT11_SetInput();if (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){// 等待低电平结束}while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)){// 等待高电平结束}uint8_t data[5];for (uint8_t i 0; i 5; i){data[i] DHT11_ReadByte();}uint8_t sum data[0] data[1] data[2] data[3];if (sum data[4]){result.status 0;result.humidity data[0];result.temperature data[2];}}return result;
}dht11.h文件定义了DHT11传感器的初始化函数DHT11_Init()和读取函数DHT11_Read()以及DHT11_Result结构体用于存储读取结果。
dht11.c文件实现了DHT11传感器的初始化和读取函数。在初始化函数中配置了DHT11引脚的GPIO模式和速度。在读取函数中通过发送开始信号和接收数据的方式读取DHT11传感器的温湿度数据并进行校验。
5.5 GPS数据解析
在STM32F103ZET6上通过串口2读取GPS模块返回的定位数据并解析经纬度和定位状态。
#include stm32f10x.h
#include stdio.h
#include string.h// 定义串口2接收缓冲区大小
#define RX_BUFFER_SIZE 256// 定义GPS数据解析状态
typedef enum {GPS_STATE_IDLE, // 空闲状态GPS_STATE_RECEIVING, // 接收中状态GPS_STATE_COMPLETE // 接收完成状态
} GPS_State;// 定义接收缓冲区和接收状态变量
char rxBuffer[RX_BUFFER_SIZE];
volatile uint16_t rxIndex 0;
volatile GPS_State gpsState GPS_STATE_IDLE;// 处理接收到的GPS数据
void processGPSData() {// 在这里进行GPS数据解析和处理// 解析经纬度和定位状态等信息// 根据需要进行相应的操作或显示// 例如打印经纬度和定位状态printf(Latitude: %s\n, latitude);printf(Longitude: %s\n, longitude);printf(Position Fix Status: %s\n, positionStatus);
}// 串口2接收中断处理函数
void USART2_IRQHandler(void) {if (USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) {char data USART_ReceiveData(USART2);// 接收到回车换行符表示一条完整的GPS数据if (data \n) {rxBuffer[rxIndex] \0;rxIndex 0;gpsState GPS_STATE_COMPLETE;} else {// 将接收到的数据存储到缓冲区中rxBuffer[rxIndex] data;rxIndex;// 接收缓冲区溢出时进行处理if (rxIndex RX_BUFFER_SIZE) {rxIndex 0;gpsState GPS_STATE_IDLE;}}}
}int main(void) {// 初始化串口2和GPIO引脚// 设置串口2的波特率、数据位、停止位等参数// 使能串口2接收中断USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);NVIC_EnableIRQ(USART2_IRQn);while (1) {// 如果接收到完整的GPS数据if (gpsState GPS_STATE_COMPLETE) {// 处理接收到的GPS数据processGPSData();// 处理完成后重置接收状态为IDLEgpsState GPS_STATE_IDLE;}}
}代码中的串口初始化和中断处理部分是基于标准库的使用方式。