如今,得益于微电子、通信渠道、互联网技术和人工智能的快速发展,智能家居的话题变得越来越重要。 自石器时代以来,人类的住房发生了重大变化,进入工业革命4.0和物联网时代,变得舒适、实用和安全。 市场上出现的解决方案可以将公寓或乡村别墅变成复杂的信息系统,可以使用智能手机在世界任何地方进行控制。 此外,人机交互不再需要编程语言知识——借助语音识别和合成算法,人们可以用母语与智能家居对话。
目前市场上的一些智能家居系统是云视频监控系统的逻辑发展,其开发人员意识到不仅需要监控,还需要管理远程对象的全面解决方案。
我们向您呈现一系列三篇文章,其中将向您介绍由作者亲自开发并投入运行的云智能家居系统的所有主要组件。 第一篇文章专门介绍安装在智能家居内的终端客户端设备,第二篇文章介绍云存储和数据处理系统的架构,最后,第三篇文章介绍用于管理移动和固定设备上的系统的客户端应用程序。
智能家居设备
首先,我们来谈谈如何将普通公寓、别墅或别墅打造为智能家居。 为此,通常需要在家中放置以下设备:
- 测量各种环境参数的传感器;
- 作用于外部物体的执行器;
- 控制器根据传感器测量值和嵌入式逻辑执行计算,并向执行器发出命令。
下图是一个智能家居示意图,卫生间有漏水传感器(1),卧室有温度传感器(2)和照明传感器(3),厨房有智能插座(4),还有一个智能家居。走廊里的视频监控摄像头 (5)。
目前,使用 RF433、Z-Wave、ZigBee、蓝牙和 WiFi 协议操作的无线传感器得到广泛应用。 它们的主要优点是易于安装和使用,以及低成本和可靠性,因为制造商正在努力将他们的设备推向大众市场,并使普通用户能够使用它们。
通常,传感器和执行器通过无线接口连接到智能家居控制器 (6),这是一种专用微型计算机,可将所有这些设备组合到一个网络中并对其进行控制。
然而,一些解决方案可以同时组合传感器、执行器和控制器。 例如,智能插头可以编程为根据时间表打开或关闭,云视频监控摄像头可以根据运动检测器信号录制视频。 在最简单的情况下,您可以不需要单独的控制器,但要创建具有多种场景的灵活系统,这是必要的。
为了将智能家居控制器连接到全球网络,可以使用常规的互联网路由器(7),这早已成为任何家庭中的常见家用电器。 这里还有一个支持智能家居控制器的论点——如果与互联网的连接丢失,智能家居将继续正常运行,这要归功于存储在控制器内部而不是云服务中的逻辑块。
智能家居控制器
本文讨论的云智能家居系统控制器是基于单板微机开发的
控制器的组装非常简单 - 将微型计算机 (1) 安装在塑料盒 (2) 中,然后将带有软件的 microSD 格式的 8 GB 存储卡 (3) 和 USB Z-Wave 网络控制器 (4) 安装在塑料盒 (5) 中。相应的插槽。 智能家居控制器通过 2.1V、5A 电源适配器 (6) 和 USB - micro-USB 电缆 (XNUMX) 连接到电源。 每个控制器都有一个唯一的标识号,该标识号在首次启动时写入配置文件中,是与云智能家居服务交互所必需的。
智能家居控制器软件是本文作者基于操作系统开发的 Linux Raspbian 拉伸。 它由以下主要子系统组成:
- 与智能家居设备和云端交互的服务器进程;
- 用于设置控制器的配置和操作参数的图形用户界面;
- 用于存储控制器配置的数据库。
数据库 基于嵌入式DBMS实现智能家居控制器
图形界面 使用微框架在 PHP 7 中开发的智能家居控制器
图形界面的主要功能是将智能家居设备(IP监控摄像头和传感器)连接到控制器。 Web 应用程序从 SQLite 数据库读取控制器和连接到它的设备的配置和当前状态。 要更改控制器配置,它通过服务器进程的 RESTful API 接口发送 JSON 格式的控制命令。
服务器进程
服务器进程 - 执行构成智能家居基础的信息处理自动化的所有主要工作的关键组件:接收和处理传感数据,根据嵌入式逻辑发出控制操作。 服务器进程的目的是与智能家居设备交互,执行生产逻辑规则,接收和处理来自图形界面和云端的命令。 所考虑的智能家居控制器中的服务器进程是作为用 C++ 开发的多线程应用程序实现的,并作为单独的服务启动 systemd 操作系统 Linux树莓派.
服务器进程的主要块是:
- 消息管理器;
- 网络摄像机服务器;
- Z-Wave 设备服务器;
- 产生式逻辑规则服务器;
- 控制器配置数据库和逻辑规则块;
- 用于与图形界面交互的RESTful API服务器;
- 用于与云交互的 MQTT 客户端。
服务器进程块被实现为单独的线程,它们之间的信息以 JSON 格式的消息(或在进程内存中表示此格式的数据结构)的形式传输。
服务器进程的主要组成部分是 消息管理器,它将 JSON 消息路由到所有服务器进程块。 JSON消息信息字段的类型及其可以接受的值如下表所示:
设备类型
协议
消息类型
设备状态
命令
相机
ONVIF
传感器数据
on
流媒体(开/关)
传感器
波波
命令
折扣
录音(开/关)
效应
MQTT
业务逻辑规则
流媒体(开/关)
设备(添加/删除)
商业逻辑
配置数据
录音(开/关)
蓝牙
设备状态
错误
无线上网
rf
例如,来自摄像机运动检测器的消息如下所示:
{
"vendor": "*****",
"version": "3.0.0",
"timestampMs": "1566293475475",
"clientType": "gateway",
"deviceId": "1616453d-30cd-44b7-9bf0-************",
"deviceType": "camera",
"protocol": "onvif",
"messageType": "sensorData",
"sensorType": "camera",
"label": "motionDetector",
"sensorData": "on"
}
生产逻辑
为了从调度程序接收或发送消息,服务器进程块订阅某种类型的消息。 订阅是该类型的生产逻辑规则 “如果……那么……”,以 JSON 格式呈现,以及指向服务器进程块内的消息处理程序的链接。 例如,要允许网络摄像机服务器接收来自GUI和云端的命令,您需要添加以下规则:
{
"if": {
"and": [{
"equal": {
"deviceId": "1616453d-30cd-44b7-9bf0-************"
}
},
{
"equal": {
"messageType": "command"
}
}
]
},
"then": {
"result": "true"
}
}
如果指定的条件 先行词 (左)规则成立,则满足 结果 (右侧)规则,处理程序可以访问 JSON 消息的正文。 先行词支持比较 JSON 键值对的逻辑运算符:
- 等于“等于”;
- 不等于“not_equal”;
- 少“少”;
- 更“伟大”;
- 小于或等于“less_or_equal”;
- 大于或等于“greater_or_equal”。
比较结果可以使用布尔代数运算符相互关联:
- 还有“和”
- 或“或”;
- 不是这样的”。
因此,通过用波兰表示法编写运算符和操作数,您可以使用大量参数创建相当复杂的条件。
生产逻辑服务器块中使用完全相同的机制,基于 JSON 消息和 JSON 格式的生产规则,来表示知识并使用来自智能家居传感器的传感数据进行逻辑推理。
用户使用移动应用程序创建智能家居应运行的场景。 例如: “如果打开前门的传感器被触发,则打开走廊的灯”。 应用程序从数据库中读取传感器(开门传感器)和执行器(智能插座或智能灯)的标识符,并生成JSON格式的逻辑规则,发送到智能家居控制器。 该机制将在我们系列的第三篇文章中更详细地讨论,其中我们将讨论用于管理智能家居的客户端应用程序。
上面讨论的生产逻辑机制是使用该库实现的
void CRuleEngine::Process(PProperties pFact)
{
m_pActions->clear();
rapidjson::Reader reader;
for(TStringMap::value_type& rRule : m_Rules)
{
std::string sRuleId = rRule.first;
std::string sRuleBody = rRule.second;
CRuleHandler ruleHandler(pFact);
rapidjson::StringStream ruleStream(sRuleBody.c_str());
rapidjson::ParseResult parseResult = reader.Parse(ruleStream, ruleHandler);
if(!parseResult)
{
m_Logger.LogMessage(
NLogger2::ePriorityLevelError,
std::string("JSON parse error"),
"CRuleEngine::Process()",
std::string("RuleId: ") + sRuleId);
}
PProperties pAction = ruleHandler.GetAction();
if(pAction)
{
pAction->Set("ruleId", sRuleId);
m_pActions->push_back(pAction);
}
}
}
这是 事实 — 包含 JSON 消息中的键值对的结构, m_规则 — 产生式规则的字符串数组。 传入消息与产生规则的比较在函数中进行 reader.Parse(ruleStream,ruleHandler)哪里 规则处理器 是一个包含布尔和比较运算符逻辑的对象。 规则ID — 唯一的规则标识符,通过它可以在智能家居控制器数据库内存储和编辑规则。 m_pActions — 包含逻辑推理结果的数组:包含来自规则库的结果的 JSON 消息,并进一步发送到消息管理器,以便订阅者线程可以处理它们。
RapidJSON 性能与函数相当 字符串(),并且最低的系统资源要求允许在嵌入式设备中使用该库。 使用 JSON 格式的消息和逻辑规则允许您在智能家居控制器的所有组件之间实现灵活的信息交换系统。
Z-Wave 传感器和执行器
智能家居的主要优点是可以独立测量外部环境的各种参数,并根据情况执行有用的功能。 为此,传感器和执行器连接到智能家居控制器。 在当前版本中,这些是使用该协议运行的无线设备
现在,您可以在市场上找到相当多不同的 Z-Wave 设备。 让我们看几个例子:
- Zipato PAN16智能插座可以测量电网中的以下参数:用电量(kWh)、功率(W)、电压(V)和电流(A)。 它还具有内置开关,您可以通过它控制所连接的电器;
- Neo Coolcam 泄漏传感器通过关闭远程探头的触点来检测是否存在溢出液体;
- 当烟雾颗粒进入气体分析仪室时,Zipato PH-PSG01烟雾传感器被触发;
- Neo Coolcam 运动传感器分析人体的红外辐射。 另外还有一个光传感器(Lx);
- 多传感器 Philio PST02-A 测量温度 (°C)、光线 (%)、开门情况、房间内是否有人;
- Z-Wave USB Stick ZME E UZB1 网络控制器,连接传感器。
设备和控制器以相同的频率运行非常重要,否则它们在连接时根本看不到对方。 一个 Z-Wave 网络控制器最多可连接 232 个设备,这对于一间公寓或乡村别墅来说已经足够了。 为了扩大室内的网络覆盖范围,可以使用智能插座作为信号中继器。
在上一段讨论的智能家居控制器服务器流程中,Z-Wave 服务器负责与 Z-Wave 设备交互。 它使用库从传感器接收信息
{
"vendor": "*****",
"version": "3.0.0",
"timestampMs": "1566479791290",
"clientType": "gateway",
"deviceId": "20873eb0-dd5e-4213-a175-************",
"deviceType": "sensor",
"protocol": "zwave",
"messageType": "sensorData",
"homeId": "0xefa0cfa7",
"nodeId": "20",
"sensorType": "METER",
"label": "Voltage",
"sensorData": "229.3",
"units": "V"
}
然后它被转发到服务器进程的消息管理器,以便订阅者线程可以接收它。 主要订阅者是生产逻辑服务器,它匹配逻辑规则的前因中的消息字段值。 包含控制命令的推理结果被发送回消息管理器,并从那里转到 Z-Wave 服务器,该服务器对它们进行解码并将其发送到 Z-Wave 网络 USB 控制器。 然后它们进入执行器,改变环境物体的状态,智能家居从而执行有用的工作。
连接 Z-Wave 设备是在智能家居控制器的图形界面中完成的。 为此,请转到包含设备列表的页面,然后单击“添加”按钮。 通过 RESTful API 接口的添加命令进入服务器进程,然后由消息管理器发送到 Z-Wave 服务器,这将 Z-Wave 网络 USB 控制器置于添加设备的特殊模式。 接下来,在 Z-Wave 设备上,您需要连续快速按下服务按钮(3 秒内按下 1,5 次)。 USB 控制器将设备连接到网络,并将有关设备的信息发送到 Z-Wave 服务器。 反过来,这会使用新设备的参数在 SQLite 数据库中创建一个新条目。 在指定的时间间隔后,图形界面返回到 Z-Wave 设备列表页面,从数据库中读取信息并在列表中显示新设备。 每个设备都会收到自己的唯一标识符,该标识符用于生产推理规则以及在云中工作时。 该算法的操作如UML图所示:
连接网络摄像机
本文讨论的云智能家居系统是云视频监控系统的升级版,也是由作者开发的,该系统已经上市几年,在俄罗斯有很多安装。
对于云视频监控系统来说,最严重的问题之一是可集成的设备选择有限。 负责连接到云端的软件安装在摄像机内部,这立即对其硬件(处理器和可用内存量)提出了严格的要求。 这主要解释了云闭路电视摄像机与普通网络摄像机相比价格较高的原因。 此外,需要与闭路电视摄像机制造公司进行漫长的谈判才能获得摄像机文件系统和所有必要的开发工具。
另一方面,所有现代 IP 摄像机都具有与其他设备(特别是录像机)交互的标准协议。 因此,使用通过标准协议连接并将视频流从 IP 摄像机广播到云端的单独控制器为云视频监控系统提供了显着的竞争优势。 此外,如果客户已经安装了基于简单IP摄像机的视频监控系统,那么就可以对其进行扩展,将其变成一个成熟的云智能家居。
IP 视频监控系统最流行的协议是,现在所有 IP 摄像机制造商都无一例外地支持
$ wsdl2h -o onvif.h
https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
https://www.onvif.org/ver10/events/wsdl/event.wsdl
https://www.onvif.org/ver10/media/wsdl/media.wsdl
https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl
$ soapcpp2 -Cwvbj -c++11 -d cpp_files/onvif -i onvif.h
结果,我们得到了一组 C++ 头文件“*.h”和源文件“*.cpp”,它们可以直接放入应用程序或单独的库中,并使用 GCC 编译器进行编译。 由于函数较多,代码量较大,需要额外优化。 Raspberry Pi 3 B+型微机具有足够的性能来执行此代码,但如果需要将代码移植到其他平台,则需要选择正确的处理器架构和系统资源。
支持 ONVIF 标准的 IP 摄像机在本地网络上运行时,会连接到一个特殊的组播组,其地址为 239.255.255.250。 有一个协议
智能家居控制器的图形界面用PHP实现了IP摄像机的搜索功能,在通过XML消息与Web服务交互时非常方便。 选择菜单项时 设备 > IP 摄像机 > 扫描 启动搜索网络摄像机的算法,以表格的形式显示结果:
将相机添加到控制器时,您可以指定相机与云交互的设置。 同样在这个阶段,它会自动分配一个唯一的设备标识符,以后可以在云中轻松识别它。
接下来,会生成一条 JSON 格式的消息,其中包含添加的摄像头的所有参数,并通过 RESTful API 命令发送到智能家居控制器的服务器进程,其中摄像头参数被解码并保存在内部 SQLite 数据库中,并在还用于启动以下处理线程:
- 建立RTSP连接以接收视频和音频流;
- 对 G.711 mu-Law、G.711 A-Law、G.723 等格式的音频进行转码。 AAC 格式;
- H.264格式的视频流和AAC格式的音频转码为FLV容器并通过RTMP协议传输到云端;
- 通过ONVIF协议与IP摄像机运动探测器的端点建立连接并定期轮询;
- 定期生成缩略图预览图像并通过MQTT协议发送到云端;
- 将视频和音频流以 MP4 格式的单独文件的形式本地记录到智能家居控制器的 SD 或闪存卡上。
为了与摄像机建立连接,在服务器进程中转码、处理和记录视频流,使用库中的函数
在性能测试实验中,控制器连接了3个摄像头:
- HiWatch DS-I114W(分辨率 - 720p,压缩格式 - H.264,比特率 - 1 Mb/s,声音 G.711 mu-Law);
- Microdigital MDC-M6290FTD-1(分辨率 - 1080p,压缩格式 - H.264,比特率 - 1 Mb/s,无声音);
- 大华 DH-IPC-HDW4231EMP-AS-0360B(分辨率 - 1080p,压缩格式 - H.264,比特率 - 1.5 Mb/s,AAC 音频)。
所有三个流同时输出到云端,仅从一台摄像机进行音频转码,并且禁用本地存档录制。 CPU 负载约为 5%,RAM 使用量为 32 MB(每个进程)、56 MB(包括操作系统在内的总计)。
因此,大约20-30个摄像头可以连接到智能家居控制器(取决于分辨率和比特率),这对于三层小屋或小型仓库的视频监控系统来说已经足够了。 对于需要更高性能的任务,您可以使用配备多核 Intel 处理器和 Linux Debian Sarge 操作系统的上网本。 目前该控制器正在试运行,性能数据将会更新。
与云交互
基于云的智能家居将用户数据(视频和传感器测量结果)存储在云中。 云存储的架构将在我们系列的下一篇文章中更详细地讨论。 现在我们来谈谈从智能家居控制器向云端传输信息消息的接口。
连接设备的状态和传感器测量结果通过协议传输
- QoS 0 - 最多一次(无交付保证);
- QoS 1 - 至少一次(有送达确认);
- QoS 2 - 恰好一次(带有额外的传送确认)。
在我们的例子中,我们使用
为了传输有关智能家居控制器状态的消息,使用保存消息的机制
MQTT客户端是基于库实现开发的
H.264+AAC媒体流通过RTMP协议发送到云端,由一组媒体服务器负责处理和存储。 为了优化集群中的负载分配并选择负载最小的媒体服务器,智能家居控制器向云负载均衡器发出初步请求,然后才发送媒体流。
结论
本文研究了一种基于Raspberry Pi 3 B+微型计算机的智能家居控制器的具体实现,该控制器可以通过Z-Wave协议接收、处理信息和控制设备,通过ONVIF协议与IP摄像机交互,还可以交换数据和数据。通过 MQTT 和 RTMP 协议与云服务进行命令。 基于逻辑规则和以 JSON 格式呈现的事实的比较,开发了生产逻辑引擎。
该智能家居控制器目前正在莫斯科及莫斯科地区的多个地点进行试运行。
下一版本的控制器计划连接其他类型的设备(RF、蓝牙、WiFi、有线)。 为了方便用户,连接传感器和网络摄像机的程序将转移到移动应用程序中。 还有优化服务器进程代码和将软件移植到操作系统的想法
来源: habr.com