根据这个就可以使用iphone控制灯与开关.
折腾了3个晚上,终于将homebridge安装好,安装之前需要安装一堆的库,比如node.js运行环境等,因为网上资料大部分都是在树莓派上面运行,我是直接在ubuntu上面进行的测试,因为安装会有所区别,但是安装好之后就一样了,安装方法在此我就不写了,后面补上,这里我主要写homebridge-aqara与网关的通信协议,可以使用一个linux程序,windows程序或者单片机作为网关,网关必须能连接到局域网,我测试使用的是一个VC++编写的windows程序.
上一个homebridge正常工作的截图
在使用homebridge-aqara插件之前我尝试过几个别的,都没能成功,主要是我对js一点都不懂,但是homebridge-aqara这个插件比较简单,通过代码就可以看出json结构,加上测试,就把几个常用的设备的协议给弄出来了,方便大家自己玩,可以不用依赖什么小米路由器之类的网关了,听说小米也是使用这个插件的.
1.修改配置文件(路径 /home/用户名/.homebridge/)
{"bridge": {"name": "Homebridge","username": "00:0C:29:E1:25:B2","port": 51826,"pin": "123-45-678"},"platforms": [
{"platform": "AqaraPlatform","sid":["6409802da3ca"],"password":["1234567812345678"]
}]
}
"pin": "123-45-678" 类似一个配对码,可以按照这个格式任意修改,仅限数字,端口就不要修改了
<pre name="code" class="plain">"sid":["6409802da3ca"],
"password":["1234567812345678"]sid与密码可以按照这个格式修改,但是密码长度必须是16位,否则可能会报密码长度错误,这2个后面网关程序中会使用到.
</pre><p></p><pre>
2.homebridge是个桥梁,上边与iphone的homekit通信,下边通过aqara插件与第三方的网关通信.
1.homebridge首先会发送广播数据{"cmd": "whois"}2.设备收到后响应{
"cmd": "iam",
"ip": "10.254.1.100",
"port": "4321"
}3.homebridge 发送请求设备列表{"cmd":"get_id_list"}4.设备响应传感器列表
{"cmd": "get_id_list_ack","sid": "6409802da3ca","token": "1234567812345678","data": "[\"11\",\"12\",\"15\",\"16\"]"
}5.homebridge会对每个设备进行读取
{"cmd":"read", "sid":"11"}6.设备响应数据
//温湿度
{"cmd": "return_read","model": "sensor_ht","sid": "11","data": "{\"temperature\": 2500,\"humidity\": 6501}"
}//插座
{"cmd": "return_read","model": "plug","sid": "12","data": "{\"status\": \"on\"}"
}//照明开关
{"cmd": "return_read","model": "ctrl_neutral1","sid": "15","data": "{\"channel_0\": \"on\"}"
}//网关心跳包
{"cmd": "heartbeat","model": "gateway","sid": "6409802da3ca","token": "1234567812345678"
}//控制插座下发的数据
{"cmd": "write","model": "plug","sid": "12","data": "{\"status\":\"off\", \"key\": \"bbf5624a816f7f2702512d6c1cd55e53\"}"
}//控制灯后状态需要立即更新,否则会退出
{"cmd": "write","model": "ctrl_neutral1","sid": "15","data": "{\"channel_0\":\"off\", \"key\": \"bbf5624a816f7f2702512d6c1cd55e53\"}"
}
3.homebridge-aqara使用的是组播,在局域网比较方便,无需建立连接,并且通信协议简单.
在homebridge-aqara源代码 AqaraPlatform.js最上面可以看到端口与组播信息.
const dgram = require('dgram');
const inherits = require('util').inherits;
const crypto = require('crypto');
const iv = Buffer.from([0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58, 0x56, 0x2e]);
const serverSocket = dgram.createSocket('udp4');
const multicastAddress = '224.0.0.50';
const multicastPort = 4321;
const serverPort = 9898;
var AqaraAccessoryFactory;
iv:这个是通信用于加密的明文.
multicastAddress:组播地址
multicastPort:组播端口没什么用
serverPort = 9898 这个端口比较重要,用于与homebridge-aqara通信的端口,网关可以使用任意端口与这个端口建立UDP连接即可通信.
4.协议说明
这里的协议仅限于网关与homebridge-aqara通信的协议,网关与传感器的通信协议大家可以任意自定义,比如我的网关使用433与底层传感器通信,协议采用modbus-RTU协议.
下面是我自己做的一些控制用的硬件
USB串口转433模块(采用STM32+A7139无线通信模块)
RGB灯带驱动,同样STM32+A7139 ,采用1000V12A MOSFET,可惜homebridge-aqara不支持调色调亮度功能,好在homebridge_yeelight支持,后面需要再研究研究.
12V/24V低压控制板,同样保留3个通道,PWM驱动
淘宝上买的5元外壳,内部同样STM32+A7139/WIFI ,1路10A继电器控制
之所以都自己做是因为家里刚装修,预留了很多灯位,想自己做个简单智能家居,并且自己做的协议自己定,不用依赖厂家,刚好IOS的homekit被黑客破解发到网上变为开源接口了,所以手机APP都不用做了,直接用,还挺方便的.
iso上面homekit效果
后面将这个部署到嵌入式linux中,购买了一个57元的全志的核心板,比树莓派便宜不少
只有3x3cm比较小巧.
5.homebridge-aqara的小bug
在使用过程中,特别是控制灯的时候,如果状态没有及时更新,homebridge-aqara会崩溃,在源码AqaraPlatform.js中搜索 Value not changed, do nothing
// Dont' send duplicate command out.if (this.lastValue == on) {platform.log.debug("Value not changed, do nothing");return;}var platform = this.platform;var password = platform.passwords[this.deviceSid];
很明显是platform没有赋值,先使用了导致log为空,产生异常崩溃了,将var platform = this.platform;赋值移动到上面即可
var platform = this.platform;if (this.lastValue == on) {platform.log.debug("Value not changed, do nothing");return;}var password = platform.passwords[this.deviceSid];
在iphone唤醒后立即控制灯,此时网关可能接收不到数据,我的做法是1秒钟网关发送一次心跳包,这样可以立即更新链接信息,防止出现数据无法接收问题.
6.测试网关程序
串口就是433模块,用于与底层传感器通信,端口就是连接homebridge-aqara,使用json通信
可以看到通信协议,homebridge-aqara发送给网关控制灯,以及读取设备信息.
7.相关连接,大家可以看看
http://bbs.feng.com/forum.php?mod=viewthread&tid=10857822&extra=page=1&filter=typeid&typeid=912&typeid=912
http://www.tuicool.com/articles/uM3q2yR
http://forum.yeelight.com/t/homebridge-plugin/83/13