在润和HiSpark的WiFIIoT开发板通过MQTT实现简易IoT智能网关
一、 总体介绍
1.1 视频展示及源码
最新更新:
视频展示已上传到Bilibili,链接为https://www.bilibili.com/video/BV1HK4y177XL?from=search&seid=5136887023363432633
源码已上传到Gitee,链接为https://gitee.com/Weijunchok/hARMony_mqtt_-io-t ,其中包括新增连接到华为云和Onenet的mqtt_test.c文件,只需修改个人连接信息即可使用。
欢迎评委老师和开发者们批评指正,让我可以继续完善作品
1.2 系统组成
本作品硬件组成包括HiSpark的WIFIIoT开发套件的核心板,0.96尺寸的OLED,Dht11温湿度传感器,如图所示。
1.3 系统所需包
硬件系统实现需要WIFI驱动包,Paho-MQTT,OLED驱动包,以及DHT11驱动采集包。
其中,需要用到润和HiHope社区的HarmonyOS-IoT-Application-Development 储存库代码,地址为https://gitee.com/hihopeorg/HarmonyOS-IoT-Application-Development。具体用到的是04_Wifi,实现联网功能,以及03_sensing的oled部分。
其次,还需用到MQTT功能,是通过Paho-MQTT进行移植,CSDN社区已有博主移植成功,我是沿用其代码,地址为 https://blog.csdn.net/qq_33259323/article/details/109530970
在该代码的基础上我重新封装Publish和订阅信息到达的On_message函数分别用于上传传感器数据和即时订阅APP发来的控制命令,另外还添加心跳函数保持连接。
DHT11移植是借鉴CSDN博主小Caicai以及程序员小哈的文章,在开发板中进行移植,地址为
https://blog.csdn.net/qq_41838541/article/details/106634984
和https://blog.csdn.net/rsd102/article/details/106084826
其中根据手册和Harmony系统源码移植了其中几个重要函数,在下面会给出展示。
实现远程控制所需APP我是在Android Studio通过Paho-MQTT包进行实现MQTT通信,其他功能自行设计搭建。在我个人阿里云服务器上搭载了Mosquitto服务器以及数据库,用于储存通过MQTT上传的温湿度数据。
1.4 系统功能
系统目前能实现的功能:
1. 开发板定时与DHT11通信,采集温湿度数据。
2. 开发板通过OLED显示采集到的温湿度数据。
3. 开发板联网,并连接云服务器的MQTT服务器,能与手机APP双向通信。
4. 开发板在采集到温湿度数据将其通过MQTT发布,云服务器监测过温,通过邮件提醒。
5. 开发板可订阅手机APP发布的控制信息,并根据信息实现板载LED灯亮灭。
6. 云服务器上数据库可存储开发板上传的温湿度数据,并可通过浏览网页查看历史数据。
二、 硬件及其功能实现
2.1 DhT11温湿度传感器
系统接线:
DHT11————WiFIIoT
VCC————3.3V/5V
GND————GND
DATA————GPIO0
注意事项,根据DHT11手册,GPIO先设置成输出模式,先给出起始信号,其中要保持高/低电平若干us或者ms,这里的实现需要导入hi_time.h头文件,调用hi_udelay()实现而不能用usleep()函数。其后,GPIO设置成输入模式,接收DHT11响应信号,并根据高电平持续时间判断该位是1还是0,写入数据位。其中几个主要函数如下图。
2.2 MQTT主要函数
MQTT我在Paho_MQTT移植基础上,根据实际需要与传感器数据交互,封装了如下几个函数,以约定的协议格式(此处没有用JSON格式,但随时可以稍微修改Sprintf的内容便可实现JSON的TYPE3格式上传数据)封装传感器数据成MQTT包,并发送出去。同时每隔1s调用on_message()函数查看是否有远程控制命令到达,并响应。
此处在MQTT移植基础上,第一个完善了订阅信息处理,源码是在Publish完再检查是否有订阅信息到达,这会导致无法及时响应订阅数据,所以我采取是新建一个线程每隔1s就查看是否有命令到达并响应。
第二个是自定义了Publish函数,更灵活地上传数据。
虽然这里是连接我自己搭建的MQTT服务器,但根据这些源码,只需根据华为云或Onenet注册的信息,对应修改MQTT连接的参数ip、port、Clientid、Username和Password即可搭建通信。再修改Publish函数为JSON格式的Type3符合云服务器的格式便可在发送后在服务器查看到对应数据流,如:
memset(text, 0, sizeof(text));
strcpy(payload, "{");
memset(text, 0, sizeof(text));
sprintf(text, "\"Temp\":%.2f,", Temp); //这里的f后面有逗号,
strcat(payload, text);
memset(text, 0, sizeof(text));
sprintf(text, "\"Hum\":%.2f", Hum); //注意这里的f后面没逗号,
strcat(payload, text);
strcat(payload, "}");
memset(text, 0, sizeof(text));
但需要注意每个数据流之间有逗号分隔,而最后一个数据流是没有逗号的。
华为云或者Onenet云具体的注册步骤就在此不细说了。
2.3 OLED主要函数
OLED————WiFIIoT
VCC————3.3V
GND————GND
SCL————SCL
SDA————SDA
Oledshowdata主要实现与传感器数据交互,可视化显示采集数据。其他函数可以根据oleddemo,无需太大修改。三、 实物效果
3.1 开发板串口数据
3.2 OLED显示效果
3.3 云服务器MQTT日志3.4 云服务器查看历史数据
3.5 手机APP显示效果
3.6 手机APP远程控制效果3.7 手机APP设置MQTT参数3.8 温湿度过限邮件提醒
四、 作品未来展望
4.1 MQTT
手机APP在设计上面已经考虑到连接公有云和私有云的问题,具体区别在于,例如在连接Onenet,华为云时,MQTT连接时的ClientID应改为对应的产品ID,而用户名和密码则按照各自规则修改,修改实现可通过APP上MQTT参数设置修改。
4.2 更多功能
4.2.1 语音模块或红外模块接入
我手头上有语音模块,尚未完成移植,我在其他平台上已有实现初步效果,理论可行,具体实现开发板作为网关,用户可通过语音模块发出指令控制开发板下发命令控制家居终端。
4.2.2 通信技术
未来我计划是用华为海思的HPLC电力线载波通信技术连接家居终端,所以目前我先用这款开发板进行鸿蒙系统的学习,效果十分好。另外还可以使用诸如Zigbee,NB-IOT等技术,目前我还在移植阶段,初有成效。
4.3 外设功能移植
目前正在进行SPI通信以及UARST串口接收信息处理移植,可用于后续连接更多外设完善功能。
4.4 美中不足
作品还存在一定的缺陷,例如,目前仅有网关,还缺少终端节点。终端节点理论上可以选用Arduino,STM32平台进行开发,也已经调好。我预计是使用LoRa通信技术作为网关和节点之间的通信桥梁,但个人能力有限,SPI通信的LoRa驱动库在开发板的移植尚未完成,尽管我的节点已经调好。网关仅完成到与LoRa模块通信成功,尚未设置其他参数,在今后将争取早日完成LoRa移植,使得网关能够与节点成功通信,实现智能家居。
五、 总结,分享开发经验
本次作品是我购买润和HiSpark开发板后学习了几个星期后制作出来的,初步实现预想功能,还有很多进一步开发的空间。回想起开始板子到手时,我第一时间是想尝试烧录程序,所以进行开发环境搭建,这个过程比较痛苦,我折腾了几个小时都没办法顺利完成,感谢连老师放出的Ubuntu镜像,解决了我开发第一步难题。
我学习的第二步就是尝试对LED示例进行小修改,探索代码组成和工作原理,在这过程里,我学习了GPIO基本操作,接入我自己的LED灯模块实现了流水灯功能。
我学习的第三步就是开拓思路,计划我需要实现的功能,第一个是WIFI联网,第二个是MQTT通信接入MQTT服务器,第三个是传感器数据采集,第四个是OLED显示及手机APP远程控制。
根据我第三步的计划,WIFI功能可以根据润和社区的Demo实现联网,紧接着是MQTT通过移植别人做好的基础,然后再根据自己的想法封装Publish函数,实现与传感器数据交互。封装On_message函数,实现远程控制交互,OLED也同样道理,在看懂代码后,封装OLEDshowdata函数,实现与传感器数据交互。
上面是我目前实现功能的思路,当前学习我遇到了新的问题,新的想法,比如,在前人没有给出经验和Demo的时候,遇到一个陌生的问题如何解决?我目前尝试是SPI通信,在代码包里面有Hi3861的app_demo,有wifiiot_spi.c,我该如何利用,调用它们实现我的功能。
简单的调用是无法实现的,比如,我单纯调用wifiiot_spi.c的spiinit(),spihostwrite(),是无法实现与SPI设备通信的,其原因可以在app_demo_spi.c中查看。就是因为spiinit()前还需要设置GPIO的功能,所以我封装了基于wifiiot的顶层函数,用于设置SPI0,SPI1的引脚功能,再根据app_demo_spi.c内容进行函数移植,去完成SPI通信,目前我已成功与SPI设备握手并读取到我需要的数据。
六、源码
我的源码上传到了Gitee,地址是https://gitee.com/Weijunchok/harmony_mqtt_-io-t 有兴趣的开发者可以将app目录的文件放置在个人的code-1.0\applications\sample\wifi-iot\app下,将domain里面的各个lib文件夹放在个人的code-1.0\domains\iot\link下。下面评论区我也会简单介绍一下基本的开发过程和注意事项,希望大家多多交流和讨论。
作者:Aaron