Homebridge源码解读

Homebridge源码解读

前言

手上有一个esp8266的模块,想用这个和苹果手机的Siri结合做一些高级的硬件。在网上看到的都是Homebridge的用法。在看过Homebridge的源码后,现在在这里总结一下这个库的大体结构。

HomeBridge源码地址:

https://github.com/nfarina/homebridge

HAP-NodeJS库

要了解Homebridge这个库,就要说一个HAP-NodeJS库了,因为Homebridge实际上是对这个库进行了一下封装。苹果硬件真实的接口api部分都在HAP-NodeJS库里,这是高手反相抓取苹果UDP消息分析得到的一个HomeKit协议库,HAP就是"苹果HomeKit协议"的英文缩写.

HAP-NodeJS源码地址:

https://github.com/KhaosT/HAP-NodeJS

github上的readme上有说明,可以在

https://github.com/KhaosT/HAP-NodeJS/blob/master/lib/gen/HomeKitTypes.js

查看所有的硬件设备特性定义,这里对所有特征(Characteristic)的方法和属性作了定义。比如灯,空调,风扇,温度计,湿度计,空气质量,一氧化碳,二氧化碳,门。。。等等设置的状态或者操作都做了定义,也对交互时的数据类型做了定义。

bonjour-hap库

在HAP-NodeJS库中用到了一个UDP库,在网上查了一下,这个bonjour-hap库是mDNS协议的实现,低层使用的是UDP协议,主要用与局域网中设备之间通过mDNS相互发现对方,当IOS手机打开HomeKit之后,首先应该会在居于网中广播询问是否有提供homeKit服务的设备,而HAP-NodeJS的功能就是用来提供这个mDNS服务器的网络设备,现在一般给智能家用设备的这个管理服务器叫家居网关。其实这是一个mDNS服务器。

Event事件监听

在HAP-NodeJS中有一个Service.js的文件,这里是有几个方法,会有Homebridge中用到,一个是

Service.prototype.getCharacteristic = function (name)
{

//...

}

这个是添加新的硬件特性的接口,所有的便件特性都在上边说的HomeKitTypes.js中定义好了。而这个Characteristic其实是一个继承自events.EventEmitter的对象。这个事件监听对象有两个方法一个是on(),一个是emit().相当于一个观察者设计模式,来用分发消息用的。

当手机端有请求时,就会调用这个Characteristic的.on('get',func)方法,而我们写Homebrdage扩展插件时,其实就是实现这个func的方法,这个方法有一个erro和一个callback的参数。在func中我们直接给硬件设备发送消息,硬件设备返回后,我们调用callback的回调函数,把硬件设备返回的信息发送给HAP-NodeJS的Advertiser对象,由这个对象把消息通过bonjour-hap的UDP协议发送给手机上的HomeKit。

Accessory传感器和Platform平台对象

编写Homebridge插件主要就是定义这个Accessory传感器的物理特征(Characteristic)处理逻辑.传感器通过lib/api.js中的

API.prototype.registerAccessory = function(pluginName, accessoryName, constructor, configurationRequestHandler) {

//...
}

方法来在homebridge中注册硬件传感器。homebridge中除了传咸器定义外,还有Platform(平台)方式一次注册很多传感器。

API.prototype.registerPlatform = function(pluginName, platformName, constructor, dynamic) {

//...

}

但对于config.json文件来说,总的传感器类型还是都在HomeKitTypes.js中定义好的那些种类,只是用户可以在插件中自行组合。

你可能感兴趣的:(Homebridge源码解读)