Kalec的网络日志

漂浮的灵魂

HOME 首页 基于现代web开发技术的物联网小玩具开发过程

基于现代web开发技术的物联网小玩具开发过程

技术
2018-07-11 22:24:00

上个月做这个的那段时间收获还是颇多的啦。继上个月写了一个函数式的小开头后,就一直没有写过啥了,嘿嘿,忙于毕业啥的。借口啥的也是多。其余的函数式编程那些玩意看啥时候想写再写啦。

总体介绍

先说说为啥要搞个这玩意。这玩意主要是正好硬件的开发什么的正好是符合我学的专业相关内容的,再加上自己对互联网相关的东西又比较感兴趣,所以正好两者之间做个结合啥的。

由于JavaScript这破语言在IO密集型的应用上有绝对的优势,再者NPM开源社区的强大支撑,这也非常符合当前物联网的需要。我就想着用我目前的技术去设计一个能够对家居进行远程控制的玩意。

期初的时候,我很想找点国内相关开发者开发的案例,结果很不幸,国内当前用node来做物联网并且开源的真的几乎没有。我就只能硬着头皮先自己设计方案来试试。

在这次的开发中,首要解决的问题就是和硬件通信的问题,NodeJs和c进行通讯是一件很麻烦的事前,就算是有N-API的今天也一样。那么咋办?一个偶然的机遇在逛reddit的时候,看到了一个叫做Jhonny—five的开源库,可以通过他来实现和硬件间的通讯,我格外欣喜。

为了能够快速开发,单片机我选用了Arduino也是个有比较大的开源库的家伙。系统的设计方案如图:

图片 1.png
目前暂只有3个模块,不过可以轻松实现自由扩展:

  1. 小灯的控制,在远处进行亮度调节,开闭等操作。满足人们日常生活中在远处进行调控对能源的节约等。可以方便人们的日常生活。

  2. 温度监测与采集,这交给后台来自动完成数据采集,用户发起访问的时候可以得到相应的温度信息,实时信息。可以用于现今的数据可视化应用中,比如大棚温,家庭度室内温度等,系统进行展示分析。

  3. 摄像头监控跟随,图像采集并且在后台完成识别,跟随人。这可以用于现代智能安防中来,其中的自动跟随,采集的意义重大。这个可用于家庭安全监控,仓库监控等。

实现思路

后台部分

koa的web开发部分大致就是开发几个中间件的事情,其中webpack,日志,消息体解析,路由全部放入中间件,这没啥好说的,webpack区分下只在开发环境中启用就行。

屏幕快照 20180711 下午8.06.28.png
然后为了硬件控制的服务放在子进程中,开子进程,能保证硬件运行的独立以及稳定,同样也不会对web服务造成影响。

为了多个模块的并行,没有采用socket.io,而是用了一个nodejs-websocket模块,方便建立多个websocket通信,并且在这里做了封装,能够更方便的用于各模块。

硬件子进程

屏幕快照 20180711 下午10.17.11.png
总体设计就如上。

LED控制部分

屏幕快照 20180711 下午10.19.27.png

led采用pwm调整占空比实现调光,首次打开led页面后台会给前台当前led状态,页面上的调整实时通过websocket传给后台,考虑到可能有多用户对同一个灯亮度控制的问题,在此同时后台对所有打开此页面的客户端进行广播led当前状态,从而在此实现多用户同步。

温度传感器部分

屏幕快照 20180711 下午10.21.32.png

温度传感器采用DS18B20,之前用的多也没啥好说的。这里只要做到用户访问时候http请求拿到近10次保存的温度,websocket实时传递当前温度即可。
这次开发数据量并不是很大,所以选择最熟悉的MongoDB,还考虑到登录需存储用户信息,还有其他拓展也可能用到的情况,数据库操作放到主进程中。温度采集我设定的刷新率是200ms,向主进程通信在开发环境下暂时用30s方便测试。主进程中只要已接收到温度数据就直接进行存储。

摄像头跟踪部分麻烦得多些,首先先去买了两个小舵机,掰开了个贴膜神器的塑料架,胶水加螺丝加一个辣鸡摄像头,拆去外壳只留下核心减轻重量,拼接出一个简易的云台。

追踪模块

然后需要搞清楚的是在web上显示的图像,要追踪到某一个可视点,舵机在两个方向各自需要旋转多少度。这算法算是比较简单,找摄像头可视角度和图像大小的对应比例即可。摄像头由于是地摊货,可视角度只能自己用两个三角板估测(一个垂直于摄像头平面且保证一边位于图像中心,一个再次垂直于另一个三角板,读数,并用三角函数即可算得)。估测完成就轻松了,建立个坐标就能解决问题。

另外一个麻烦的就是人脸识别,这个我思考过三个方案:

  1. web中利用canvas+tracking进行调整灰度进行识别,由于图像帧数过低,大概显示帧数只有(8~12帧的样子)直接放弃换方案。

  2. 后台通过opencv来做识别,图像直接推流到前端,由于尚未掌握视频压缩处理技术,加上后台node读取摄像头比较麻烦,暂时放弃。

  3. 选择折中方案,web中读取摄像头,通过websocket把图像传递到后端,opencv进行识别,识别结果在传给前端。

屏幕快照 20180711 下午10.22.48.png
对我来说目前方案3暂时可行,但在现实中只有方案2才是最佳解。先不谈这个。这里我让前台100ms向后台进行传递一张图,进行识别,为确保舵机上次已经完成运动,设定200ms的延时。

前端部分

这一块也没啥可说的,安全验证部分每次路由切换向后台发起请求验证来保证安全性,然后记得在生命周期结束的时候,也就是切换路由销毁组件的时候,销毁socket连接,定时器,等来节约性能。

实现展示

具体实现看如下视频:

总结

总体上来说这次开发,耗费了好长的时间,也学了不少东西,特别对websocket的了解简直更上了一个层次。同时意识到多次侦听事件不能进行异步封装。
总之,这个设计暂时还不是非常完善,等追踪那部分能够用方案2实现的时候,我会对其进行开源。今天就酱,下次见喽。

留言

  • 打工战士zzy
    说:
    1

    从安卓微信过来看博客,好像视频出问题了,画面比例不对

    2018-07-12 01:21:11
    |
    • Kalecgos
      回复:

      好像真的是不对,😶😶

      ----
      2018-07-12 14:19:32

评论

看不清?换一个