Tasker控制米家App

文章目录

  • 原理
  • 分析Intent具体传输的数据,并构造Tasker Intent任务
  • 如何更加便捷的获取extra_scene_account和 extra_str_scene_id?
  • 总结

原理

米家App可以创建桌面快捷方式。如果创建手动触发的场景,例如关闭插座,然后将该场景发送到桌面快捷方式。点击桌面快捷方式就会执行关闭插座的操作。

当我们点击桌面快捷方式时,其实就是发送Intent(有Android开发经验的应该会知道),也就是说米家会根据Intent中携带的数据来触发相应的场景

通过Tasker构造与桌面快捷方式一样的Intent,然后发送该Intent,就会触发相应的场景,其效果与点击桌面快捷方式一样。

分析Intent具体传输的数据,并构造Tasker Intent任务

这里就不展开说明。我就简单说一下我的做法。

  1. 开启手机全局调试(手机已root,并安装了Magisk)
    adb shell "su -c 'magisk resetprop ro.debuggable 1'"
    adb shell "su -c 'stop'" && adb shell "su -c 'start'"   
    
  2. 使用AndroidStudio的Profile来跟踪并记录函数调用
    点击开始记录,然后点击米家的桌面快捷方式,停止记录。得到下图的函数调用栈
    Tasker控制米家App_第1张图片
  3. 反编译米家apk,根据上图分析执行逻辑。重点查看intent处理
    我使用的是jadx-gui 导出 Gradle项目,直接用AndroidStudio来查看的。关键部分截图
    Tasker控制米家App_第2张图片
    Tasker控制米家App_第3张图片
    然后使用AndroidStudio断点调试onCreate函数(因为反编译的源码与字节码行号不匹配,所以直接断点函数)。得到如下图
    Tasker控制米家App_第4张图片
    这样我们就知道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
  4. 编写Tasker任务
    Tasker控制米家App_第5张图片
    测试一下,完美触发
    Tasker控制米家App_第6张图片

如何更加便捷的获取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来触发米家中的场景。可以愉快的玩耍了!!!

你可能感兴趣的:(软件使用)