本文作者:樑中琪,廣州大樹信息技術有限公司嵌入式開發工程師,擅長單片機和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 配置字段的含義,則參考下表。
如果需要添加其他platform,就在「platforms」數組字段裏繼續添加json即可。
啓動
控制檯啓動 homebridge 很簡單,直接輸入「homebridge」即可。如果需要指定配置文件路徑,可以使用「-U」參數。例如:「homebridge -U ~/.homebridge」
Homebridge-mqtt的接口
Homebridge-mqtt通過MQTT提供接口(mqtt API),這些接口表徵爲mqtt的主題。我們可以通過這些主題做一些操作,比如添加配件或獲取配件信息等等,當消息發佈後 Homebridge-mqtt 會通過response主題發佈消息作爲響應。其實這一點非常類似於HTTP的請求/響應的思想,只不過是以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。
應用實例
下面是一些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服務器對設備端進行操作。
在設備端,我們需要訂閱「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}
圖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進行控制」這一重要的功能已經實現了。如果需要更多功能,還得自己動手擴展。