ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Flipper Zero Pronto IR:用 Node.js 脚本把传统 Pronto 十六进制遥控码库转换为 Flipper IR 格式

Flipper Zero Pronto IR:用 Node.js 脚本把传统 Pronto 十六进制遥控码库转换为 Flipper IR 格式 Flipper Zero Pronto IR用 Node.js 脚本把传统 Pronto 十六进制遥控码库转换为 Flipper IR 格式【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper本文基于仓库Infrared/Pronto_IR/项目展开先拆解 Pronto 十六进制码的字段结构与定时单位再逐行走读仓库自带的转换脚本 ir_convert.js载波计算、微秒换算、指令/重复序列切分并对照本仓库 ac.ir 说明转换目标——Flipper.ir文件的raw/parsed两种条目格式最后给出 5,740 个文件的码库结构速览、项目最终状态与导入设备时的注意事项。读完你可以复现Pronto 十六进制串 → Flipper 红外库文件的完整转换链路并理解其中每一类字段的物理含义。项目背景Pronto_IR 目录里有什么项目处于什么状态Infrared/Pronto_IR/ReadMe.md 记录了一个完整的小型数据工程项目其时间线为立项作者收集了一批 Pronto 格式的红外码This is a new project: Pronto IR codes并配有一个作者在外部分享的 Node.js 转换工具目标是把它们转成 Flipper 可导入的 IR 文件转换完成UPDATEIR 转换工作已经做完IR conversion completed作者明确提示though some some issues may remain可能仍存留一些问题并致谢 SkeletonMan2022 年 6 月 16 日目录重组完成which included removing dupes and likely broken files去重并移除了疑似损坏的文件收尾致谢 bi0drainx 和 SkeletonMan 在思路、文件、编码与整体协助上的贡献并注明Original ZIP removed to avoid confusion原始 ZIP 已移除以免混淆后续计划作者预告Another project, soon下一个目标格式是 LIRC 数据库中常见的 Sirc 格式红外码。截至当前仓库状态该目录仅保留三个文件原始码库本身已不在本仓库中文件内容ReadMe.md项目说明、状态更新与致谢ir_convert.jsPronto 十六进制码 → 微秒时序的 Node.js 转换脚本Directory_Tree.txt原始 ZIP 包5,740 个文件、342 个文件夹的完整目录树快照转换后的成品 .ir 文件按 Infrared/ReadMe.md 的说法维护在作者外部的 Flipper-IRDB 仓库中链接见原 ReadMe本文不重复列出外部地址。本仓库的价值在于保留了转换工具本身和码库的目录级档案这正是下文的技术主体。Pronto 十六进制格式头部字段、定时单位与脚本中的字段映射Pronto 是一种历史悠久的红外码文本格式一条码就是若干个以空格分隔的十六进制数。结合 ir_convert.js 的取用方式和公开的 Pronto 规范各字段含义如下脚本从 0 开始索引索引字段含义脚本中的用法numbers[0]版本号Pronto 规范中通常为4脚本未校验直接使用后续字段numbers[1]载波周期字段单位0.241246 µs决定载波频率计算carrierFrequencyir_convert.js#L8numbers[2]codeLengthL1指令序列的脉冲/间隙对数决定第一序列长度ir_convert.js#L9numbers[3]repeatCodeLengthL2重复序列的脉冲/间隙对数决定第二序列长度ir_convert.js#L10numbers[4..]定时值单位同为0.241246 µsmark/space 交替逐个换算为微秒ir_convert.js#L12-L15关键点是定时单位Pronto 的原始数值不是微秒而是0.241246 µs的倍数载波字段与全部脉冲/间隙时长共用这一单位体系。脚本做的核心工作就是把这一相对单位还原为绝对的载波频率Hz与脉冲/间隙时长µs这正是 Flipper.ir文件所需的形式。转换脚本逐行走读ir_convert.js完整脚本只有 24 行全文如下行号与仓库一致//usage: node irconvert.js pronto hex //steps from https://stackoverflow.com/a/27323452 //sourced from https://gist.github.com/XMB5/a877ab620d812260f2da8380aac050d3 numbersprocess.argv[2].split( ).map(xparseInt(x,16)) fullSequenceConverted[] carrierFrequency 1000000/(numbers[1] * .241246) codeLength numbers[2] repeatCodeLength numbers[3] for(i4;inumbers.length;i) { convertedToMicrosec Math.round(1000000*(numbers[i]/carrierFrequency)) fullSequenceConverted.push(convertedToMicrosec) } sequence1EndPoint 2 * codeLength sequence2EndPoint sequence1EndPoint 2 * repeatCodeLength firstSequence fullSequenceConverted.slice(0, sequence1EndPoint) secondSequence fullSequenceConverted.slice(sequence1EndPoint, sequence2EndPoint) console.log(first: firstSequence.join(, )) console.log(second: secondSequence.join(, ))输入约定整串十六进制作为单个参数L5 只读取process.argv[2]再按空格切分这意味着整串 Pronto 码必须以单个 shell 参数传入需要用引号包住否则脚本只会拿到第一个 token。另外注意 L1 的 usage 注释写的是irconvert.js而仓库中的实际文件名是ir_convert.js运行时以实际文件名调用即可。载波频率计算公式L8 的换算关系为carrierFrequency 1000000 / (numbers[1] × 0.241246) // 结果单位 Hz量纲上是µs/s ÷ µs 1/µs Hz即脚本把numbers[1]当作载波周期以 0.241246 µs 为单位的取值来处理。一个需要留意的细节按公开的 Pronto 规范numbers[1]定义的是半载波周期half-carrier period。从源码结构看若输入的正是按该规范编码的标准 Pronto 码则此式算出的载波频率与 L13 算出的脉冲/间隙宽度都会是真实值的约 2 倍由于载波与时长同比放大单个脉冲内包含的载波周期数恰好不变但发射的 RF 载波本身和整个信号的持续时间都翻倍。作者自己在 ReadMe 中承认some issues may remain这与该实现层面的取舍是一致的。若你要自行复算建议以目标设备的实测载波为准。作为对照本仓库最终形态的 .ir 文件如 ac.ir中所有raw条目统一使用标准空调载波frequency: 38000即 38 kHz说明实际入库的数据已归一到真实载波频率。定时换算与双序列切分L12-L15 对从第 4 个字段起的所有数值执行统一换算convertedToMicrosec round( 1000000 × ( numbers[i] / carrierFrequency ) )随后 L17-L21 按2 × codeLength与2 × repeatCodeLength把序列切成两段first指令序列2×L1 个数值mark/space 交替——对应遥控按键按下时的主帧second重复序列2×L2 个数值——对应长按时周期性重发的短帧。这一双序列结构与 Flipper 侧的用法是吻合的在 ac.ir 中不少raw条目的data字段中段会出现远超正常比特宽度的大间隙值如5162、19917、29443µs可以观察到这正是主帧 间隔 重复帧连续录制下来的形态与 Pronto 码里 command/repeat 两段式组织的来源相对应。演示示例构造数据仅用于验证流程下面用一串自行构造的演示数据走一遍脚本不代表仓库中任何真实遥控码。取numbers[1]0x3654、L10x044 对、L20x022 对node ir_convert.js 04 36 04 02 2B2 159 2B 2B 2B 2B 2B 2B 2B2 159 2B 2B按脚本公式carrierFrequency 1000000 / (54 × 0.241246) ≈ 76763.7 Hz各时长按13.0273 µs/单位换算后输出first: 8989, 4494, 560, 560, 560, 560, 560, 560 second: 8989, 4494, 560, 560即一个约 9 ms 的导前脉冲、4.5 ms 导前间隙之后是若干 ~0.56 ms 的短脉冲/间隙对。若改按半周期规范解读同一串十六进制则载波约为 38.4 kHz、各时长减半——两种解读的差异即上文约 2 倍的来源。目标格式Flipper.ir文件结构以 ac.ir 为例转换的落点是 Flipper 红外库文件。以仓库中的 ac.ir万能空调遥控库为例文件头声明类型与版本Filetype: IR library file Version: 1 # Last Updated 21st Mar, 2023 # Last Checked 21st Mar, 2023其后是若干个按键条目以空行和#注释分隔分两种类型。raw 条目完整时序直录ac.ir#L6-L10 是一个典型raw条目name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8714 4338 579 538 551 540 549 542 557 1613 555 1615 553 538 ... 1617 551 1608 549name按键名frequency载波频率Hz本文件中全部为38000duty_cycle载波占空比本文件中全部为0.330000datamark/space 交替的微秒值序列恰好就是转换脚本first序列以及必要时拼接的second序列的落点。parsed 条目协议紧凑表示对于固件可解码的协议同一按键也可以不存时序、而存协议参数例如 ac.ir#L321-L325name: TEMP type: parsed protocol: NEC address: 80 00 00 00 command: 94 00 00 00以及 32 位地址的 NEC 扩展形式 ac.ir#L405-L409name: TEMP type: parsed protocol: NECext address: 48 12 00 00 command: 88 09 00 00Infrared/ReadMe.md 以 ASCII 时序图整理了本仓库支持的各协议参数导前、比特宽度、重复码可作对照表协议关键时序µs说明NEC导前 9000/4500重复 9000/225032 bit stop bitNECext同上32 位地址地址/命令各 16 bitKaseikyo导前 3360/1665重复 3456/172848 bitSAMSUNG32导前 4500/4500重复 4500/450032 bit stop bitSony SIRC导前 2400/600PWM (600,1200)周期 ~4500012/15/20 bitRC5曼彻斯特 888/1776toggle bit ×25 bit 地址 6/7 bit 命令RC6导前 2666/889比特 444/888toggle ×28 bit 地址 8 bit 命令Pronto 字段到 .ir 字段的映射把前后两端串起来整条转换链的字段映射如下Pronto 十六进制字段脚本中间量.ir 文件落点numbers[1]载波字段carrierFrequencyHzfrequency:实际入库值需校准为真实载波本仓库为38000numbers[2]L1codeLength决定data中主帧的数值个数numbers[3]L2repeatCodeLength决定重复帧数值个数numbers[4..]定时值convertedToMicrosecµsdata:mark/space 交替微秒按键名原始库中的文件名/按钮名—name:—脚本不产生—type: raw、duty_cycle: 0.330000需另行补齐码库规模速览5,740 个文件的目录树Directory_Tree.txt 保存了原始 ZIP 的完整目录树开头两行即规模声明L1-L25,740 Files 342 Folders其组织方式是品牌文件夹 → 遥控器/机型文件覆盖从 3M、ABB、Acer、Apple、Bang Olufsen、Bose、Canon、Comcast、Crestron、Denon、DirecTV、DISH 到大量专业影音与工程品牌BARCO、Christie Digital、DALITE、Davis 投影机等。命名规律值得注意(N)后缀 同一台遥控器的多个按键。例如BK COMPONENTS/下CT-610.html与CT-610(0)CT-610(30)共 32 个文件对应一台工程投影遥控器的逐键代码描述性文件名同样代表单键。例如Bang Olufsen/下BEOLINK 5000 (A RECORD)、(ATAPE)、(CD)、(REC STOP)、(SHIFT)等每个文件就是一颗按钮的 Pronto 码(Generic)文件夹收纳无品牌归类的设备如HDMI Matrix、HTW1000、Security Camera。这些原始文件为.html导出页内含 Pronto 十六进制串正是转换脚本的输入语料。由于作者Original ZIP removed to avoid confusion本仓库只保留这份目录树作为档案若你想核对某个品牌当年收录了哪些按键直接检索 Directory_Tree.txt 即可。项目最终状态、已知限制与后续计划依据 ReadMe.md 的原始表述可以确认的项目结论是转换已完成成品位于作者外部的 Flipper-IRDB 仓库Pronto Converted to Flipper Format重组后归入\_Converted_/Pronto作者明示可能仍有问题though some some issues may remain。结合脚本实现值得自行复核的点包括载波换算口径上文约 2 倍分析与原始导出页中个别损坏/重复码——后者作者已在 2022-06-16 的去重与清理中处理过一轮removing dupes and likely broken files致谢与分工bi0drainx 与 SkeletonMan 分别提供了思路、文件、编码和整体协助后续格式作者预告下一个同类项目是 Sirc 格式LIRC 遥控数据库常见格式与本文的 Pronto 项目构成同一条第三方红外码格式 → Flipper .ir的管线。导入设备时的注意事项转换得到的.ir文件导入设备的方式与 Infrared/ReadMe.md 中描述的一致在仓库页面以Raw方式下载目标 .ir 文件再用 qFlipper 将文件传输到 Flipper 并替换或新增对应红外库条目。该文档同时提醒若使用未自行编译且未经验证的固件you may have manifest file issues——万能遥控类 .ir 库tv.ir、ac.ir、audio.ir、projectors.ir、fans.ir 等已随 Unleashed 与 RogueMaster 等解锁固件测试可用。本仓库根目录下的 Manifest 展示了固件侧如何以哈希 大小 路径的形式登记infrared/assets/tv.ir这类资产文件这正是manifest 文件问题所指的对象。小结与仓库文件索引文件作用Infrared/Pronto_IR/ReadMe.md项目说明、状态时间线、致谢本文主体文档Infrared/Pronto_IR/ir_convert.jsPronto 十六进制 → 微秒时序转换脚本24 行Infrared/Pronto_IR/Directory_Tree.txt原始 5,740 文件 / 342 文件夹码库的目录树档案Infrared/ac.ir目标 .ir 格式实例raw NEC/NECext parsed 条目Infrared/ReadMe.md各 IR 协议时序说明、固件兼容性与导入方法Infrared/Manifest固件资产清单含infrared/assets/tv.ir登记项整条管线的技术脉络可以浓缩为一句话Pronto 码以0.241246 µs为定时单位、以载波字段隐式表达频率ir_convert.js 把这套相对单位还原为 Hz 与 µs并按 L1/L2 切分出主帧与重复帧落点则是.ir文件中frequency/duty_cycle/data的raw条目或在能识别协议时退化为address/command的parsed紧凑条目。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表