云智能家居。 第1部分:控制器和传感器



如今,由于微电子技术,通信渠道,互联网技术和人工智能的迅猛发展,智能家居的话题变得越来越重要。 自从石器时代和工业革命4.0时代以来,人类的住所发生了重大变化,物联网变得方便,实用且安全。 市场上出现的解决方案将公寓或乡间别墅变成复杂的信息系统,可以使用智能手机在世界任何地方进行管理。 而且,人机交互不再需要编程语言的知识-由于有了语音识别和语音合成算法,一个人就能在智能家居中说母语。

当前市场上的一些智能家居系统是基于云的视频监视系统的逻辑开发,其开发人员意识到不仅需要用于监视而且还需要用于管理远程对象的全面解决方案。

我们为您提供了三篇文章系列,将向您介绍由作者亲自开发并投入运行的云智能家居系统的所有主要组件。 第一篇文章专门介绍安装在智能家居中的终端客户端设备,第二篇文章介绍云存储和数据处理系统的体系结构,最后第三篇文章介绍用于在移动和固定设备上管理系统的客户端应用程序。

智能家居设备


首先,让我们谈谈如何用普通的公寓,小屋或小屋打造智能家居。 为此,通常需要在家庭中放置以下设备:

  1. 传感器测量各种环境参数;
  2. 致动器作用于外部物体;
  3. 控制器根据传感器的测量值和嵌入式逻辑执行计算,并向执行器发出命令。

下图显示了智能家居的示意图,在智能家居上有用于漏水的传感器(1),用于卧室的温度(2)和照明(3),用于厨房的智能插座(4)和用于走廊的视频监控摄像头(5)的传感器。



当前,在RF433,Z-Wave,ZigBee,蓝牙和WiFi协议下运行的无线传感器已被广泛使用。 它们的主要优点是易于安装和使用,以及低成本和高可靠性,因为 制造商试图将其设备推向大众市场,并使普通用户可以使用它们。

通常,传感器和执行器通过无线接口连接到智能家居控制器(6),这是一台专用的微型计算机,它将所有这些设备集成到单个网络中并进行控制。

但是,某些解决方案可以同时组合传感器,执行器和控制器。 例如,可以对智能插座进行编程以按计划打开或关闭,而基于云的视频监控摄像机可以根据运动检测器信号记录视频。 在最简单的情况下,您可以不使用单独的控制器,但是要创建具有许多场景的灵活系统,这是必要的。

为了将智能家居控制器连接到全球网络,可以使用传统的Internet路由器(7),该路由器一直是任何家庭中熟悉的家用电器。 还有另一种观点支持智能家居控制器-如果失去与Internet的连接,由于存储在控制器内部而不是云服务中的逻辑块,智能家居将继续正常运行。

智能家居控制器


本文讨论的云智能家居系统控制器是在Raspberry Pi 3 B型+单板微型计算机的基础上开发的,该产品于2018年3月发布,具有足够的资源和性能来执行智能家居任务。 它包含一个具有64位ARMv8-A架构的主频为1.4 GHz的四核Cortex-A53处理器,以及1 GB的RAM,Wi-Fi 802.11ac,蓝牙4.2和一个可通过USB 2.0总线工作的千兆以太网适配器。



组装控制器非常简单-将微型计算机(1)安装在塑料外壳(2)中,然后将8 GB带有软件的microSD卡(3)和USB Z-Wave网络控制器(4)插入其相应的插槽中。 智能家居控制器通过5V,2.1A(5)电源适配器和USB-micro-USB电缆(6)连接到电源。 每个控制器都有一个唯一的标识号,该标识号在第一次启动时记录在配置文件中,对于与云智能家居服务进行交互是必需的。

智能家居控制器软件是由本文的作者基于Linux Raspbian Stretch操作系统开发的。 它由以下主要子系统组成:

  • 与智能家居设备和云交互的服务器进程;
  • 图形用户界面,用于配置控制器和操作参数;
  • 用于存储控制器配置的数据库。



智能家居控制器的数据库基于嵌入式SQLite DBMS,是带有系统软件的SD卡上的文件。 它用作控制器配置的存储库-有关已连接设备及其当前状态的信息,逻辑生产规则的块以及需要索引的信息(例如,本地视频档案的文件名)。 重新启动控制器后,将保存此信息,以便在断电时恢复控制器。

智能家居控制器的图形界面是使用Slim微框架在PHP 7中开发的。 lighttpd Web服务器由于其良好的性能和较低的资源需求而经常在嵌入式设备中使用,它负责应用程序的运行。


(单击图片以更高的分辨率打开)

图形界面的主要功能是将智能家居设备(IP摄像机和传感器)连接到控制器。 该Web应用程序从SQLite数据库读取控制器和与其连接的设备的配置和当前状态。 要更改控制器的配置,它通过服务器进程的RESTful API以JSON格式发送控制命令。

服务器进程


服务器进程是关键组成部分,它完成了自动化信息流程的所有基本工作,这些信息流程构成了智能家居的基础:接收和处理感官数据,根据底层逻辑发出控制措施。 服务器过程的目的是与智能家居设备进行交互,遵循生产逻辑规则,从图形界面和云中接收和处理命令。 该智能家居控制器中的服务器进程实现为用C ++开发的多线程应用程序,并作为Linux Raspbian操作系统的独立systemd服务启动。

服务器进程的主要模块是:

  1. 讯息管理员
  2. IP摄像机服务器;
  3. Z-Wave设备服务器;
  4. 服务器生产逻辑规则;
  5. 控制器配置数据库和逻辑规则块;
  6. RESTful API服务器,用于与图形界面进行交互;
  7. MQTT客户端,用于与云交互。

服务器进程的块被实现为单独的流,其间的信息以JSON格式的消息形式(或在进程存储器中表示此格式的数据结构)传输。



服务器进程的主要组件是消息管理器 ,该消息管理器以JSON格式为服务器进程的所有块路由消息。 下表列出了JSON消息信息字段的类型及其可以接受的值:

deviceType协议messageTypedeviceState命令
摄影机OnvifsensorData流式传输(开/关)
感应器zwave命令录制(开/关)
效应子mqtt业务逻辑规则流式传输(开/关)服务(添加/删除)
商业逻辑configurationData录制(开/关)
蓝牙deviceState错误
无线网络
射频


例如,来自摄像机运动检测器的消息如下所示:

{ "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格式的“ If ... then ...”类型的生产逻辑规则,并且是服务器进程块内消息处理程序的链接。 例如,为了使IP摄像机服务器可以从GUI和云接收命令,您需要添加以下规则:

 { "if": { "and": [{ "equal": { "deviceId": "1616453d-30cd-44b7-9bf0-************" } }, { "equal": { "messageType": "command" } } ] }, "then": { "result": "true" } } 

如果规则的前提条件(左侧)中指定的条件为true,则将执行规则的规则 (右侧),并且处理程序可以访问JSON消息的主体。 前提条件支持执行JSON键值对比较的逻辑运算符:

  1. 等于“等于”;
  2. 不等于“ not_equal”;
  3. 少“少”;
  4. 更“伟大”;
  5. 小于或等于“ less_or_equal”;
  6. 大于或等于Greater_or_equal。

可以使用布尔代数的运算符将比较结果链接在一起:

  1. 和“和”;
  2. 或“或”;
  3. 不是“不是”。

因此,用波兰语表示法写操作符和操作数,就可能形成带有大量参数的相当复杂的条件。

生产逻辑服务器块中使用基于JSON消息和JSON格式的生产规则的完全相同的机制来表示知识,并使用来自智能家居传感器的感测数据进行逻辑推理。

用户使用移动应用程序编写脚本,智能家居应根据这些脚本运行。 例如: “如果用于打开前门的传感器起作用,则打开走廊中的灯 该应用程序从数据库中读取传感器(打开传感器)和执行器(智能插座或智能灯)的标识符,并生成JSON格式的逻辑规则,并将其发送到智能家居控制器。 在本系列的第三篇文章中将更详细地讨论这种机制,我们将在此讨论用于管理智能家居的客户端应用程序。

上面讨论的生产逻辑机制是使用RapidJSON库(C ++中JSON格式的SAX解析器)实现的。 一致地读取和解析一系列生产规则,可以轻松地在先例中实现数据匹配功能:

 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); } } } 

这里的pFact是一个包含来自JSON消息的键值对的结构, m_Rules是生产规则的字符串数组。 传入消息和生产规则的比较在reader.Parse(ruleStream,ruleHandler)函数中执行 ,其中ruleHandler是包含布尔运算符和比较运算符逻辑的对象。 sRuleId是唯一的规则标识符,因此,可以在智能家居控制器的数据库内部存储和编辑规则。 m_pActions-具有逻辑推断结果的数组:JSON消息,包含来自规则库的一致性,并转发到消息管理器,以便订阅者流可以对其进行处理。

RapidJSON的性能与strlen()函数相当,并且最低的系统资源要求允许该库在嵌入式设备中使用。 通过使用JSON格式的消息和逻辑规则,您可以在智能家居控制器的所有组件之间实施灵活的信息交换系统。

传感器和执行器Z-Wave


智能家居的主要优点是它可以独立测量各种环境参数并根据情况执行有用的功能。 为此,将传感器和执行器连接到智能家居控制器。 在当前版本中,这些无线设备是根据Z-Wave协议在俄罗斯特别分配的869 MHz频率下运行的。 对于它们的工作,它们被组合成一个网状网络,其中存在信号中继器以增加覆盖范围。 这些设备还具有特殊的节能模式-它们大部分时间都处于睡眠模式,并且仅在状态改变时才发送信息,这可以显着延长内置电池的寿命。



现在,在市场上您可以找到相当多的不同Z-Wave设备。 例如,考虑一些:

  1. Zipato PAN16智能插座可以测量以下参数:电源中的功耗(kW / h),功率(W),电压(V)和电流(A)。 它还具有内置开关,您可以使用该开关控制连接的电器。
  2. Neo Coolcam泄漏传感器通过闭合远程探头的触点来检测是否存在溢出的液体;
  3. 当烟雾颗粒进入气体分析仪腔室时,将触发Zipato PH-PSG01烟雾探测器。
  4. Neo Coolcam运动传感器分析来自人体的红外辐射。 另外还有一个光传感器(Lx);
  5. Philio PST02-A多功能传感器可测量温度(°C),光线暴露(%),门的开度,房间中是否有人。
  6. 连接传感器的Z-Wave USB Stick ZME E UZB1网络控制器。

设备和控制器以相同的频率工作非常重要,否则,它们在连接时不会相互看到。 一个Z-Wave网络控制器最多可以连接232个设备,对于公寓或乡间别墅来说已经足够了。 为了扩大室内网络的覆盖范围,可以将智能插座用作信号中继器。



在上一段中讨论的智能家居控制器的服务器过程中,Z-Wave服务器负责与Z-Wave设备进行交互。 为了从传感器获取信息,他使用C ++中的OpenZWave库,该库提供了与Z-Wave网络的USB控制器进行交互的接口,并且可以与许多传感器和执行器一起使用。 Z-Wave服务器以JSON消息的形式记录传感器测量的环境参数的值:

 { "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服务器对其进行解码并将其发送到Z-Wave网络的USB控制器。 然后,它们落入执行设备中,该执行设备会更改环境状态,因此智能家居将发挥有用的作用。


(单击图片以更高的分辨率打开)

Z-Wave设备连接在智能家居控制器的图形界面中。 为此,请转到包含设备列表的页面,然后单击“添加”按钮。 通过RESTful API的添加命令进入服务器进程,然后由消息管理器发送到Z-Wave服务器,该服务器将Z-Wave USB控制器置于特殊设备添加模式。 接下来,在Z-Wave设备上,您需要快速按一下维修按钮(在1.5秒内进行3次按压)。 USB控制器将设备连接到网络,并将有关其的信息发送到Z-Wave服务器。 依次使用新设备的参数在SQLite数据库中创建新记录。 在预定的时间间隔后,图形界面将返回Z-Wave设备列表的页面,从数据库中读取信息并在列表中显示新设备。 同时,每个设备都会收到自己的唯一标识符,该标识符将在生产推断规则以及在云中工作时使用。 UML图中显示了该算法的操作:


(单击图片以更高的分辨率打开)

IP摄像机连接


本文讨论的云智能家居系统是作者开发的云视频监控系统的现代化,该系统已经投放市场了几年,并在俄罗斯有许多安装。

对于云视频监控系统,最严重的问题之一是可以进行集成的设备选择有限。 负责连接到云的软件安装在便携式摄像机内部,这立即对其硬件(处理器和可用内存量)提出了严格的要求。 这主要是因为与传统的IP摄像机相比,基于云的视频监控摄像机的价格更高。 此外,需要与CCTV摄像机制造商进行长时间的谈判才能访问摄像机文件系统和所有必要的开发工具。



另一方面,所有现代IP摄像机都具有用于与其他设备(特别是DVR)进行交互的标准协议。 因此,使用单独的控制器进行连接,该控制器使用标准协议进行连接并将视频流从IP摄像机流传输到云,这为云视频监视系统提供了明显的竞争优势。 此外,如果客户已经安装了基于简单IP摄像机的视频监控系统,则可以对其进行扩展并将其转变为成熟的多云智能家居。

目前,所有IP摄像机制造商都毫无例外地支持IP视频监视系统的最流行协议是ONVIF Profile S ,其规范存在于WSDL Web服务描述语言中。 使用gSOAP工具箱中的实用程序,可以生成使用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的特殊多播组。 有一个协议WS-Discovery ,它使您可以自动搜索LAN上的设备。

智能家居控制器的智能界面以PHP语言实现了IP摄像机的搜索功能,当通过XML消息与Web服务交互时,这非常方便。 选择菜单项“ 设备”>“ IP摄像机”>“扫描”时 ,将启动IP摄像机的搜索算法,并在表格中显示结果:


(单击图片以更高的分辨率打开)

将摄像机添加到控制器后,您可以指定与云进行交互的设置。 同样在此阶段,会自动为它分配一个唯一的设备标识符,以便将来在云中轻松识别它。



接下来,将以JSON格式生成一条消息,其中包含添加的摄像头的所有参数,并通过RESTful API命令将其发送到智能家居控制器的服务器进程,在此摄像头参数被解码并存储在内部SQLite数据库中,还用于启动以下处理线程:

  1. 建立RTSP连接以接收视频和音频流;
  2. 从G.711 mu-Law,G.711 A-Law,G.723等格式对音频进行转码 为AAC格式;
  3. 将H.264视频和AAC音频流转码为FLV容器,然后使用RTMP将其传输到云中;
  4. 通过ONVIF协议及其定期轮询与网络摄像机运动检测器的端点建立连接;
  5. 定期生成缩略图预览图像,并使用MQTT协议将其发送到云;
  6. 在智能家居控制器的SD或闪存卡上以MP4格式的单独文件的形式本地记录视频和音频流。



为了在服务器过程中与摄像机建立连接,进行代码转换,处理和记录视频流,使用了FFmpeg 4.1.0库中的功能。

在性能测试实验中,将3个摄像机连接到控制器:

  1. HiWatch DS-I114W(分辨率-720p,压缩格式-H.264,比特率-1 Mb / s,声音G.711 mu-Law);
  2. Microdigital MDC-M6290FTD-1(分辨率-1080p,压缩格式-H.264,比特率-1 Mb / s,无声音);
  3. 大华DH-IPC-HDW4231EMP-AS-0360B(分辨率-1080p,压缩格式-H.264,比特率-1.5 Mb / s,AAC声音)。



所有这三个流同时输出到云中,仅从一台摄像机执行声音转码,并且禁用了本地档案的记录。 CPU利用率约为5%,RAM利用率为32 MB(每个进程),56 MB(OS总计)。

因此,可以将大约20到30个摄像机(取决于分辨率和比特率)连接到智能家居控制器,这对于三层平房或小型仓库的视频监视系统而言已足够。 在需要高性能的任务中,您可以将nettop与Intel多核处理器和Linux Debian Sarge OS一起使用。 当前,控制器正在进行试运行,有关其性能的数据将得到更新。

云互动


云智能家居将用户数据(视频和传感器测量值)存储在云中。 我们系列的下一篇文章将更详细地讨论云存储架构。 现在,我们来讨论用于将信息消息从智能家居控制器传输到云的接口。

使用MQTT协议传输连接设备的状态和传感器测量值,该协议由于其简单性和能源效率而经常在物联网项目中使用。 当客户端在代理中订阅某些主题并发布其消息时,MQTT使用客户端-服务器模型。 代理根据QoS(服务质量)级别确定的规则将消息发送给所有订户:

  • QoS 0-最多一次(无交付保证);
  • QoS 1-至少一次(带有发送确认);
  • QoS 2-仅一次(带有附加的交付确认)。

在我们的例子中, Eclipse Mosquitto被用作MQTT代理。 主题名称是智能家居控制器的唯一标识符。 服务器进程内部的MQTT客户端订阅该主题,并将来自消息管理器的JSON消息转换为该主题。 相反,来自MQTT代理的消息在消息管理器中发送给它们,然后该消息管理器将它们多路复用到服务器进程中的订阅者:



为了传输有关智能家居控制器状态的消息,使用了MQTT协议的已保存消息保留消息机制。 这使您可以正确地监视电源故障期间的重新连接时刻。

MQTT客户端是基于C ++中Eclipse Paho库的实现开发的。

H.264 + AAC媒体流使用RTMP协议发送到云,其中媒体服务器集群负责它们的处理和存储。 为了在群集中最佳地分配负载并选择负载最少的媒体服务器,智能家居控制器向云负载均衡器发出初步请求,然后才发送媒体流。

结论


本文研究了基于Raspberry Pi 3 B +微计算机的智能家居控制器的一种特定实现,该控制器可以使用Z-Wave协议接收,处理信息和管理设备,使用ONVIF协议与IP摄像机进行交互,还可以与云交换数据和命令。 MQTT和RTMP协议服务。 基于逻辑规则和以JSON格式呈现的事实的比较,开发了生产逻辑引擎。

现在,智能家居控制器正在莫斯科和莫斯科地区的多家工厂进行试运行。

在控制器的下一版本中,计划连接其他类型的设备(RF,蓝牙,WiFi,有线)。 为了方便用户,连接传感器和IP摄像机的过程将转移到移动应用程序。 还有一些优化服务器进程代码并将软件移植到OpenWrt操作系统的想法。 这将节省单独的控制器,并将智能家居的功能转移到常规家用路由器。

Source: https://habr.com/ru/post/zh-CN467219/


All Articles