夜雨聆风学习资料网

ARTICLE · 1224298

告别手机APP!我用Python把智能红外遥控器变成了PC端遥控器

告别手机APP!我用Python把智能红外遥控器变成了PC端遥控器

告别手机APP!我用Python把智能红外遥控器变成了PC端遥控器

破烂变新颜:乐橙 GR221遥控器的PC端控制调试


一、背景:一个"不听话"的红外遥控器

家里有一台智能红外遥控器(乐橙 GR221),可以控制电视、空调、电扇、机顶盒。平时用得很方便,但有个大毛病——必须用手机APP操作。

每次想开空调,都得:

  1. 掏出手机
  2. 打开APP
  3. 登录
  4. 找到设备
  5. 点按键

没啥事,嘚瑟,就改造它了。

我的目标:在PC上直接控制这个红外遥控器,不依赖手机APP。


二、硬件信息查看:先搞清楚它是什么

2.1 查看芯片信息

首先,我需要知道这个遥控器里是什么芯片。通过查看设备外壳上的标签和官方资料,我找到了关键信息:

  • 芯片:南硅谷 SV32WB01(WIFI+BLE SoC)
  • MCU主频:320MHz
  • 通信方式:WiFi + 蓝牙

2.2 查找设备信息

通过设备产品的盒子上的标签,我记录了以下信息(已隐藏具体数据):

信息
说明
设备ID
类似 CMCC-XXXXXX-XXXXXXXXXXXXX 的格式
CMEI
15位数字
SN
序列号

关键发现:这个设备是纯云端架构,控制走的是云端API,不是局域网直连。


三、抓包:发现重大突破

3.1 选择抓包工具

我选择了手机上的 Packet Capture 应用(抓HTTP请求,导出HAR格式)。

3.2 抓包步骤

  1. 打开 Packet Capture,开始抓包
  2. 在手机上打开"移动爱家"APP(控制红外遥控器的APP)
  3. 在APP里进行各种操作:登录、查看设备、控制设备
  4. 停止抓包,导出HAR文件

3.3 重大发现!

分析HAR文件后,我发现了重大突破:

控制指令走的是明文HTTP API!

PC (Python) ──HTTP──> 云端服务器 ──> 红外遥控器 ──红外──> 家电
  • 标准HTTP REST API
  • 响应是base64编码的JSON(部分接口明文JSON)
  • 鉴权用一个 API_KEY 请求头

这意味着:我可以直接从PC调用这些API,完全不需要手机APP!


四、API逆向:一步步还原控制流程

4.1 鉴权机制

通过分析抓包数据,我发现了鉴权方式:

  • 请求头:API_KEY: <32位hex>
  • 辅以:X-Requested-With: com.cmri.universalapp
  • 缺少API_KEY返回:{"code":401,"message":"缺乏鉴权参数"}

关键发现:API_KEY是APP本地生成的稳定凭证,不是服务器下发的,长期有效!

4.2 核心API清单

通过抓包和测试,我还原了完整的API:

查询类:

  • 设备类型列表
  • 品牌列表
  • 已绑定设备列表
  • 设备功能按键列表

绑定类:

  • 匹配候选码库
  • 码库按键列表
  • 绑定设备

控制类(核心):

  • 发送红外控制(已绑定设备)
  • 发送红外(未绑定/试键阶段)

4.3 控制流程

绑定新设备(一次性):

1. 选设备类型(电视/空调/电扇/机顶盒)
2. 选品牌
3. 匹配候选码库
4. 逐个测试POWER键,找到有效码库
5. 绑定设备

日常控制(绑定后):

1. 获取设备按键列表
2. 发送按键指令

五、测试:从失败到成功

5.1 第一次测试:失败

我写了一个Python脚本,尝试调用API控制电扇:

import requests

API_KEY = "xxx"# 从抓包获取
HUB_ID = "xxx"# 网关ID

# 尝试发送POWER
resp = requests.post(
f"http://云端服务器/panel/control/{HUB_ID}",
    headers={"API_KEY": API_KEY},
    json={"keyId": 1}
)
print(resp.json())

结果:{"code": 401, "message": "缺乏鉴权参数"}

5.2 排查问题

我检查了请求头,发现:

  • API_KEY格式正确
  • 但缺少 X-Requested-With 头

5.3 调整:成功!

加上缺失的请求头后:

headers = {
"API_KEY": API_KEY,
"X-Requested-With": "com.cmri.universalapp"
}

结果:{"code": 200, "message": "success"}

电扇真的转了! 🎉


六、从脚本到界面:让控制更便捷

6.1 命令行工具

首先,我写了一个命令行工具:

python imou_control.py test# 测试认证+设备列表
python imou_control.py keys         # 列出按键
python imou_control.py power        # 电源
python imou_control.py speed+       # 风速+
python imou_control.py swing        # 扫风

6.2 Web界面:终极方案

命令行虽然方便,但不够直观。我决定做一个Web界面:

技术栈:

  • 后端:Python + http.server
  • 前端:单文件HTML + 原生JS
  • 本地存储:localStorage

功能:

  • 我的设备:显示已绑定设备列表,支持别名、隐藏、删除
  • 添加设备:选类型 → 选品牌 → 点码库测试(发POWER)→ 绑定
  • 按键别名:显示全部设备+按键对应关系表格,可编辑别名

6.3 界面效果

最终实现的Web界面(已隐藏隐私信息):

  • 顶部:设备列表(支持别名、隐藏、删除)
  • 中间:控制面板(点击按键直接发送红外)
  • 底部:添加设备(选类型、品牌、码库)
  • 侧边:按键别名管理

七、总结:从逆向到完整方案

7.1 关键突破

  1. 发现云端API:控制走明文HTTP,不需要局域网直连
  2. API_KEY长期有效:不需要频繁刷新
  3. 完整还原控制流程:从绑定到控制,全部可用

7.2 最终方案

PC (Web界面) ──HTTP──> 云端服务器 ──> 红外遥控器 ──红外──> 家电
  • 不依赖手机APP
  • 不依赖局域网
  • 纯云端控制
  • 支持多设备(电视/空调/电扇/机顶盒)

7.3 可扩展方向

  • 接入Home Assistant
  • 场景+定时(观影模式)
  • 多用户支持
  • 移动端适配

八、经验教训

8.1 抓包是逆向的关键

  • 选择正确的抓包工具(Packet Capture)
  • 在APP里做实际操作,全程抓包
  • 分析HAR文件,发现明文API

8.2 不要假设架构

  • 早期以为要走"局域网直连+协议逆向"
  • 抓包后发现纯云端HTTP,完全不需要局域网

8.3 隐私保护很重要

  • 界面默认隐藏敏感信息
  • 可以切换显示/隐藏
  • 截图时不会暴露隐私

九、代码开源

完整代码已开源,包括:

  • 抓包分析工具
  • API逆向脚本
  • 命令行控制工具
  • Web控制界面

仓库:fanapk

文件结构:

tools/
  imou_control.py      # 命令行控制
  web_server.py        # Web后端
  web_ui.html          # Web前端
  ir_download.py       # 码库下载
  remote.py            # 统一遥控器
  config.json          # 配置(API_KEY)
doc/
  imou-dev-plan.md     # 开发计划
test/
  capture_*.har        # 抓包文件

十、结语

这个项目让我深刻体会到:逆向工程的核心是抓包。

通过抓包,我发现了云端API,完全绕过了手机APP的限制。最终实现了一个完整的PC端控制方案,让我可以随时随地控制家里的红外设备。

如果你也有类似的智能设备,想要摆脱手机APP的限制,不妨试试抓包逆向!

记住:

  1. 选择正确的抓包工具
  2. 在APP里做实际操作
  3. 分析HAR文件
  4. 发现明文API
  5. 从PC直接调用

祝你成功!🚀


本文和真实案例所有具体操作均由PI-web、qwen3.8-27b(Swift-qwen38-27b-pxqn)-V100-16G生成,我只是配合它做了些手动操作和打字

相关学习资料