本帖最后由 asdnasiudn 于 2022-9-12 21:51 编辑
第三篇: 小爱控制美的空调(blinker集成) 完
==================================
先对上篇帖子有些坛友提出的问题回复一下:
有说申请遥控的,这确实是一种解决方法,但是我更想在不增加物理实体的情况下完成功能,后面会把代码放到GitHub,是纯代码实现的与小爱交互.
有说红外模拟的,我这个空调不支持红外,只能蓝牙,wifi(小程序和app,小程序我也分析了,但是需要wx.login返回的code,就没搞了)
有说用homeAssistant的,不是一个生态体系的
================================================================
好,接上篇 小爱控制美的空调(美的美居app 分析) 一
我们获取到了 loginId,可以正式开始 模拟登录了.
同样我们先观察一下 请求的 header 和body
可以看到 header 没什么变化,只有trace 变化了,这个不重要,主要是body体变化了
[Java] 纯文本查看 复制代码 {"iotData":{"appVersion":"8.9.0","clientType":1,"deviceId":"***","iampwd":"***","iotAppId":"900","loginAccount":"***","password":"***","reqId":"97a5d7b8021142218a82afb104d6c4dc","stamp":"20220904113353"},"data":{"appKey":"46579c15","appVersion":"8.9.0","deviceId":"***","deviceName":"Xiaomi MI 9","osVersion":"11","platform":2},"stamp":"20220904113353","timestamp":"20220904113353","reqId":"62a1609db2c6427c844d26eeed9e89ff"}
可以看到我们只要找到这几个关键的参数即可:
1. deviceId: 看着就是设备id,一般随机字符即可
2.iampwd 应该和密码相关
3.password 加密后的秘密
4.loginAccount : 没啥好说的,手机号
5.appKey : 固定的,因为每次都一样
所以这里最关键的就是 password 和 iampwd 这两个参数是怎么加密出来的
直接看源码
[Java] 纯文本查看 复制代码
public final Observable<MasRsp<LoginRspData>> passwordLogin(String str, String str2, String loginId, String str3) {
Intrinsics.checkNotNullParameter(loginId, "loginId");
LoginLogTrackHelper.INSTANCE.addTrackerMethod("passwordLogin");
Object m717as = api.passwordLogin(getTrackHeaders(), RequestUtils.INSTANCE.createBody(new CommonReqData(getLoginMucData(), new IotData(null, null, null, "900", str, null, SecurityUtils.encodeSHA256(loginId + SecurityUtils.encodeSHA256(str2) + HttpUtil.IOT_KEY), null, SecurityUtils.encodeMD5(SecurityUtils.encodeMD5(str2)), null, null, 1, str3, LoginParamsUtil.INSTANCE.getAppVersion(), LoginParamsUtil.INSTANCE.getDeviceId(), null, null, null, null, null, null, null, null, null, 16746151, null), null, 4, null))).m717as(LoginApiService$passwordLogin$1.INSTANCE);
Intrinsics.checkNotNullExpressionValue(m717as, "api.passwordLogin(\n … )\n }");
return (Observable) m717as;
}
可以看出
[Java] 纯文本查看 复制代码 SecurityUtils.encodeSHA256(loginId + SecurityUtils.encodeSHA256(str2) + HttpUtil.IOT_KEY)
这个就是 password
[Java] 纯文本查看 复制代码 SecurityUtils.encodeMD5(SecurityUtils.encodeMD5(str2))
这个是 iampwd
loginId 没啥好说的 就是 我们在第一个接口获取到的返回值
HttpUtil.IOT_KEY 和上篇一样 把搜索到的值 decode 一下才能用
那么到此我们登陆就完成了,下面 开始抓取 开关空调的接口
我们记下 登陆接口返回的accessToken, 后面主要是利用这个操作空调
我们点击这个开关按钮
即可观察到空调打开,同时 charles 中可以看到相关接口
请求体
[Java] 纯文本查看 复制代码 {"stamp":"20220904123831","power":true,"reqId":"85142bc6d9804ac88ab2485b9c041087"}
可以看到 这个接口主要就是多了一个请求头: accessToken,即登录接口返回的
但是url 里面还有一串sn 码,表示空调的唯一标识,即你要操作的空调.
这里我先写死,后面会在代码里面进行匹配
请求体中的 "power":true 即表示打开空调, "power":false 表示 关闭空调.
最简单的开关就完成了.至于温度/模式这些功能的控制 在另外一个接口中,参数比较复杂, sign 签名发方式也不一样,暂时未分析完.
示例代码入下:
那么我们对于美的美居的分析暂时到这就完了,下一步就开始正式接入小爱.
|