Sub-GHz协议扩展到30+、频宽放到928MHz:Flipper Zero Unleashed固件Sub-GHz能力拆解
【免费下载链接】unleashed-firmwareFlipper Zero Unleashed Firmware项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware
你按了三次原装车库遥控,道闸没动;刷了Unleashed固件的Flipper Zero抓下信号重建协议,一次发射就抬起了栏杆。差别在两点:这套固件的Sub-GHz协议注册表里放了30+套解码器,频率列表可以从内置信道表一路加到928MHz。
下文拆解四件事:协议注册机制如何动态实例化解码器、频率列表怎么扩展、如何用单个映射文件集中管理多台设备、以及FAAC道闸配对的完整时间线,最后给一张信号调试速查表。全程只动microSD卡配置和设备菜单,不碰任何仓库代码。
两种固件的能力差异速览
| 维度 | 官方固件 | Unleashed固件 |
|---|---|---|
| 协议注册 | 内置少量协议,新增需等OTA | 注册表30+套,解码器启动时动态实例化 |
| 频率列表 | 固定内置信道 | 300-348 / 386-464 / 778-928MHz + 用户自定义信道 |
| 遥控管理 | 一个捕获文件对应一次发射 | 映射文件把5个按键绑到5个.sub文件,随时切换 |
| 用户配置入口 | 无频率级配置 | microSD卡上的setting_user |
协议注册表怎么工作:动态实例化解码器
启动接收器时,固件不硬编码任何协议逻辑,而是遍历注册表逐个分配解码器实例。核心循环在 lib/subghz/receiver.c:
for (size_t i = 0; i < subghz_protocol_registry_count(items); ++i) { const SubGhzProtocol* protocol = subghz_protocol_registry_get_by_index(items, i); if (protocol->decoder && protocol->decoder->alloc) { slot->base = protocol->decoder->alloc(environment); // 各解码器自持状态 } }之后每一段电平信号进来,subghz_receiver_decode把(level, duration)依次喂给所有槽位,通过 flag 位掩码过滤只参与匹配的协议。哪个解码器先解出完整帧,就回调哪个。新增协议 = 在lib/subghz/protocols/目录加一对.c/.h并挂进注册表,接收端无需改主流程。
| 协议 | 典型场景 | 编码/频段特点 |
|---|---|---|
| FAAC SLH | 高端车库/道闸 | Keeloq变体,868.35 / 433.92MHz |
| CAME / CAME Atomo | 欧洲卷帘门 | OOK脉冲串,433.92MHz |
| Chamberlain | 北美车库门 | 固定码+滚动序列,390MHz |
| Keeloq | 多品牌滚动码门禁 | 加密滚动,433/868MHz |
| BISS / ANSonic | 老式门窗电机 | 定长脉冲,315/433MHz |
实操:设备菜单
Sub-GHz → Add Manually里直接选协议建遥控;菜单里没有的协议,先用Read模式抓一段真实信号再对照 lib/subghz/protocols/ 里的实现判断是否已支持。
手动添加自定义频率的4步流程
Step 1:在microSD卡找到subghz/assets/setting_user.example,复制一份并去掉.example后缀,得到生效的setting_user。
Step 2:在文件末尾续写用户信道(接在默认列表之后,格式固定9位数字):
# subghz/assets/setting_user Frequency: 928000000 Frequency: 433915000 Hopper_frequency: 345000000 # Add_standard_frequencies: trueStep 3:需要跳频扫描的设备,用Hopper_frequency追加信道;列表保持最小化,信道过多会拖垮跳帧间隔,接收端大概率锁不上。
Step 4:想彻底丢弃内置列表,把#Add_standard_frequencies: true改成false。注意此时主列表和跳频列表都必须自行填全,空列表等于没有频率可选。细节见 documentation/SubGHzSettings.md。
技术细节:CC1101射频前端的可用窗口由硬件定死在 300-348、386-464、778-928MHz 三段,配置文件里的"频率列表"是离散信道表而非连续扫描。你填的值落在窗口内就能调频,但能否被接收端解出,取决于对端接收机的容差——对不齐时对端看到的只是一段噪声。
一台Flipper管风扇、门铃、车库门
手上有三台设备、各是各的遥控:吊扇、门铃、车库门,各自的.sub文件已经抓好。传统用法是每次进Sub-GHz找文件发射,五台设备就要切五次界面。Sub-GHz Remote插件的做法是一张映射表:
UP: /ext/subghz/Fan1.sub DOWN: /ext/subghz/Fan2.sub LEFT: /ext/subghz/Door.sub RIGHT: /ext/subghz/Garage3.sub OK: /ext/subghz/Garage3l.sub ULABEL: 风扇开启 DLABEL: 风扇关闭 LLABEL: 门铃 RLABEL: 车库开 OKLABEL: 车库关subghz_remote/example.txt放进卡里后,进入Sub-GHz Remote界面就是五个方向键加中心键的遥控器布局,标签直接显示在按键位。规则三条:文件路径不能有空白字符(连字符、下划线允许);标签限16字符,超了会挤到屏幕外;映射文件想建几个建几个,文件名随意。修改配置不用电脑,在插件界面按Back直接进编辑器。规范见 documentation/SubGHzRemotePlugin.md。
FAAC SLH配对时间线:从0到可用
以FAAC SLH道闸为例,全程约40秒,参照 documentation/SubGHzRemoteProg.md:
| 时间 | 动作 |
|---|---|
| T+0s | Sub-GHz → Add Manually → FAAC SLH,选定频率,生成随机序列号的新遥控文件 |
| T+10s | 打开接收器外壳,找到主板上的编程按钮 |
| T+15s | Flipper长按Up发送编程信号,同时长按接收器编程按钮 |
| T+20s | 接收器LED依次经历:亮→灭→亮→灭→亮,然后松开所有按键 |
| T+30s | 按住 Flipper 的Send键1-3秒,连发两次,测试道闸 |
容易卡住的一步是T+15s:两个按键必须"同时"按下,人肉手速经常差半拍。卡住的表现是LED序列走完就重置回待机——回到T+15s重来即可,不需要重建遥控文件。如果接收器外壳打不开,文档里另有"从主遥控器读Seed再绑定"的替代路线,免拆箱。
信号调试速查表
| 问题 | 排查动作 | 预期结果 |
|---|---|---|
| 同频干扰,偶发失灵 | Read模式扫环境,对比干扰时段信号;setting_user里把信道挪到相邻可用频率 | 新信道上重放,接收端响应稳定 |
| 距离不够 | 确认发射功率档与调制方式一致;检查.sub文件头部的OOK/ASK/FSK标注与目标设备手册一致 | 有效距离随调制匹配恢复,波形占空比回到设计值 |
| 协议不匹配 | 用Read抓原始信号,对照解码器目录确认协议;不行就走Add Manually手动建参 | 抓到的帧能被正确协议解出并回显 |
波形层面,.sub文件本质是电平-时长序列,发射时按行重放:
// .sub 每行一对参数,决定重放波形 // level: 1 高电平 / 0 低电平 // duration: 时长(微秒) // 占空比与脉宽偏差是协议不匹配的最常见根因重放逻辑在 lib/subghz/subghz_file_encoder_worker.c,排查时拿抓包文件和重放文件的时长列逐项比对,偏差超过几个微秒就说明文件已被改坏。
路线图与参与
- 动态频率选择(DFS):自动避开占用高的信道
- 信号强度可视化:在界面上直接看RSSI
- 贡献入口:issue提交设备型号加信号样本;协议适配代码走PR,构建环境按 documentation/HowToBuild.md 搭
Unleashed固件把Sub-GHz从"能抓能放"做到了"抓得全、放得准、管得多"。协议和频率表还在长,后续信号分析篇会接着讲解码器状态机怎么调。
【免费下载链接】unleashed-firmwareFlipper Zero Unleashed Firmware项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考