原理
米家App可以创建桌面快捷方式。如果创建手动触发的场景,例如关闭插座,然后将该场景发送到桌面快捷方式。点击桌面快捷方式就会执行关闭插座的操作。
当我们点击桌面快捷方式时,其实就是发送Intent(有Android开发经验的应该会知道),也就是说米家会根据Intent中携带的数据来触发相应的场景
通过Tasker构造与桌面快捷方式一样的Intent,然后发送该Intent,就会触发相应的场景,其效果与点击桌面快捷方式一样。
分析Intent具体传输的数据,并构造Tasker Intent任务
这里就不展开说明。我就简单说一下我的做法。
- 开启手机全局调试(手机已root,并安装了Magisk)
adb shell "su -c 'magisk resetprop ro.debuggable 1'" adb shell "su -c 'stop'" && adb shell "su -c 'start'"
- 使用AndroidStudio的Profile来跟踪并记录函数调用
点击开始记录,然后点击米家的桌面快捷方式,停止记录。得到下图的函数调用栈
- 反编译米家apk,根据上图分析执行逻辑。重点查看intent处理
我使用的是jadx-gui 导出 Gradle项目,直接用AndroidStudio来查看的。关键部分截图
然后使用AndroidStudio断点调试onCreate函数(因为反编译的源码与字节码行号不匹配,所以直接断点函数)。得到如下图
这样我们就知道Intent的组成了
extra 部分有三个key value
extra_scene_account=12xxxxxx,
extra_scene_id=10xxxxxx,
extra_str_scene_id=10xxxxxx
action = com.xiaomi.smarthome.scene.smarthomelauncher
分析后发现其实extra_scene_id已经不需要了,取而代之的是extra_str_scene_id - 编写Tasker任务
测试一下,完美触发
如何更加便捷的获取extra_scene_account和 extra_str_scene_id?
虽然我们已经用Tasker触发了场景,但是我们总不可能每次都这样调试来获取相关参数吧?当然不可能这样来获取了。这些数据我们完全可以通过抓包来获取。如何抓包呢?这个就让大家自己研究研究了。 这里推荐使用HttpCanary。根据HttpCanary使用手册来学习如何抓包吧。配合使用VirtualXposed可以在7.0以上的手机上避免因为抓包软件证书安装在用户目录导致证书不被信任的问题,并且手机不需要root。 root的手机最一劳永逸的方法就是将证书从用户证书目录移动到系统证书目录。
开启抓包后,在米家App的 智能–>我的 页面下拉刷新触发场景拉取,然后停止抓包。在抓到包后查看下面的url的请求,我就不截图了。
POST /app/scene/list h2
Host: api.io.mi.com
总结
好了,至此我们就实现了通过Tasker来触发米家中的场景。可以愉快的玩耍了!!!