
如今,由於微電子、通訊管道、網路技術和人工智慧的快速發展,智慧家庭的話題變得越來越重要。 自石器時代以來,人類的住房發生了重大變化,進入工業革命4.0和物聯網時代,變得舒適、實用和安全。 市場上出現的解決方案可以將公寓或鄉村別墅變成複雜的資訊系統,可以使用智慧型手機在世界任何地方進行控制。 此外,人機互動不再需要程式語言知識——借助語音辨識和合成演算法,人們可以用母語與智慧家庭對話。
目前市場上的一些智慧家庭系統是雲端視訊監控系統的邏輯發展,其開發人員意識到不僅需要監控,還需要管理遠端物件的全面解決方案。
我們向您呈現一系列三篇文章,其中將向您介紹由作者親自開發並投入運行的雲端智慧家庭系統的所有主要組件。 第一篇文章專門介紹安裝在智慧家庭內的終端客戶端設備,第二篇文章介紹雲端儲存和資料處理系統的架構,最後,第三篇文章介紹用於管理行動和固定設備上的系統的客戶端應用程式。
智慧家庭設備
首先,我們來談談如何將普通公寓、別墅或別墅打造為智慧家庭。 為此,通常需要在家中放置以下設備:
- 測量外部環境各種參數的感測器;
- 作用於外部物體的執行器;
- 控制器根據感測器測量值和嵌入式邏輯執行計算,並向執行器發出命令。
下圖是一個智慧家庭示意圖,浴室有漏水感測器(1),臥室有溫度感測器(2)和照明感測器(3),廚房有智慧插座(4),還有一個智慧家庭。走廊上的視訊監控攝影機(5)。

目前,使用 RF433、Z-Wave、ZigBee、藍牙和 WiFi 協定操作的無線感測器已廣泛應用。 它們的主要優點是易於安裝和使用,以及低成本和可靠性,因為製造商正在努力將他們的設備推向大眾市場,並使普通用戶能夠使用它們。
通常,感測器和執行器透過無線介面連接到智慧家庭控制器 (6),這是一種專用微型計算機,可將所有這些設備組合到一個網路中並對其進行控制。
然而,一些解決方案可以同時組合感測器、執行器和控制器。 例如,智慧插頭可以編程為根據時間表打開或關閉,雲端視訊監控攝影機可以根據運動偵測器訊號錄製影片。 在最簡單的情況下,您可以不需要單獨的控制器,但要建立具有多種場景的靈活系統,這是必要的。
為了將智慧家庭控制器連接到全球網絡,可以使用常規的互聯網路由器(7),這早已成為任何家庭中的常見家用電器。 這裡還有一個支持智慧家庭控制器的論點——如果與互聯網的連接丟失,智慧家庭將繼續正常運行,這要歸功於儲存在控制器內部而不是雲端服務中的邏輯塊。
智慧家庭控制器
本文討論的雲端智慧家庭系統控制器是基於單板微電腦開發的 於2018年53月發布,有足夠的資源和效能來完成智慧家庭任務。 它包括基於 64 位元 ARMv8-A 架構的四核心 Cortex-A1.4 處理器,主頻為 1 GHz,以及 802.11 GB RAM、Wi-Fi 4.2ac、藍牙 2.0 和透過 USB XNUMX 運行的千兆位元乙太網路適配器。

控制器的組裝非常簡單- 將微型電腦(1) 安裝在塑膠盒(2) 中,然後將帶有軟體的microSD 格式的8 GB 記憶卡(3) 和USB Z-Wave 網路控制器(4) 安裝在塑膠盒(5) 中。對應的插槽。 智慧家庭控制器透過 2.1V、5A 電源轉接器 (6) 和 USB - micro-USB 連接線 (XNUMX) 連接到電源。 每個控制器都有一個獨特的識別號,該標識號在首次啟動時寫入設定檔中,是與雲端智慧家庭服務互動所必需的。
智慧家庭控制器軟體是本文作者基於作業系統開發的 Linux 覆盆子彈力。 它由以下主要子系統組成:
- 與智慧家庭設備和雲端互動的伺服器進程;
- 用於設定控制器的配置和操作參數的圖形使用者介面;
- 用於儲存控制器配置的資料庫。

數據庫 基於嵌入式DBMS實現智慧家庭控制器 是具有系統軟體的 SD 卡上的檔案。 它用作控制器配置的儲存 - 有關所連接設備及其當前狀態的資訊、邏輯產生規則塊以及需要索引的資訊(例如,本機視訊存檔的檔案名稱)。 當控制器重新啟動時,該資訊將被保存,以便在發生電源故障時恢復控制器。
圖形使用者介面 使用微框架在 PHP 7 中開發的智慧家庭控制器 。 Web 伺服器負責執行應用程式。 ,由於其良好的性能和低資源需求而經常用於嵌入式設備。
(點擊圖片放大看)
圖形介面的主要功能是將智慧家庭設備(IP監視攝影機和感測器)連接到控制器。 Web 應用程式從 SQLite 資料庫讀取控制器和連接到它的裝置的配置和目前狀態。 若要變更控制器配置,它會透過伺服器程序的 RESTful API 介面傳送 JSON 格式的控制命令。
伺服器進程
伺服器進程 - 執行構成智慧家庭基礎的自動化資訊處理的所有主要工作的關鍵組件:接收和處理感測數據,根據嵌入式邏輯發出控制操作。 伺服器進程的目的是與智慧家庭設備交互,執行生產邏輯規則,接收和處理來自圖形介面和雲端的命令。 所考慮的智慧家庭控制器中的伺服器進程是作為用 C++ 開發的多執行緒應用程式實現的,並作為單獨的服務啟動 systemd 操作系統 Linux Raspbian.
伺服器進程的主要區塊是:
- 訊息管理器;
- 網路攝影機伺服器;
- Z-Wave 設備伺服器;
- 產生式邏輯規則伺服器;
- 控制器配置資料庫和邏輯規則塊;
- 用於與圖形介面互動的RESTful API伺服器;
- 用於與雲端互動的 MQTT 用戶端。
伺服器進程區塊實作為單獨的線程,它們之間的資訊以 JSON 格式的訊息(或在進程記憶體中表示此格式的資料結構)的形式傳輸。

伺服器進程的主要組成部分是 訊息管理器,它將 JSON 訊息路由到所有伺服器進程塊。 JSON訊息資訊欄位的類型及其可以接受的值如下表所示:
設備類型
協議
訊息類型
設備狀態
命令
相機
Onvif
感測器數據
on
串流媒體(開/關)
傳感器
波波
命令
off
錄音(開/關)
效應
MQTT
業務邏輯規則
串流媒體(開/關)
設備(新增/刪除)
商業邏輯
配置數據
錄音(開/關)
藍牙
設備狀態
error
無線上網
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格式的邏輯規則,發送到智慧家庭控制器。 該機制將在我們系列的第三篇文章中更詳細地討論,其中我們將討論用於管理智慧家庭的客戶端應用程式。
上面討論的生產邏輯機制是使用該庫實現的 — 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);
}
}
}
這裡 事實 — 包含 JSON 訊息中的鍵值對的結構, m_規則 — 產生式規則的字串陣列。 傳入訊息與產生規則的比較在函數中進行 reader.Parse(ruleStream,ruleHandler)哪裡 規則處理器 是一個包含布林和比較運算子邏輯的物件。 規則ID — 唯一的規則標識符,透過它可以在智慧家庭控制器資料庫內儲存和編輯規則。 m_pActions — 包含邏輯推理結果的陣列:包含來自規則庫的結果的 JSON 訊息,並進一步傳送到訊息管理器,以便訂閱者執行緒可以處理它們。
RapidJSON 效能與函數相當 strlen(),並且最低的系統資源需求允許在嵌入式設備中使用該庫。 使用 JSON 格式的訊息和邏輯規則可讓您在智慧家庭控制器的所有元件之間實現靈活的資訊交換系統。
Z-Wave 感知器和執行器
智慧家庭的主要優點是可以獨立測量外部環境的各種參數,並根據情況執行有用的功能。 為此,感測器和執行器連接到智慧家庭控制器。 在當前版本中,這些是使用該協定運行的無線設備 在專門分配的頻率上 869 MHz 對於俄羅斯。 為了運行,它們被組合成一個網狀網絡,其中包含訊號中繼器以增加覆蓋範圍。 這些設備還具有特殊的節能模式——它們大部分時間都處於睡眠模式,僅在狀態變化時才發送訊息,這可以顯著延長內建電池的使用壽命。

現在,您可以在市場上找到相當多不同的 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 裝置互動。 它使用庫從感測器接收訊息 用 C++ 編寫,它提供了與 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 網路 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 攝影機製造商都無一例外地支持 ,其規範存在於 Web 服務描述語言中 。 使用工具包中的實用程式 可以為與 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 或快閃卡上。

為了與攝影機建立連接,在伺服器進程中轉碼、處理和記錄視訊串流,使用庫中的函數 4.1.0
在性能測試實驗中,控制器連接了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個攝影機(具體數量取決於解析度和位元率),這足以滿足三層住宅或小型倉庫的視訊監控系統需求。對於需要更高效能的任務,可以使用配備多核心英特爾處理器和作業系統的迷你電腦。 Linux Debian 薩奇。控制器目前正在進行試運行,性能數據將會更新。
與雲端交互
基於雲端的智慧家庭將用戶資料(視訊和感測器測量結果)儲存在雲端。 雲端儲存的架構將在我們系列的下一篇文章中更詳細地討論。 現在讓我們來談談從智慧家庭控制器向雲端傳輸訊息訊息的介面。
連接設備的狀態和感測器測量結果透過協定傳輸 ,由於其簡單性和能源效率而經常用於物聯網專案。 MQTT 使用客戶端-伺服器模型,其中客戶端訂閱代理內的特定主題並發布其訊息。 代理根據 QoS(服務品質)等級所確定的規則向所有訂閱者發送訊息:
- QoS 0 - 最多一次(無交貨保證);
- QoS 1 - 至少一次(有送達確認);
- QoS 2 - 恰好一次(有額外的傳送確認)。
在我們的例子中,我們使用 。 主題名稱是智慧家庭控制器的唯一識別。 伺服器進程內的 MQTT 用戶端訂閱該主題並將來自訊息管理器的 JSON 訊息轉換為該主題。 相反,來自 MQTT 代理的消息被轉發到訊息管理器,然後訊息管理器將它們多路復用到伺服器進程內的訂閱者:

為了傳輸有關智慧家庭控制器狀態的消息,使用保存訊息的機制 MQTT 協議。 這使您可以在電源故障期間正確監控重新連接的時間。
MQTT客戶端是基於庫實現開發的 在C++語言中。
H.264+AAC媒體串流透過RTMP協定傳送到雲端,由一組媒體伺服器負責處理和儲存。 為了優化叢集中的負載分配並選擇負載最小的媒體伺服器,智慧家庭控制器向雲端負載平衡器發出初步請求,然後才發送媒體串流。
結論
本文研究了一種基於Raspberry Pi 3 B+微型電腦的智慧家庭控制器的具體實現,該控制器可以透過Z-Wave協定接收、處理資訊和控制設備,透過ONVIF協定與IP攝影機交互,還可以交換數據和資料。透過 MQTT 和 RTMP 協定與雲端服務發送命令。 基於邏輯規則和以 JSON 格式呈現的事實的比較,開發了生產邏輯引擎。
此智慧家庭控制器目前正在莫斯科及莫斯科地區的多個地點進行試運行。
下一版本的控制器則計劃連接其他類型的裝置(RF、藍牙、WiFi、有線)。 為了方便用戶,連接感測器和網路攝影機的程式將轉移到行動應用程式中。 還有優化伺服器進程代碼和將軟體移植到作業系統的想法 。 這將使您節省單獨的控制器,並將智慧家庭的功能轉移到普通的家用路由器。
來源: www.habr.com
