Flipper Zero 红外遥控增强插件 ir_remote:配置文件映射、短按/长按机制与源码级实现解析
2026/9/14 7:48:27 网站建设 项目流程

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字节;
  • 依赖guidialogs两个系统模块;
  • 安装后归类到Misc_Extra应用类别,图标为ir_10px.png

应用启动流程

入口函数 infrared_remote_app 的启动流程可拆解为以下步骤:

  1. 分配输入事件队列与IRApp结构体(内含 11 个FuriString*,分别存放 6 个短按键名与 5 个长按键名);
  2. 创建 ViewPort 并注册到 GUI 全屏层(GuiLayerFullscreen),设置绘制回调和输入回调;
  3. 打开存储与对话框服务,用文件浏览器(过滤.txt扩展名)让用户从默认路径/ext/ir_remote选择配置文件;
  4. 若用户取消选择,则释放全部资源并返回退出码 255;
  5. 打开配置文件并依次解析各键值,加载对应的.ir遥控文件;
  6. 进入主事件循环,根据短按/长按事件发射对应红外信号,直到长按 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 键)
UPUp(方向键上)VOL+(音量加)
DOWNDown(方向键下)VOL-(音量减)
LEFTLeft(方向键左)Source(信号源)
RIGHTRight(方向键右)SmartTV(智能电视)
OK空(N/A,禁用)POWER(电源)
BACKBack(返回)长按 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文件供选择。

安装与使用

安装步骤

  1. 将 Flipper Zero 固件升级到Unleashed unlshd-023版本(README 中标注的测试版本);
  2. 从项目发布页下载ir_remote.fap文件;
  3. ir_remote.fap放入 SD 卡的apps文件夹(或按固件约定放入apps/Misc_Extra等分类目录,取决于固件版本);
  4. 按上文格式准备配置文件并放入 SD 卡ir_remote文件夹。

注意:当前仓库 xMasterX/ir_remote 目录中仅保留源码与文档,并不包含预编译的.fap二进制,如需获取现成应用请自行编译或从发布渠道获取。

使用步骤

  1. 打开应用,进入文件浏览器,选择 SD 卡ir_remote文件夹下的一份.txt配置文件;
  2. 应用读取配置并加载对应的.ir文件,随后进入全屏遥控界面;
  3. 短按各物理按键发射对应红外信号,长按发射HOLD映射信号;
  4. 长按 Back 键退出应用。

界面效果

以下两张截图来自仓库 xMasterX/ir_remote:

第一张 ir.png 为启动后的配置文件选择界面,列出ir_remote目录下的各份.txt映射文件(图中可见exampletuastro等条目)。

第二张 ir2.png 为加载成功后的遥控主界面:上半区显示短按映射的按钮名(UpDownLeftRightN/ABack),下半区显示长按映射的按钮名(VOL+VOL-SourceSmartTVPOWERExit App),与示例配置一一对应。

若配置文件无法解析或.ir文件加载失败,界面会显示"Config is incorrect."与"Please configure map."的错误提示,并提示按 Back 退出。

源码级实现解析

配置解析与按键映射

启动后应用以flipper_format_file_open_existing打开所选.txt,依次执行:

  1. 读取REMOTE键获得.ir文件路径,随后调用infrared_remote_load加载遥控文件;
  2. 依次读取 10 个按键键名(UP 至 OKHOLD);
  3. 对每个键名调用infrared_remote_find_button_by_name(infrared_remote.c)在已加载的遥控文件中线性查找同名按钮并取回索引;
  4. 找到则把对应按钮的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(协议名)、addresscommand组成,属于协议级编码信号。保存格式见 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询