ARTICLE · 1224297
告别手机APP!我用Python把智能红外遥控器变成了PC端遥控器
告别手机APP!我用Python把智能红外遥控器变成了PC端遥控器
破烂变新颜:乐橙 GR221遥控器的PC端控制调试
一、背景:一个"不听话"的红外遥控器
家里有一台智能红外遥控器(乐橙 GR221),可以控制电视、空调、电扇、机顶盒。平时用得很方便,但有个大毛病——必须用手机APP操作。
每次想开空调,都得:
掏出手机 打开APP 登录 找到设备 点按键
没啥事,嘚瑟,就改造它了。
我的目标:在PC上直接控制这个红外遥控器,不依赖手机APP。

二、硬件信息查看:先搞清楚它是什么
2.1 查看芯片信息
首先,我需要知道这个遥控器里是什么芯片。通过查看设备外壳上的标签和官方资料,我找到了关键信息:
芯片:南硅谷 SV32WB01(WIFI+BLE SoC) MCU主频:320MHz 通信方式:WiFi + 蓝牙
2.2 查找设备信息
通过设备产品的盒子上的标签,我记录了以下信息(已隐藏具体数据):
CMCC-XXXXXX-XXXXXXXXXXXXX 的格式 | |
关键发现:这个设备是纯云端架构,控制走的是云端API,不是局域网直连。
三、抓包:发现重大突破
3.1 选择抓包工具
我选择了手机上的 Packet Capture 应用(抓HTTP请求,导出HAR格式)。
3.2 抓包步骤
打开 Packet Capture,开始抓包 在手机上打开"移动爱家"APP(控制红外遥控器的APP) 在APP里进行各种操作:登录、查看设备、控制设备 停止抓包,导出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 关键突破
发现云端API:控制走明文HTTP,不需要局域网直连 API_KEY长期有效:不需要频繁刷新 完整还原控制流程:从绑定到控制,全部可用
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的限制,不妨试试抓包逆向!
记住:
选择正确的抓包工具 在APP里做实际操作 分析HAR文件 发现明文API 从PC直接调用
祝你成功!🚀
本文和真实案例所有具体操作均由PI-web、qwen3.8-27b(Swift-qwen38-27b-pxqn)-V100-16G生成,我只是配合它做了些手动操作和打字















































































