一直想自己做一套还算有实用性的智能家居系统,恰逢毕业,将此想法落地,本篇将简单描述MyHouse智能家居系统的实现方法。
一、技术选型
1. 后端:
后端采用个人更为熟悉的python-django框架作为纯后端,负责为前端提供服务,使用paho-mqtt接收硬件设备上传的数据、并向设备发送用户传达的指令。
2. 前端:
前端采用Layui框架,其提供了较为完整的响应式UI组件库,并且为传统JS的设计模式(与现代Vue.js的MVVM架构所区分),对后端人来说,更容易上手。
使用JQuery做各种DOM操作、发送Ajax请求,虽然缺乏优雅,但胜在易理解,好操作。
使用Echarts实现数据可视化中的图表等,通过快速的阅读文档、查看例程,即可快速上手实践。
3. 数据库:
使用MariaDB作为关系型数据库,使用Redis作为缓存,存储临时数据的同时,也为MariaDB分担一些压力。
4. MQTT服务器:
使用Mosquitto作为MQTT服务器,部署方便,配置简单,对服务器负载相对较小。
5. 开发板:
使用乐鑫ESP8266-12E NodeMCU作为开发板。这款单片机提供了相对稳定的Wi-Fi连接功能,支持TCP/IP协议栈,可以很方便的进行网络通信。支持MicroPython与Arduino平台开发,在有基础的前提下,可以快速学习、开发。他也引出了所有引脚,对于单独操作某个智能家居执行器,也基本够用。

二、逻辑实现
因为此前没有涉及过Web端的实体控制,所以思考这个逻辑还是花了一些时间的。
1. 基础数据交互:
这一块,类似普通网站的登录注册、浏览等功能,是Web应用的基本功能,遵循固有模式设计。
2. 硬件数据交互:
收:
此模块不同于普通站点,涉及了非HTTP协议的建立,且需要后端长时间与MQTT服务器保持连接。故需要一个任务随后端服务启动,与MQTT服务器建立连接,接收到数据后,分析,存储。该任务,随后端启动,但不经过wsgi网关、urls解析与View,但通过Model操作数据库。
发:
在接收到数据并解析后,立即检索是否存在设备联动的情况,若存在,则通过MQTT服务器向从设备发送对应指令。
当后端接收到用户在前端发出的指令后,解析对应设备和状态,在View中使用paho-mqtt通过MQTT服务器向设备发送指令。
3. MQTT消息订阅规则:
首先,每个设备需要自己独立的几个主题以避免发生数据误收,故借助ESP8266的MAC地址作为唯一身份标识,作为用户-设备绑定、发布/订阅主题的依据。
设备发,后端收:esp8266/+/state
设备收,后端发:esp8266/+/ctrl
设备上下线(遗嘱),后端收:esp8266/+/will
4. 设备联动:
数据库设计是这个模块最重要的一环,影响着数据解析、页面设计以及功能的高效实现。
“当设备A采集的B型数据,与C条件满足逻辑条件D时,E设备的F状态设为G”,
如:当<温湿度计>采集的<温度>,与<30(摄氏度)>满足<大于关系>时,<门窗开关>的状态<角度>设为<45(度)>。
分析逻辑后,对条件进行抽象,可提取出关键性字段,存入数据库中,合理设置非主键索引,便于查询。
至此,系统运行逻辑基本完成,可根据各模块所需技术栈分别进行代码编写,完成相应功能。