我朋友有个 TT520 的闪光灯,有个 RT-16 引闪器,然后他还有个 Flipper Zero,但是一直没成功使用 Flipper Zero 模拟信号,找我研究研究。分析出来了,附简单计算代码。
0x00 前期
我手里正好有一个 RSP1 SDR(软件定义无线电)设备,可以用来抓取射频信号。

拆开引闪器,里面的射频芯片是一个14脚的芯片,且表面被打磨,看不出型号来,晶振上的丝印很明显,这是一个 433M 的射频控制器。
引闪器反面印有 FCC ID: ZYR-AT-16
,经查询,申报频率为 433.81M。
在 Github 上找到了射频信号分析工具 Universal Radio Hacker,下载安装。
我之前用过我的 SDR,电脑装好了 SDR++,这里使用 SDR++ 录制信号。
0x01 抓取射频信号
打开 SDR++,设置一下增益,在 Recorder
选项卡里选择 容器 WAV + 采样率 Int16,点录制,然后把拨码开关从上上上上开始一个频道按一下,直到下下下下。
停止录制,然后将文件拖进 Universal Radio Hacker 里面,调制方式选择 ASK
,点击自动检测参数,就自动解析出来位图了。

下面是抓到的所有数据:
1 2 3 4 5 6 7 8 9 10 11
| 上上上上 111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101000111101111011110111101 下上上上 111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101000111101111010111101 上下上上 111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101000111101011110111101 上上下上 101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101 上上上下 111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101000111101111011110101 下下上上 111101010111101000111101010111101000111101010111101000111101010111101000111101010111101000111101010111101000111101010111101000111101010111101000111101010111101000111101010111101 上下下上 101011110111101000101011110111101000101011110111101000101011110111101000101011110111101000101011110111101000101011110111101000101011110111101000101011110111101000101011110111101 上上下下 101111011110101000101111011110101000101111011110101000101111011110101000101111011110101000101111011110101000101111011110101000101111011110101000101111011110101000101111011110101 下下下上 101010111101000101010111101000101010111101000101010111101000101010111101000101010111101000101010111101000101010111101000101010111101000101010111101 上下下下 101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101 下下下下 101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101
|
0x02 分析数据
用软件自带的分析没有分析出接过来,乱七八糟的,我把整理出来的对应给 DeepSeek-R1 推理,10分钟也没整出来,然后就用到了瞪眼法,发现了一些规律。
拨码开关 下下下下,位图是 101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101000101010101
,注意到 101010101
循环了 10 次,中间都是 000
,核对其他信号,均为这个结构。
例如 上下下下,位图是 101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101
,101011110101
循环了 10 次。
多次录制,解析,数据也不会变化。
这里不妨提出一个假设,这个射频控制器是静态码,其拨码开关数据会在一次发射中发送10次,每次中间会有3个数据位间隔。
这里取出每组重复的部分,且假设上为1,下为0:
1 2 3 4 5 6 7 8 9 10 11
| 上上上上(1111) → 111101111011110111101 (21位) 下上上上(0111) → 111101111010111101 (18位) 上下上上(1011) → 111101011110111101 (18位) 上上下上(1101) → 101111011110111101 (18位) 上上上下(1110) → 111101111011110101 (18位) 下下上上(0011) → 111101010111101 (15位) 上下下上(1001) → 101011110111101 (15位) 上上下下(1100) → 101111011110101 (15位) 下下下上(0001) → 101010111101 (12位) 上下下下(1000) → 101011110101 (12位) 下下下下(0000) → 101010101 (9位)
|
可以发现,上上上上 中出现了明显的 4 个 111
,且每组之间用 01
间隔,所有数据均以 1
开头,01
结尾。
这里可以假设 111
是拨码开关状态上,注意到,每少一个上开关,位数会减少三位,不妨设 000
为开关下,用 000
补足位数。
1 2 3 4 5 6 7 8 9 10 11
| 上上上上(1111) → 1 111 01 111 01 111 01 111 01 下上上上(0111) → 1 111 01 111 01 000 01 111 01 上下上上(1011) → 1 111 01 000 01 111 01 111 01 上上下上(1101) → 1 000 01 111 01 111 01 111 01 上上上下(1110) → 1 111 01 111 01 111 01 000 01 下下上上(0011) → 1 111 01 000 01 000 01 111 01 上下下上(1001) → 1 000 01 000 01 111 01 111 01 上上下下(1100) → 1 000 01 111 01 111 01 000 01 下下下上(0001) → 1 000 01 000 01 000 01 111 01 上下下下(1000) → 1 000 01 000 01 111 01 000 01 下下下下(0000) → 1 000 01 000 01 000 01 000 01
|
在这里,出现了明显的规律,01
将状态位分成了 4 组,每组由 3 个数字表示 1 个状态。
1 (状态1) 01 (状态2) 01 (状态3) 01 (状态4) 01
通过分别拨下开关(上文2-5行),可以得到一些对应关系:
1 2 3 4
| 拨码开关1 -> 状态3 拨码开关2 -> 状态2 拨码开关3 -> 状态1 拨码开关4 -> 状态4
|
可以发现1、3交叉了。
现在将这个关系带入检查一下,上下下上(1001)
应该是 0011
即 000 000 111 111
符合抓取补位后的数据 1 000 01 000 01 111 01 111 01。
这里大胆猜测一下,因为每组中间已经有了3个数据位间隔,这个正好与 000
电平冲突,然后就在发送的时候省略了 000
只发送高电平,防止影响。
0x03 总结
拨码开关上拨代表高电平 1
,下代表低电平 0
,拨码开关状态与发射的高低电平中1、3交叉,拨码开关下的 000
在发射时会省略。
例如,拨码开关目前状态 1101
,1、3交叉,应该使用 0111
计算,即 000 111 111 111
,补间隔,000 01 111 01 111 01 111
,补头尾,1 000 01 111 01 111 01 111 01
。
附:高低电平时长 50us
0x04 转换代码
下附简单计算代码:
1 2 3 4 5 6 7 8 9 10 11
| bitmap = '1101' result = f"1 {bitmap[2] * 3} 01 {bitmap[1] * 3} 01 {bitmap[0] * 3} 01 {bitmap[3] * 3} 01" print(result)
result = result.replace('000', '').replace(' ', '') print(result)
result = f"{result}000" * 10 result = result[:-3] print(result)
|