[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议

根据这个就可以使用iphone控制灯与开关.
折腾了3个晚上,终于将homebridge安装好,安装之前需要安装一堆的库,比如node.js运行环境等,因为网上资料大部分都是在树莓派上面运行,我是直接在ubuntu上面进行的测试,因为安装会有所区别,但是安装好之后就一样了,安装方法在此我就不写了,后面补上,这里我主要写homebridge-aqara与网关的通信协议,可以使用一个linux程序,windows程序或者单片机作为网关,网关必须能连接到局域网,我测试使用的是一个VC++编写的windows程序.

上一个homebridge正常工作的截图

[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第1张图片


在使用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" 类似一个配对码,可以按照这个格式任意修改,仅限数字,端口就不要修改了
"sid":["6409802da3ca"],
"password":["1234567812345678"]sid与密码可以按照这个格式修改,但是密码长度必须是16位,否则可能会报密码长度错误,这2个后面网关程序中会使用到.

 
  

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协议.

下面是我自己做的一些控制用的硬件

[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第2张图片

USB串口转433模块(采用STM32+A7139无线通信模块)


[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第3张图片

RGB灯带驱动,同样STM32+A7139 ,采用1000V12A MOSFET,可惜homebridge-aqara不支持调色调亮度功能,好在homebridge_yeelight支持,后面需要再研究研究.


[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第4张图片

12V/24V低压控制板,同样保留3个通道,PWM驱动


[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第5张图片

淘宝上买的5元外壳,内部同样STM32+A7139/WIFI ,1路10A继电器控制


之所以都自己做是因为家里刚装修,预留了很多灯位,想自己做个简单智能家居,并且自己做的协议自己定,不用依赖厂家,刚好IOS的homekit被黑客破解发到网上变为开源接口了,所以手机APP都不用做了,直接用,还挺方便的.


[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第6张图片

iso上面homekit效果

后面将这个部署到嵌入式linux中,购买了一个57元的全志的核心板,比树莓派便宜不少

[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第7张图片

只有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.测试网关程序

[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第8张图片

串口就是433模块,用于与底层传感器通信,端口就是连接homebridge-aqara,使用json通信


[第一步]homekit智能家居,homebridge与homebridge-aqara通信协议_第9张图片

可以看到通信协议,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

你可能感兴趣的:(homekit,homebridge,智能家居,通信协议,智能家居)