hank9999部落格

写点奇怪的东西

Flipper Zero 的 Sub-GHz 中 Raw 记录解析生成

hank9999's Avatar 2025-02-11

前文分析了引闪器的协议,本文将解析并生成对应的文件供 Flipper Zero 调用。

Raw 文件格式解析:

1
2
3
4
5
6
Filetype: Flipper SubGhz Key File
Version: 1
Frequency: 433810000 // 这里是频率,单位 Hz
Preset: FuriHalSubGhzPresetOok270Async // 这里可以改 AM270/AM650
Protocol: RAW
RAW_Data: 50 -50 50 -50 50 -50 // 正数代表高电平 数字代表持续时间(us),这里表示 101010 每个电平 50us

在知道发射位图的情况下,可以很轻松的写出一个程序批量生成对应文件。
这是一个简易的位图转换 Raw_Data 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
def convert_binary(binary_str):
output_list = []
for ch in binary_str:
if ch == '1':
output_list.append("50")
elif ch == '0':
output_list.append("-50")
else:
continue
return " ".join(output_list)
binary_str = "101010"
result = convert_binary(binary_str)
print(result) # 50 -50 50 -50 50 -50

下面写一个程序遍历从 0000 到 1111 状态并保存到文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def convert_binary(binary_str):
output_list = []
for ch in binary_str:
if ch == '1':
output_list.append("50")
elif ch == '0':
output_list.append("-50")
else:
continue
return " ".join(output_list)

def convert_to_bitmap(status_str): # 来自前文
result = f"1{status_str[2] * 3}01{status_str[1] * 3}01{status_str[0] * 3}01{status_str[3] * 3}01"
result = result.replace('000', '')
result = f"{result}000" * 10
result = result[:-3]
return result

for i in range(16): # 遍历 0000(0)-1111(15)
sw_status = format(i, '04b')
bitmap = convert_to_bitmap(sw_status)
raw_data = convert_binary(bitmap)

file_data = "Filetype: Flipper SubGhz Key File\n" \
"Version: 1\n" \
"Frequency: 433810000\n" \
"Preset: FuriHalSubGhzPresetOok270Async\n" \
"Protocol: RAW\n" \
f"RAW_Data: {raw_data} 20000 -20000 20000 -20000 20000 -20000 20000 -20000 20000 -20000\n"
# 最后加几个 20000us 的电平是为了延长时间 防止长按导致快速多次闪光

print(file_data)
with open(f'tiggers/flash-tigger-{sw_status}.sub', 'w') as f:
f.write(file_data)

生成完后,把文件复制进去就可以用了。

本文作者 : hank9999
版权声明 :本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
本文链接 : https://blog.hank.ltd/flipper-zero-sub-ghz-raw-data-sub-generate/