使用homebridge-mqtt對接設備到HomeKit

本文作者:樑中琪,廣州大樹信息技術有限公司嵌入式開發工程師,擅長單片機和Python開發。
本文爲CSDN約稿文章,版權所有,轉載請微信聯繫jiaweidi1214
關注物聯網領域,投稿或有報道需求請郵件聯繫[email protected]

Homebridge簡介

Homebridge 是一個輕量級 Node.js 服務器,用 NodeJS 模擬了一個HomeKit Accessory Server,可以在家庭網絡上模擬iOS HomeKit API運行。

Homebridge 逆向了 HomeKit 協議,讓普通的 Wi-Fi 設備也能接入 HomeKit ,從而通過 Siri 控制。

Homebridge 的作者 KhaosT 是個在美留學的中國人,曾在蘋果的 HomeKit 團隊實習過。據說當 KhaosT 逆向 HomeKit 之後寫了篇博客,但由於涉及到商業機密被蘋果法務要求刪除文章,好在代碼已經早就 fork 開了所以代碼才得以流傳到現在。試想要是當初代碼沒有開源,恐怕我們現在還享受不到這一成果呢。

根據 Homebridge 文檔,Homebridge可以運行在Linux、Windows和macOS等系統,那麼,這裏的測試平臺就以樹莓派爲例。

Homebridge-mqtt

Homebridge-mqtt是Homebridge一個動態插件。它以MVC模式設計。Homebridge-mqtt允許你通過mqtt API添加和控制配件,進而通過蘋果的HomeKit應用控制這些設備。

安裝
Homebridge的安裝需要npm,樹莓派下安裝npm有點麻煩,這裏就不詳細描述。安裝好npm後只需按順序輸入下面語句即可安裝homebridge及其相關依賴包。

sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
cd /usr/local/lib/node_modules/homebridge/
sudo npm install --unsafe-perm bignum
cd /usr/local/lib/node_modules/hap-nodejs/node_modules/mdns
sudo node-gyp BUILDTYPE=Release rebuild

接下來可以安裝homebridge-mqtt了。

npm install -g homebridge-mqtt

配置
在樹莓派上,Homebridge 的配置主要是編輯「/home/pi/.homebridge」下的「config.json」文件。下面是homebridge-mqtt 配置示例。

{
"bridge": {
"name": "Homebridge",
"username": "12:34:56:78:90:AB",
"port": 38960,
"pin": "123-45-678"
},
    "platforms": [{
 "platform": "mqtt",
    "name": "mqtt",
    "url": "mqtt://127.0.0.1",
    "port": 61613,
    "topic_type": "multiple",
    "topic_prefix": "homebridge",
    "username": "admin",
    "password": "password",
    "cert": "/path/to/certificate.pem",
    "key": "path/to/key.pem",
    "ca": "/path/to/ca_certificate.pem"
}]
}

其中,與 homebridge 配置相關的是 bridge 字段。name 表示 homebridge 要在 HomeKit 顯示的名稱;username 一般是本地主機的 MAC 地址;port 是使用的端口;pin 則是 HomeKit 配對的時候,需要輸入的 pin 碼。homebridge-mqtt 配置字段的含義,則參考下表。

圖片描述
表1 homebridge-mqtt 配置字段含義

如果需要添加其他platform,就在「platforms」數組字段裏繼續添加json即可。

啓動
控制檯啓動 homebridge 很簡單,直接輸入「homebridge」即可。如果需要指定配置文件路徑,可以使用「-U」參數。例如:「homebridge -U ~/.homebridge」

Homebridge-mqtt的接口

Homebridge-mqtt通過MQTT提供接口(mqtt API),這些接口表徵爲mqtt的主題。我們可以通過這些主題做一些操作,比如添加配件或獲取配件信息等等,當消息發佈後 Homebridge-mqtt 會通過response主題發佈消息作爲響應。其實這一點非常類似於HTTP的請求/響應的思想,只不過是以MQTT的方式實現,一點也不難理解。部分mqtt API參見下表:

圖片描述
表2 Homebridge-mqtt部分mqtt API

主題中有「to」字符的,表示這個主題是給我們發佈消息使用,帶有「from」字符的,表示我們需要訂閱使用。mqtt API的負荷(Payload)採用JSON格式。

衆所周知,數據庫常用的操作就是增刪查改。那麼對 Homebridge 這個「網關」也是一樣的思路。首先我們需要給Homebridge添加設備,這樣我們纔可以查詢設備的數據,或者發送一個請求改變設備的數值,最後如果不需要設備了可以移除該設備。
在 mqtt API 中,增加操作有「添加配件」和「添加服務」,刪除操作有「移除配件」和「移除服務」。如果用戶端需要查詢設備狀態,那麼可以使用

「homebridge/to/get」主題發佈消息。實際上當我們從鎖屏界面打開 HomeKit ,Homebridge 網關都會發送一條攜帶了設備狀態信息的 homebridge/to/get 主題消息。

支持的service

添加配件是需要一個明確的 service,service 和蘋果的HomeKit有對應的關係。比如如果service 選擇了 Lightbulb,HomeKit 裏會也會顯示一個燈泡??的圖標。下表是 Homebridge-mqtt 支持的部分 service。

圖片描述
表3 Homebridge-mqtt支持的部分service

應用實例

下面是一些Homebridge-mqtt的實例。

添加配件
如果要添加配件,可以發佈下面的消息:

topic: homebridge/to/add
payload: {"name": "flex_lamp", "service_name": "light", "service": "Switch"}

之後相關主題會做出下面的響應:

topic: homebridge/from/response
payload: {"ack": true, "message": "accessory 'flex_lamp' service_name 'light' is added."}

在發佈消息的字段中,配件是根據 name 字段的不同來區分的,相同 name 不能重複添加。service_name 字段是設置默認出現在 HomeKit 裏設備名稱。service 字段上節已經說明。

移除配件

topic: homebridge/to/remove
payload: {"name": "flex_lamp"}

查詢配件

topic: homebridge/to/get
payload: {"name": "flex_lamp"}

如果需要查詢所有配件,可以給name字段換爲星號(*)。

topic: homebridge/to/get
payload: {"name": "*"}

Homebridge操作設備
如下圖,Homebridge可以理解爲轉發網關,使用MQTT連接一個MQTT服務器(MQTT Broker),通過MQTT服務器對設備端進行操作。

圖片描述
圖1 設備對接Homebridge-mqtt架構

在設備端,我們需要訂閱「homebridge/from/set」主題,表示數據從(from)Homebridge出發,到達(set)訂閱該主題的設備。此時,Homebridge類似於C/S架構中的client,設備端爲server。

topic: homebridge/from/set
payload: {"name": "flex_lamp", "service_name": "light", "characteristic": "On", "value": true}

其中 characteristic 可以理解爲特性或屬性, 其根據 service 的不同而不同。一般來說,具有開關功能的 service (比如Switch、Lightbulb和Fan)都會帶有「On」的 characteristic ,「On」的 value 字段只能是布爾值。而像窗戶(Window)和窗簾(WindowCovering)這類 service, 可以在一個數值範圍內設置開啓的大小,當然這需要設備在物理層次上的支持。

Homebridge獲取設備數據
如果Homebridge需要獲取設備數據,可以使用「homebridge/to/set」主題。更準確地說,是其他設備主動設置值到Homebridge。此時,設備端類似於client,Homebridge爲server。

控燈設備把狀態發送Homebridge。

topic: homebridge/to/set
payload: {"name": "flex_lamp", "service_name": "light","characteristic": "On", "value": true}

像溫度/溼度/光照傳感器這類 service ,其本身不能被操作,但可以把數據發送到 Homebridge,它們 characteristic 字段根據 service 類型的不同而不同,所攜帶的 value 一般都是整型。

測溫設備把溫度發送到 Homebridge。

topic: homebridge/to/set
payload: {"name": "room_temp", "service_name": "temperature", "characteristic": "CurrentTemperature", "value": 26}

圖片描述
HomeKit組圖

圖1HomeKit界面,圖2添加配件,圖3輸入pin,圖4識別配件,圖5配件狀態,圖6打開light,圖7添加溫度傳感器,圖8light配件詳情。

總結

當然,筆者後來思考了一下 Homebridge-mqtt 是否可以實現設備聯動和第三方應用端的對接。

所謂設備聯動,在Homebridge-Assistant中也稱爲家庭自動化。比如,如果檢測到房間有人並且溫度超過30度,可以自動關閉窗戶並打開空調。由於沒有在Homebridge-mqtt看到相關接口,所以要在 Homebridge-mqtt 實現設備聯動功能恐怕有點困難。當然其實我們可能並不需要 Homebridge-mqtt,只需要MQTT服務器就可以了。我們可以自定義一些MQTT主題(topic),然後某些設備達到某條件後可以發佈消息,另外一些設備訂閱這些主題即可實現聯動。

同理,第三方應用端控制設備同樣也可以不通過 Homebridge-mqtt 接口,最簡單的IoT架構就是APP+MQTT+Device。需要思考的是設備狀態變化後如何通知Homebridge,在應用端或者設備端調用 Homebridge-mqtt 接口估計都是可以選擇的方案。

至少,Homebridge-mqtt 把「讓設備可以通過MQTT協議和Homebridge對接,並可以通過HomeKit進行控制」這一重要的功能已經實現了。如果需要更多功能,還得自己動手擴展。

圖片描述

發佈了171 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章