峯言凬语 O ever youthful O ever weeping~
本无意与众不同,怎奈何口味太重。
首页
平水韵
颜色表
ABOUT
文章分类
友情链接
您正在查看: Digi 分类下的文章

EBODY277.jpg
通信协议
绿米局域网通信协议API有两个互不兼容的版本:

绿米局域网通信协议1.X,最新版本为1.1.1(2017.12.21)。
绿米局域网通信协议2.X,最新版本为2.0.1(2018.05.18)。

绿米1.X协议设备类型及对应model:
小米多功能网关:gateway
米家多功能网关升级版:gateway.v3
米家窗磁传感器:magnet
米家人体传感器:motion
米家无线开关传感器:switch
米家智能插座:plug
Aqara 86单火开关单键:ctrl_neutral1
Aqara 86单火开关双键:ctrl_neutral2
Aqara 86无线开关单键:86sw1
Aqara 86无线开关双键:86sw2
米家温湿度传感器:sensor_ht
米家魔方传感器:cube
Aqara窗帘:curtain
Aqara 86零火墙壁开关单键:ctrl_ln1、ctrl_ln1.aq1
Aqara 86零火墙壁开关双键:ctrl_ln2、ctrl_ln2.aq1
Aqara 墙壁插座:86plug、ctrl_86plug.aq1
米家天然气报警器:natgas
米家烟雾报警器:smoke
Aqara门磁传感器:sensor_magnet.aq2
Aqara人体照度传感器:sensor_motion.aq2
Aqara无线开关传感器:sensor_switch.aq2
Aqara温湿度气压传感器:weather.v1
Aqara水浸传感器:sensor_wleak.aq1
Aqara门锁:lock.aq1

绿米2.X协议设备类型及对应model:
Aqara空调伴侣升级版:acpartner.v3
智能插座:plug
墙壁插座:ctrl_86plug、ctrl_86plug.aq1
墙壁开关(零火单键):ctrl_ln1、ctrl_ln1.aq1
墙壁开关(零火双键):ctrl_ln2
墙壁开关(单火单键):ctrl_neutral1
墙壁开关(单火双键):ctrl_neutral2
窗帘电机:curtain
双路控制器:lumi.ctrl_dualchn
门窗传感器:sensor_magnet.aq2
人体传感器:sensor_motion.aq2
温湿度传感器:weather
水浸传感器:sensor_wleak.aq1
无线开关:sensor_switch.aq2
无线开关(升级版):sensor_switch.aq3
86无线开关单键:sensor_86sw1.aq1
86无线开关双键:sensor_86sw2.aq1
魔方传感器:sensor_cube.aqgl01

不支持任何局域网通信协议的设备对应model:
Aqara空调伴侣:acpartner.v1
米家空调伴侣:acpartner.v2

注意事项:
固件决定了是否支持哪个协议。
开启局域网通信协议并拥有该网关的KEY才能与该网关进行局域网完全通信。
有些设备3个表中都没有给出,一般属于支持1.X的设备,也可能不支持任何协议。
唯一支持2.X协议的网关是Aqara空调伴侣升级版(方形),小米多功能网关/米家多功能网关升级版均为1.X协议。
Aqara魔方传感器仅能接入Aqara空调伴侣升级版才能使用局域网协议控制。

发现设备
服务器发现网关(全文默认以2.X协议为例):

服务器向局域网发送UDP组播报文(IP:224.0.0.50,端口:4321),内容为

{"cmd":"whois"}

即【服务器>>组播(224.0.0.50:4321){"cmd":"whois"}】下写法同理。
网关收到信息后通过UDP单播报文回复服务器:
【网关>>单播($Host:4321){"cmd":"report",...}】
report的具体内容举例:

{
"cmd":"iam",
"ip":"192.168.0.42",   //网关IP地址
"protocal":"UDP",
"port":"9898",
"model":"gateway.aq1",  //网关设备类型
......
}

服务器查询网关设备

【服务器>>单播($Hub:9898){"cmd":"discovery"}】
【网关>>单播($Host:9898){"cmd":"discovery_rsp",...}】
discovery_rsp具体内容举例:

{
"cmd":"discovery_rsp",
"sid":"158d323123c9d9",     //sid为网关did
"token":"TahkC7dalbIhXG22",    //网关生成的随机字符串
"dev_list":[{"sid":"158d0000f1a750","model":"plug"},  
           {"sid":"158d00010fd645","model":"sensor_switch.aq2"}]  //sid为子设备did
}

注意:“token”为网关生成的随机字符串,每10s刷新一次,在未收到设备心跳上报的token前,用户可用此token来生成写设备时的“key”。

设备查询上报

当设备状态发生变化时,【网关>>组播(224.0.0.50:9898){"cmd":"report",...}】
report具体内容举例:

{
"cmd":"report",
"model":"sensor_magnet.aq2",
"sid":"158d0000123456",
"params":[{"window_status":"open"}] 
}

设备心跳上报

网关心跳上报

网关每10秒钟发送一次心跳报文,用来告诉服务器网关正常工作。若间隔65s以上未收到心跳包即表示网关处于离线状态。网关设备心跳格式如下:
【网关>>组播(224.0.0.50:9898){"cmd":"heartbeat",...}】

heartbeat具体内容举例:

{
"cmd":"heartbeat",
"model":"gateway.v3",
"sid":"f0b429b3c9d965",
"token":"1234567890abcdef",   //网关生成的随机字符串
"params":[{"ip":"172.22.4.130"}]  //网关IP地址
}

子设备心跳上报

    子设备通过心跳告诉PC:子设备正常工作(心跳上报频率:睡眠设备是每60分钟一次,插电设备是每10分钟一次)。子设备心跳格式如下:
    【网关>>组播(224.0.0.50:9898){"cmd":"heartbeat",...}】
heartbeat具体内容举例:

{
"cmd":"heartbeat",
"model":"sensor_magnet.aq2",
"sid":"158d000065a271",
"params":[{"window_status":"open"}]
}

AES-CBC 128加密

开启局域网通信协议后,服务器可以获取网关信息(接收网关上报、回应信息,对网关进行读操作),但无法控制网关(对网关进行写操作)。
要对网关及其下属设备进行管理和控制,必须拥有该网关的KEY,我把它叫做网关KEY。网关KEY可在APP上取得,为16个字节长度的字符串。
网关KEY并非直接用于控制网关,而是作为加密的密钥。服务器收到网关心跳“heartbeat”里的16个字节的“token”字符串之后,使用网关KEY对token的字符串进行AES-CBC 128加密,生成16个字节的密文,再转换为32字节的ASCII码,这才是通讯时用到的工作KEY。
AES-CBC 128初始向量定义为:unsigned char const AES_KEY_IV[16] = {0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58, 0x56, 0x2e}。
1.6 设备读写操作

读设备
服务器向网关发送读命令,网关向服务器回复读取结果。

【服务器>>单播($Hub:9898){"cmd":"read",...}】
read具体内容举例:

{
"cmd":"read",
"sid":"158d0000123456"   //墙壁开关did
}

【网关>>单播($Host:9898){"cmd":"read_rsp",...}】
read_rsp具体内容举例:

{
"cmd":"read",
"sid":"158d0000123456"   //墙壁开关did
}
{
"cmd":"write_rsp",
"model":"ctrl_neutral1",
"sid":"158d0000123456",
"params":[{"channel_0":"on"}]  
}

写设备
服务器向网关发送写命令,网关向服务器发送回复,表示知悉。

【服务器>>单播($Hub:9898){"cmd":"write",...}】
write具体内容举例:

{
"cmd":"write",
"model":"ctrl_neutral1",
"sid":"158d0000123456",
"key":"3EB43E37C20AFF4C5872CC0D04D81314",
"params":[{"channel_0":"off"}]
}

【网关>>单播($Host:9898){"cmd":"write_rsp",...}】
write_rsp具体内容举例:

{
"cmd":"write_rsp",
"model":"ctrl_neutral1",
"sid":"158d0000123456",
"params":[{"channel_0":"on"}]  
}

该“write_rsp”只代表网关收到了write命令,params里的属性状态为当前的设备最新状态,不是write之后的最终设备状态。最终的设备状态靠report报文进行上报。

nh014.png
不同账号可下载的软件不同,可以尝试下载Shadowrocket(小火箭),Quantumult,Kitsunebi,Pepi (ShadowRay),i2ray,Potatso Lite 任意一个即可。

在AppStore软件里面登录账号
美区 apple id 账号:if580123@icloud.com
美区 apple id 密码:Aa2211
更新时间: 20200202
注意:请勿使用此账号登录iCloud,只登录蓝色AppStore下载应用,切记不可以在设置里面登录使用! 并且下载完一定要退出账号,不然会导致自己icloud被锁,手机变砖!

https://github.com/shadowrocketHelp/help/wiki/%E5%9B%BD%E5%A4%96-appstore-id-%E8%B4%A6%E5%8F%B7%E5%88%86%E4%BA%AB

在线/越狱安装
不推荐,使用在线/越狱安装,可能会安装后闪退无法使用APP。

nh004.png
文件地址:
/system/usr/keylayout/AVRCP.kl

修改方法:
可用keytest.apk来侦测按键映射动作,取得code,然后文件修改,重启即可。

nh017.png
Google,TikTok等锁区应用会检测手机的如下信息进行服务锁定纠正:
gsm.sim.operator.numeric
gsm.operator.numeric
gsm.sim.operator.iso-country
gsm.operator.iso-country
gsm.sim.operator.alpha
gsm.operator.alpha

其中需要修改的SIM Card信息:
gsm.sim.operator.alpha "AT&T" #修改运营商为AT&T,若使用eMobile则是"eMobile"。
gsm.sim.operator.iso-country "us" #修改SIM卡国家为US,日本则是"jp"。
gsm.sim.operator.numeric "310090" #修改为AT&T市场代码310090,若eMobile的市场代码则是"44000"

修改方法:
Android ROOT后,安装终端程序,比如Termux或者TerminalEmulator,然后运行如下命令:
su
setprop gsm.sim.operator.alpha "AT&T"
setprop gsm.sim.operator.iso-country "us"
setprop gsm.sim.operator.numeric "310090"

恢复方法:
重启手机,重新插拔SIM卡。

Linux或Mac首次运行Android Studio,报如下的错误:

ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.
platforms;android-25 Android SDK Platform 25
build-tools;28.0.2 Android SDK Build-Tools 28.0.2
To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html
...

错误提示没有接受Licence,在widnows下不存在这种报错,因为在点击"下一步"的过程中勾选了"I Agree",Linux和Mac下需要切换到SDK的Tools文件夹下,执行:

$ cd /home/xiaotang/Android/Sdk/tools/bin
$ ./sdkmanager --licenses

然后一路Y。

Warning: File /home/xiaotang/.android/repositories.cfg could not be loaded.
5 of 5 SDK package licenses not accepted. 100% Computing updates...
Review licenses that have not been accepted (y/N)? y

1/5: License android-googletv-license:

Terms and Conditions

...

Accept? (y/N): y
All SDK package licenses accepted