hank9999部落格

写点奇怪的东西

神牛 TT520 闪光灯引闪器 RT-16 射频协议分析

hank9999's Avatar 2025-02-11

  1. 1. 0x00 前期
  2. 2. 0x01 抓取射频信号
  3. 3. 0x02 分析数据
  4. 4. 0x03 总结
  5. 5. 0x04 转换代码

我朋友有个 TT520 的闪光灯,有个 RT-16 引闪器,然后他还有个 Flipper Zero,但是一直没成功使用 Flipper Zero 模拟信号,找我研究研究。分析出来了,附简单计算代码。

0x00 前期

我手里正好有一个 RSP1 SDR(软件定义无线电)设备,可以用来抓取射频信号。
RT-16引闪器拆解图
拆开引闪器,里面的射频芯片是一个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,点击自动检测参数,就自动解析出来位图了。
Universal Radio Hacker 截图
下面是抓到的所有数据:

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,核对其他信号,均为这个结构。
例如 上下下下,位图是 101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101000101011110101101011110101 循环了 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) 应该是 0011000 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) # 1 000 01 111 01 111 01 111 01
# 发送时移除 000 空格
result = result.replace('000', '').replace(' ', '')
print(result) # 101111011110111101
# 带间隔 发送 10 次
result = f"{result}000" * 10
result = result[:-3]
print(result) # 101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101000101111011110111101

本文作者 : hank9999
版权声明 :本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
本文链接 : https://blog.hank.ltd/godox-tt520-flash-trigger-rt-16-radio-signal-protocol-analysis/