这个移动端侧,包括两个部分,一个是前面已经提及的 Domoticz 在手机移动端浏览器依然可以保持很好的显示兼容性,也能够完成PC浏览器一模一样的功能;但能放在移动端,它的便捷性就一下子提升了一个级别,并且无APP模式,大大提高了客户使用的意愿。
另一个部分就是我们的 国民APP微信,微信凭借着 10 亿月活、8 亿日活的运营数据牢牢控制住社交APP的头把交椅,几乎可以说是人人离不开微信,它确确实实地人们的生活带来了便利。
通过对Domoticz系统的改装,使得它在原本的事件通知上也支持推送消息到微信客户端,这也将大大提升系统产品的易用性和可落地性。
4 系统设计说明
下面就系统的各个组件的设计,做简要的说明。
4.1 硬件部分
硬件部分主要分为四大部分:MCU主控、Wi-Fi模组、各类传感器、输出设备。
- MCU主控
:N32G457
本次使用的MCU主控来自国民科技的32位高性能MCU,以下是它的板载资源介绍:
在我设计的这个系统中,我主要使用其UART1(debug功能)、UART2(连接ESP8266)、UART3(连接语音播报模块)、还有6个GPIO(用于接入各类传感器的输入及告警信息的输出)。
我的硬件实物连接图如下所示:
- Wi-Fi模组
: ESP8266
我这里使用的搭建ESP8266 Wi-Fi芯片的模组ESP-12F,它是由安信可科技开发的,该模块核心处理器 ESP8266 在较小尺寸封装中集成了 业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。
- 各类传感器
:MQ系列烟感、燃气等传感器
这里主要包括系统中使用的烟雾传感器、酒精传感器、天然气传感器、空气质量传感器,这几个都是MQ气体类传感器。
MQ气体传感器使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ气体传感器对甲烷的灵敏度高,对丙烷、丁烷也有较好的灵敏度。这种传感器可检测多种可燃性气体,特别是天然气,是一款适合多种营养的低成本传感器。
- 输出设备
:DY-SV17F语音播放模块
DY-SV17F是一款智能语音模块,集成IO分段触发,UART串口控制,ONE_line单总线串口控制,标准MP3等7种工作模式;板载5W D类功放,可直接驱动4Ω,3~5W喇叭;支持MP3,WAV解码格式,板载32Mbit(4MByte)flash存储音频文件,可通过USB数据线连接电脑更新音频文件。
4.2 软件部分
软件部分主要分为两部分:终端固件部分和Domoticz消息推送定制部分。
4.2.1 终端固件开发
终端固件主要包括四大部分:N32G457的原厂BSP、RT-Thread实时操作系统、ESP8266相关的配置代码使能、个性化的应用逻辑代码。
其中N32G457的原厂BSP基本不动,原厂和相关开发者已经适配好了;通用的RT-Thread操作系统的代码也不在此处的修改中,直接复用已有的代码,这里使用的版本是 4.0.2 。
ESP8266相关的AT、网络组件代码也是现成的,使能配置之后就可以直接用了,还是非常的方便。不过这里其实我也是踩坑了,下面的项目复盘会讲到。
所以这里重点讲一下,应用逻辑的代码:主要包括几个传感器的检测驱动、告警指示灯的控制逻辑、音频播放模块的驱动、按键触发功能的处理等。
整个应用软件部分的程序框架如下图所示:
其中:
Main-Thread :执行整个应用的初始化,负责管理各个子线程的同步和衔接,比如告警信号产生时,触发告警信号的对外上报,正是由Main-Thread来执行的。
System-Config :用于完成整个系统相关的属性配置,比如传感器探测的周期设定、传感器接入的GPIO设定、UART口的分配、EMQ后端定制的配置、Domticz后端传感器编号的配置等等;这里的配置项都是全局生效的。
MQTT-Thread :承载整个应用对外发送和对内接收的网络数据通道,告警信息的上报和传感器数据的上报,都深度依赖这个线程。
WiFi-Thread :本线程主要用于定时探测Wi-Fi网络的有效性,通过对网络设备节点的判断,为应用的其他逻辑功能提供一定的参考。
Sensors-Thread : 由于所选用的几种传感器都是同一类传感器,且都是IO类的传感器,所以通过列表的形式把他们定义在一起,方便轮询管理;主要的工作就是定时采集数据,判断是否有对应的传感器触发了告警。
Alert-LED-Thread :本线程要做的是事情就是在Sensors-Thread产生某一种或某几种告警信号后,里面通过LED的闪烁,达到以视觉冲击的告警目的。
Alert-Sound-Thread :本线程与Alert-LED-Thread线程类似,同样都是处理告警信号的对外传递,只不过它用的是声音的听觉冲击来达到告警的目的。它与Sensors模块通过邮箱来传递播报哪一条报警信息,这与Domoticz后端绑定的通知信息是对等的。
Key-Scan-Thread :这个线程需要做的事情,主要是当产生告警信号后,灯亮铃响时,可以通过按键来消除LED告警和声音告警,使得系统检测恢复到初始状态。
在软件设计过程中,所有涉及到线程间同步的机制,均采用信号量和消息队列来实现,主线程在这其中起到承上启下的作用。
总结一下,本次在使用RT-Thread操作系统的时候,使用到了其 串口设备驱动、GPIO设备驱动、AT组件、SAL 套接字抽象层、信号量、邮箱 等核心模块,整体使用上还是挺顺手的。
基本代码示意图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJIA2VjZ-1653119229285)(https://s2.loli.net/2022/03/27/q5zAuSgmekHZsUL.png)]
4.2.2 Domoticz推送定制
这里主要的软件实现就是,就是将原本Domoticz中需要通过Email推送出去的消息,转到通过HTTP接口推送到微信中,从而关注了对应微信的人员就可以收到对应的告警信息推送。这里用到了一个python脚本实现HTTP接口,然后POST消息到微信中。
基础的改动代码正如下图所示:
4.3 私有化部署的 IoT 系统
这里提及的私有化部署,主要是将IoT后端系统部署在个人云服务器上,以便于通过公网快速访问;同时,由于是私有化部署,不受限于任何的IoT云平台,这对比外面普通对接阿里云平台、涂鸦云平台、微信云平台、小米云平台、百度云平台等等,是有一个的优势的;至少在个人家庭数据的沉淀和数据安全上,没有那么地担心。
这里的系统部署,包括几个部分:
- EMQ的部署
:
EMQ的部署相对比较容易,基本参照官方教程就可以完成,感兴趣的可以去了解他们的github开源仓库。
- Domoticz的部署
:
这里其实我是踩坑了的,下文的经验总结会细讲。总之,一开始各种不顺,后面推过一系列的摸索学习,决定采用修改Domoticz的源码,借助企业微信的推送功能,打通系统告警消息推送到微信的功能。
- 企业微信相关的部署
:
从这里我们知道,要完成Domoticz的通知推送与微信消息推送打通,我们需要借助企业微信的应用功能,企业微信开放了相关的接口来实现这部分功能,感兴趣的可以参考下 官网的文档介绍,当然也可以参考下我采用的 引路文章。
- WEB访问域名的配置
:
当Domiticz在私有云服务器上部署成功之后,基本就可以通过公网IP加对应端口的形式,以HTTP或HTTPS的方式访问;由于IP和端口不容易记忆且容易拼错,所以才衍生了配置域名访问的需求,之前我配置过类似的功能,比如使用 http://yyds.recan-li.cn就可以访问我的 CSDN主页,之前我写过类似的教程,基本参考教程一步步做可以完成相关的配置功能了。配置完的效果就是,我可以通过 http://smart.recan-li.cn 就可以访问Domoticz的WEB配置前端,而不需要输入繁琐难记的IP+端口了。
5 项目实施过程
主要实施过程如下所示:
1)搭建后端系统,先把EMQ这个MQTT broker搭建起来,使得终端和后端的数据通道得以建立起来;
2)部署安装Domoticz,可选用zip包解压安装或源码编译安装,但由于要定制化告警消息推送到微信,这里强烈建议使用源码级编译安装;当Domoticz安装运行起来后,其对应的SQLite数据库也是同步在工作的;这时WEB端的访问服务也是同步开启了;
3)通过Domoticz的WEB端配置,建立MQTT类型传感器,同时在平台建立与终端一一对应的虚拟传感器;这一步完成之后,便可以使用MQTT.fx等MQTT调试工具模拟对Domoticz上的虚拟设备进行状态推送,看其对应的状态是否会发生改变;
4)搭建企业微信的环境,包括创建一个企业微信账号,再在企业微信下创建一个应用,取得企业ID、应用ID和应用私钥;有这个要素之后,就可以使用微信推送的HTTP接口做消息推送的模拟测试;
5)再在Domoticz源码上集成应用HTTP接口推送(告警)消息到微信客户端的功能代码;
6)开发终端的固件,调试Wi-Fi通讯,MQTT上下行,以及各个传感器的工作;
7)需要关注微信推送消息的人员扫码 关注 企业微信中对应的应用,同时打开微信客户端的通知显示权限,这样当新的消息通过企业微信应用推送下来时,手机端就会弹窗提示;
8)终端工作起来,尝试触发一些告警状态,观察终端的处理逻辑和状态上报到Domoticz的数据更新,同时观察告警消息往微信客户端的推送情况。
通过上述一系列的实施之后,整个私有化部署的家用式智能告警系统就跑起来了,enjoy it !
6 项目效果显示
相关的展示图片和演示视频,见下文:
【项目展示图片】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkU54BH1-1653119229286)(https://s2.loli.net/2022/03/27/MAGJPUVCb5iOp1f.png)]
【项目演示视频】见 B站视频。
【项目开源代码】n32g457_esp8266_smart_home
7 项目复盘
7.1 项目踩的那些坑
- RT-Thread Studio的配置项摸索半天,想去搜索一下配置项,又不知何从做起,我是深度Linux环境开发者,平时一个grep能解决的事情,我不知道在Windows下有什么好的替代方案,慢不慢先不说,先得有。之前在Linux都是menuconfig,我始终觉得那个更亲切。知其然,也知其所以然。
- ESP8266的固件烧录耽误老半天,上次RDC大会抽中的ESP-12F开发板,默认出来的lua版本,而非AT版本;由于RT-Thread的组件是需要AT版本的,于是找个好几个教程,费了好大劲才把AT调出来,期间各种下载失败(还是下载到90%才失败的那种),各种下载工具折腾,下载速度也慢;本来想偷下懒用ESP8266省事的,硬是折腾得想临时换模组。
- ESP8266的AT是通了,但是编译个N32G457固件使用UART2带ESP8266,死活work不起来;无奈求助于RT-Thread,很快找到了论坛好友 crystal266 的 基于RT-Thread和N32G457的智能家居demo ,看到他已经完成了全部流程,应该可以为我所有,所以我借用他的配置代码,果然ESP8266的通讯能力一下子就拉满了。那种感觉好像,项目马上就可以结项了,丝滑地很。
- Domotics
的邮件通知功能,在最新版本上就是各个渣渣,还特意阅读了一个国外同行遇到的同样的问题,看了他们的
issue沟通
,然后依然没有任何思绪。一路执行,我放弃了stable版本的Domoticz安装版本(zip包直接拉起bin文件)转向源码自行编译编译,重新操刀在发送邮件通知的地方,把通知重定向发往
微信
里面。再次,感慨,开源大法好,任何字节细致都逃不过你的法眼!你想怎么玩就怎么玩!
具体如何修改相关的代码,可以参考上面的 4.2.2 小节。
- Domiticz 是我目前遇到编译开源软件,最蛋疼的一次,各种问题,真正的是走一步出问题一步,然后解决一步再前进一步,期间过程遇到各种奇葩问题,编译慢也是知道吐槽一下,所幸最后还是编译出来了,能够把它跑起来。
- 之前在配置Domoticz的邮箱通知功能失败之后,我考虑过使用它的SMS短信通知功能,无奈Domoticz的大神们都是国外的,给出的接口都是国外公司的,我想注册一个账号体验下,居然死活注册不成功!说好的技术无国界呢?放弃!
- 接下来各种搜索推送通知方案,短信、邮件、HTTP、语音等,了解了阿里云、腾讯云的各种相关服务,无奈要不是接口做的相对我来说复杂了些,要不就是功能不能很好地满足我的功能需求(提供的功能需求限制太多);差点放弃了,后面被我检索到一篇关于企业微信支持开发者推送消息的文章,让我眼前一亮,心想这才是我想的 为所欲为,这个太棒了。一个python脚本配置一下就可以轻松搞起来,你还能找到比这个更简单的吗?
- 微信推送算是搞定了,接下来的Domoticz的域名网址配置,又出问题了;之前我配置过使用 http://yyds.recan-li.cn 就可以访问CSDN主页的方法,我使用该方法依葫芦画瓢,设置了 http://smart.recan-li.cn 的域名访问Domoticz,结果却出现了nginx返回http502. 真是无可奈何。
- 终端侧的槽点倒是没多少了,但这样需要重点吐槽下 N32G457在RT-Thread Studio下使用pyocd.exe,时好时坏,有些郁闷。
- 好像N45G357这板子还有点脆弱,差点焊废了,差点芯片就起不来了!
- 最后一个不算是坑的点:使用RT-Thread开发IoT应用这种量级的代码,用起来还是 倍儿爽,希望RT-Thread能把这份爽继续发扬下去。
7.2 项目带来的启发
- DDL是第一生产力
我始终觉得我是一个无形之中在不断践行这个slogan的开发者,虽然我知道这个习惯真的很不好,每次在DDL之前总是付出比平常多几倍的时间和精力去努力完成既定的任务和计划,其实这个投入和产出是非常不正常也不科学的。所以,当我深刻意识到这点之后,我也会努力克制住平时的惰性,争取把时间计划做得更细致,把有限的时间最大化地利用,做一个生活和技术都自律的人。
- 优先解决主要矛盾
我刚入行的时候,带我的师傅经常跟我们说一句话:“先解决 有没有 的问题!”其实,跟这里说的优先解决主要矛盾是一样的,比如你搭这个智能化 IoT 系统,如何能快速搭建好产品原型,把终端侧的数据和后端打通,那首先你必须得解决终端侧联网的问题,这个就是优先级最高的,后端系统到可能不是最先的,你有网络之后,你可以先用一个本地的MQTT broker一样可以看到终端侧的数据上报,而数据端的采集、处理逻辑,我倒认为是最次要的;因为你在此之前,你完全可以模拟数据,你想要什么数据就有什么数据,但是最终在整个数据传到链条打通之后,终端侧数据的准确性及多样化的业务逻辑往往可以起到锦上添花的效果。
- 努力把你当那些 TODO 消灭掉
我相信每个人都有自己很多的 TODO,但是往往程序猿的 TODO 又好像代码里的注释写的那种,不仅骗了自己,同时也骗了别人。而项目中的 TODO 往往就是那些需要优化,需要沉淀,需要突破的地方,就好像我这个项目一样,比如如何做好更好的用户体验?比如如何快速、准确地完成私有化部署?比如如何快速地迭代新的终端侧功能?比如这个产品有没有更大的潜在商业价值?这一系列的 TODO 往往才是核心竞争力的体现,只有把它们踏踏实实消灭了,才有可能带来新的台阶。
7.3 未来的一些想法和规划
- 断舍离
短期内,这应该会是我参加的最后一次这种设计大赛了,倒不是说这样的设计大赛无法给我带来学习和成长的价值,而是我发现我现在的工作需要承担更多的东西,我需要静下来心去实现新的突破。相比之下,现阶段在工作上的突破或许要比在设计大赛上的成长对我来说更为重要。工作和生活是不可能完全隔离,但需要做好权衡,毕竟人的精力是有限的,我希望把它花在最需要成长的地方。
- 技术备忘录
技术备忘录里的几十个技术备选课题等着我去静下心来梳理、沉淀和转换,这往往会耗费大量的精力去琢磨。熟悉我的朋友可知,我每月在 RT-Thread论坛 至少输出2篇技术干货,很荣幸连续拿了3个月度优秀文章,同时还有好几篇技术文章得到【优秀】称号,还有收到论坛好友的友情打赏,这些都在激励着我不断前行,我也会坚持把这个月度技术输出继续下去,希望可以把自己的技术经验传递给更多需要的技术人。
- 一年之计在于春
最近刚写了一篇心灵鸡汤,感兴趣的可以当做水文一篇,没事解解乏。【职场心灵鸡汤】以多年来拿最佳的心路历程来复盘【如何成为优秀的5%】
8 致谢
感谢强大的政府,深明大义的果断决策,才得以控制住在深圳眼看就要大概率多点扩散的新冠疫情,才有今天安静地坐在办公室码代码的自由。
感谢 RT-Thread的小师弟,不屈不挠地催促(初略算了下,不少于3次)我赶紧完成比赛项目,赶紧提交比赛文档,错过这村就没这店了,才不至于让我的参赛项目流产。
感谢论坛好友 crystal266 的 参赛作品文章及基础代码 快速地帮我们踩了ESP8266在N32G457上面的坑,才得以项目在 DDL 之前完成作品的提交。
感谢家人对这段时间工作安排的密集和生活照料的无暇,才得以全心思地投入作品创作。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-8R9PtfaV-1713000632217)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!