Flipper Zero 红外遥控增强插件 ir_remote:配置文件映射、短按/长按机制与源码级实现解析
【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper
本篇技术指南围绕 Flipper Zero 的开源红外遥控插件ir_remote(Alternative Infrared Remote)展开,该插件以 官方文档 为核心,源码位于 Applications/Official/source-OLDER/xMasterX/ir_remote/。ir_remote 用一份纯文本映射文件把 Flipper 的物理按键(上/下/左/右/OK/返回)直接绑定到.ir遥控文件中的具体红外按钮,并同时支持短按与长按两套映射。读完本文,你将掌握该插件的配置文件编写规范、安装与使用流程、编译构建方法,以及其"配置解析 → 信号加载 → 按键触发"的完整内部实现原理。
插件定位:为什么需要 ir_remote
Flipper Zero 自带的红外应用在使用电视、电视盒子等设备遥控时,需要在设备菜单里逐级进入"Button"列表、再为每个物理按键反复切换目标按钮,对于 Up、Down、Left、Right、Back 这类方向键操作相当繁琐。ir_remote 正是为解决这一痛点而生——它把固定设备的常用按钮一次性映射到 Flipper 的物理按键上,让遥控器变成"即开即用"的直通面板。
该插件定位上与著名的 UniversalRF Remix 插件类似,区别在于后者针对 Sub-GHz 射频文件,而 ir_remote 专门处理红外(Infrared).ir文件。作者在 README 中说明其适用于电视(TV)与电视盒子(TV box)场景,并在Unleashed 固件 unlshd-023 版本上完成过测试。
核心能力一览
- 按键直通映射:无需逐级菜单导航,UP/DOWN/LEFT/RIGHT/OK/BACK 六个物理按键直接发射预设的红外信号;
- 短按 + 长按双映射:每个物理按键可通过
HOLD后缀配置第二套映射,一个按键最多承载两个红外按钮; - 纯文本配置:以
.txt文件描述映射关系,文件放在 SD 卡的ir_remote文件夹下,应用启动时通过文件浏览器选择; - 空值容错:未配置的按键在界面上显示为
N/A并被禁用,不影响其他按键工作; - 应用内退出:长按 Back 键即可退出应用。
源码结构与启动流程
插件源码规模很小,共 5 个 C 文件、2 个头文件,外加 1 份应用清单 application.fam:
| 文件 | 职责 |
|---|---|
| infrared_remote_app.c | 应用入口、GUI 绘制、输入事件循环 |
| infrared_remote.c | .ir遥控文件的加载与按钮容器管理 |
| infrared_remote_button.c | 单个按钮(名称 + 信号)的数据结构 |
| infrared_signal.c | 红外信号解析、校验与发射 |
| infrared_remote.h 等头文件 | 对外 API 声明 |
应用清单 application.fam 给出了插件在构建系统中的注册信息:
appid="ir_remote",显示名IR Remote;apptype=FlipperAppType.EXTERNAL,即以.fap外部应用形式分发,需由用户手动放入 SD 卡;- 入口函数
infrared_remote_app,栈大小3 * 1024字节; - 依赖
gui与dialogs两个系统模块; - 安装后归类到
Misc_Extra应用类别,图标为ir_10px.png。
应用启动流程
入口函数 infrared_remote_app 的启动流程可拆解为以下步骤:
- 分配输入事件队列与
IRApp结构体(内含 11 个FuriString*,分别存放 6 个短按键名与 5 个长按键名); - 创建 ViewPort 并注册到 GUI 全屏层(
GuiLayerFullscreen),设置绘制回调和输入回调; - 打开存储与对话框服务,用文件浏览器(过滤
.txt扩展名)让用户从默认路径/ext/ir_remote选择配置文件; - 若用户取消选择,则释放全部资源并返回退出码 255;
- 打开配置文件并依次解析各键值,加载对应的
.ir遥控文件; - 进入主事件循环,根据短按/长按事件发射对应红外信号,直到长按 Back 退出。
其中界面绘制逻辑(infrared_remote_app.c)把 128x64 像素的屏幕分成上下两区:上半区为短按映射,下半区为长按映射,两区之间用一条水平线分隔。左侧绘制方向/功能图标,右侧以FontSecondary字体居中显示按钮名称。
配置文件详解(插件的核心)
ir_remote 的使用高度依赖一份纯文本映射文件。其格式设计成"键名: 值"的简单键值对,用REMOTE指定红外遥控文件路径,用按键名(可带HOLD后缀)指定对应.ir文件中的按钮名。
配置格式说明
- 带
HOLD后缀的键表示长按,不带则对应短按; - 值为空表示该物理按键不需要映射,界面显示为
N/A; - 每个键的取值必须是所引用
.ir文件中真实存在的按钮名(name字段),否则该按键不会被启用。
完整示例
仓库自带的示例配置 example.txt 完整内容如下:
REMOTE: /ext/infrared/Philips_32PFL4208T.ir UP: Up DOWN: Down LEFT: Left RIGHT: Right OK: BACK: Back UPHOLD: VOL+ DOWNHOLD: VOL- LEFTHOLD: Source RIGHTHOLD: SmartTV OKHOLD: POWER这个示例对应一台飞利浦电视遥控器:
| 物理按键 | 短按(原键) | 长按(HOLD 键) |
|---|---|---|
| UP | Up(方向键上) | VOL+(音量加) |
| DOWN | Down(方向键下) | VOL-(音量减) |
| LEFT | Left(方向键左) | Source(信号源) |
| RIGHT | Right(方向键右) | SmartTV(智能电视) |
| OK | 空(N/A,禁用) | POWER(电源) |
| BACK | Back(返回) | 长按 Back 用于退出应用 |
可见通过HOLD后缀,单个物理按键实现了"短按导航 + 长按快捷功能"的组合,这正是该插件相比官方红外应用最实用的差异点。
键名速查表
配置文件共支持 11 个键,对应源码中 11 次flipper_format_read_string调用(infrared_remote_app.c):
| 键名 | 含义 |
|---|---|
REMOTE | .ir遥控文件的绝对路径(必填) |
UP/DOWN/LEFT/RIGHT/OK/BACK | 对应物理按键的短按映射 |
UPHOLD/DOWNHOLD/LEFTHOLD/RIGHTHOLD/OKHOLD | 对应物理按键的长按映射 |
注意:BACK键的短按映射会发射配置的红外返回信号;而无论是否配置,长按 Back 键都会退出应用(见下文输入事件处理)。
配置文件的保存位置
将内容保存为.txt文件后,在 SD 卡根目录创建ir_remote文件夹(即/ext/ir_remote),把.txt放入其中。应用启动时文件浏览器会以该目录为起点、过滤.txt文件供选择。
安装与使用
安装步骤
- 将 Flipper Zero 固件升级到Unleashed unlshd-023版本(README 中标注的测试版本);
- 从项目发布页下载
ir_remote.fap文件; - 把
ir_remote.fap放入 SD 卡的apps文件夹(或按固件约定放入apps/Misc_Extra等分类目录,取决于固件版本); - 按上文格式准备配置文件并放入 SD 卡
ir_remote文件夹。
注意:当前仓库 xMasterX/ir_remote 目录中仅保留源码与文档,并不包含预编译的
.fap二进制,如需获取现成应用请自行编译或从发布渠道获取。
使用步骤
- 打开应用,进入文件浏览器,选择 SD 卡
ir_remote文件夹下的一份.txt配置文件; - 应用读取配置并加载对应的
.ir文件,随后进入全屏遥控界面; - 短按各物理按键发射对应红外信号,长按发射
HOLD映射信号; - 长按 Back 键退出应用。
界面效果
以下两张截图来自仓库 xMasterX/ir_remote:
第一张 ir.png 为启动后的配置文件选择界面,列出ir_remote目录下的各份.txt映射文件(图中可见example、tu、astro等条目)。
第二张 ir2.png 为加载成功后的遥控主界面:上半区显示短按映射的按钮名(Up、Down、Left、Right、N/A、Back),下半区显示长按映射的按钮名(VOL+、VOL-、Source、SmartTV、POWER、Exit App),与示例配置一一对应。
若配置文件无法解析或.ir文件加载失败,界面会显示"Config is incorrect."与"Please configure map."的错误提示,并提示按 Back 退出。
源码级实现解析
配置解析与按键映射
启动后应用以flipper_format_file_open_existing打开所选.txt,依次执行:
- 读取
REMOTE键获得.ir文件路径,随后调用infrared_remote_load加载遥控文件; - 依次读取 10 个按键键名(UP 至 OKHOLD);
- 对每个键名调用
infrared_remote_find_button_by_name(infrared_remote.c)在已加载的遥控文件中线性查找同名按钮并取回索引; - 找到则把对应按钮的
InfraredSignal赋给信号槽,并置xxx_enabled = true;找不到或键缺失则显示N/A、保持禁用状态。
每个按键都有独立的*_enabled布尔开关,因此在事件循环中只有成功映射的按键才会真正发射信号。
.ir文件加载与校验
infrared_remote_load(infrared_remote.c)是理解.ir文件格式的关键入口:
- 以缓冲模式打开
.ir文件,读取文件头并校验类型串必须为IR signals file且版本为 1,不符合则加载失败; - 加载成功后,循环调用
infrared_signal_read读取文件中每一段信号(每段包含name字段 + 信号体),把每个按钮包装为InfraredRemoteButton存入动态数组InfraredButtonArray。
这也解释了配置文件里REMOTE路径为什么必须指向合法.ir文件——它本质上是一个符合 Flipper 红外文件规范的按钮集合。
红外信号的两种形态
infrared_signal_read_body(infrared_signal.c)根据信号体中的type字段区分两种形态:
parsed(解析型):由protocol(协议名)、address、command组成,属于协议级编码信号。保存格式见 infrared_signal.c;raw(原始型):由frequency(载波频率)、duty_cycle(占空比,0~1)和data(定时时序数组)组成,属于波形级原始数据,适合学习而来、无标准协议的信号。
加载时对两种形态都会做合法性校验(infrared_signal.c):协议必须有效、address/command 必须在协议位宽范围内;raw 信号的频率须在红外有效范围、占空比须在 (0, 1]、时序条数须小于MAX_TIMINGS_AMOUNT。
信号发射:短按与长按的分流
主事件循环(infrared_remote_app.c)按输入事件类型分流:
InputTypeShort(短按):按InputKeyUp/Down/Right/Left/Ok/Back分支,若对应*_enabled为真则调用infrared_signal_transmit发射短按信号;InputTypeLong(长按):按 UP/DOWN/LEFT/RIGHT/OK 分支发射对应*HOLD信号,其余按键(含 Back)落入default分支将running置为 false,即长按 Back 退出应用;InputTypeRelease(松开):停止之前触发的 LED 闪烁提示。
发射前的提示逻辑统一调用notification_message(notification, &sequence_blink_start_magenta),即每次发射时 LED 闪烁品红色作为视觉反馈。
最终信号通过infrared_signal_transmit(infrared_signal.c)发射:
- 对
raw信号调用infrared_send_raw_ext(timings, timings_size, true, frequency, duty_cycle),按原始时序逐段发送; - 对
parsed信号调用infrared_send(message, 2),其中参数 2 表示重复发送次数,以提高接收端识别成功率。
编译构建
若要在本仓库源码基础上自行编译该插件,官方 README 给出了两种方式。前提是将 ir_remote 源码放入固件工程的applications_user目录,然后在固件根目录执行:
./fbt fap_ir_remote该命令构建名为ir_remote的.fap外部应用。也可以构建并直接部署运行到已连接的 Flipper:
./fbt launch_app APPSRC=applications_user/ir_remote两种方式都依赖 Flipper 官方构建工具链(fbt),且需要与目标固件(如 Unleashed)配套的源码工程环境。构建产物对应 application.fam 中声明的应用定义。
使用限制与注意事项
- 固件兼容性:README 标注的测试环境为 Unleashed unlshd-023,其他固件版本(含官方固件)未在文档中声明,可能存在 API 差异,实际使用时需自行验证;
- 按钮名必须精确匹配:配置文件中的按钮名需要与
.ir文件内的name字段完全一致(区分大小写),否则该键会静默禁用并显示N/A; - 一个文件一套映射:每份
.txt对应一台设备的映射方案,多台设备需准备多份配置文件并在启动时切换; - 退出方式:只能通过长按 Back 键退出,没有其他退出入口;
- 本仓库仅含源码:
xMasterX/ir_remote目录下没有预编译.fap,需要按上文流程自行构建。
总结
ir_remote 是一个小而精的 Flipper Zero 红外遥控增强插件:它以一份 11 键的纯文本配置文件为核心,把物理按键短按/长按分别映射到.ir文件中的按钮,省去了官方红外应用的菜单导航开销,特别适合电视、电视盒子等方向键密集的遥控场景。其源码结构清晰——配置文件解析、遥控文件加载、信号校验发射三层职责分明,是学习 Flipper Zero 外部应用开发(GUI 绘制、事件循环、FlipperFormat 配置读写、红外协议栈调用)的极佳参考样例。如需深入阅读实现细节,可继续浏览 infrared_remote_app.c、infrared_remote.c 与 infrared_signal.c。
【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考