ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Flipper Zero 固件 RFID 测试用例实战:读取、模拟、写入与手动建卡的全流程验证方法

Flipper Zero 固件 RFID 测试用例实战:读取、模拟、写入与手动建卡的全流程验证方法 Flipper Zero 固件 RFID 测试用例实战读取、模拟、写入与手动建卡的全流程验证方法【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware本文以仓库中的官方测试用例文档 rfid_test_cases.md 为主体完整覆盖其中 9 组 RFID 测试场景与 5 个共享步骤Read / Emulate / Save / Write / Read the written并结合固件源码 lfrfid_worker.h、lfrfid.c 与各协议实现说明每个测试步骤在固件内部由哪些场景Scene和 Worker 调用链支撑。读完后你可以独立完成 RFID 功能的回归测试并能对照源码定位写卡失败协议不可写卡片被保护等异常对应的处理分支。1. 测试框架总览5 个共享步骤及其源码映射测试用例文档中反复引用 5 个共享步骤Shared step它们构成了 RFID 功能验证的原子操作集。理解这 5 步与固件内部实现的对应关系是执行全部 9 组用例的基础共享步骤动作预期结果固件对应实现[1] Read读取用 Flipper 读取被测卡卡片读取成功读出的键值与原卡一致读取场景 lfrfid_scene_read.cWorker 读取模式 lfrfid_worker_read_start[2] Emulate模拟模拟已读出的卡用另一台 Flipper 读取对端识别为一张卡且信息与原卡完全一致模拟场景 lfrfid_scene_emulate.clfrfid_worker_emulate_start[3] Save保存保存读出的键以指定名称保存保存后界面跳转到 Saved 目录lfrfid_save_key保存成功场景 lfrfid_scene_save_success.c[4] Write写入用写卡功能把键写入另一张存储卡卡片写入成功出现成功场景写卡场景 lfrfid_scene_write.clfrfid_worker_write_start[5] Read the written回读读取已写入的介质介质被识别数据与写入的键一致复用读取链路验证写入后的射频数据完整性RFID 应用LF RFID的主入口在 lfrfid_app。它初始化时打开存储、GUI、通知等 record创建协议字典与 LFRFIDWorker并注册主菜单。主菜单项在 lfrfid_i.h 中定义为 Read、Saved、Add Manually、Extra Actions 四项正好对应测试步骤里RFID → ReadingRFID → SavedRFID → Add Manually以及More → Write等菜单路径。卡片数据的存储约定也定义在 lfrfid_i.h卡数据保存为EXT_PATH(lfrfid)即 SD 卡/ext/lfrfid/目录下、扩展名为.rfid的文件另有.shd影子扩展名和.ask.raw/.psk.raw原始波形文件扩展名。测试中保存后场景切换到 Saved 目录这一预期结果对应的就是写入/ext/lfrfid/名称.rfid并进入保存成功界面的行为见 lfrfid_save_key 中的路径拼接逻辑文件名 .rfid扩展名。Worker 层是测试步骤的核心执行者。lfrfid_worker.h 暴露了四类模式读取lfrfid_worker_read_start读取类型支持LFRFIDWorkerReadTypeAuto自动、ASKOnly仅 ASK 解调、PSKOnly仅 PSK 解调见 lfrfid_worker.h写入lfrfid_worker_write_start按协议选择写卡方案模拟lfrfid_worker_emulate_start原始波形lfrfid_worker_read_raw_start/lfrfid_worker_emulate_raw_start。写入结果的枚举 LFRFIDWorkerWriteResult 直接决定了写卡测试的判定分支typedef enum { LFRFIDWorkerWriteOK, // 写入成功 LFRFIDWorkerWriteProtocolCannotBeWritten, // 协议不可写入 LFRFIDWorkerWriteFobCannotBeWritten, // 卡片不可写如被保护 LFRFIDWorkerWriteTooLongToWrite, // 数据过长超出卡片容量 } LFRFIDWorkerWriteResult;后续第 7 节会说明这些枚举值如何映射到写卡场景的界面反馈。2. 用例 1EM Marine 4100EM4100全周期测试EM4100 是最常见的 LF 卡片协议固件在 lfrfid_protocols.h 的协议枚举中甚至拆分为三个变体LFRFIDProtocolEM4100、LFRFIDProtocolEM410032、LFRFIDProtocolEM410016对应不同位数宽度的卡。协议实现位于 protocol_em4100.c。测试步骤原文档第 1 节进入 RFID。共享步骤 [1] 读取用 Flipper 读取被测卡。预期结果卡片读取成功读出的键信息与原始卡一致。共享步骤 [2] 模拟模拟已读出的卡并用另一台 Flipper 读取。预期结果对端 Flipper 识别该卡键信息与原始卡完全一致。共享步骤 [3] 保存保存之前读出的键。预期结果键以指定名称保存保存后场景切换到 Saved 目录。共享步骤 [4] 写入用写卡功能把已保存的键写入另一张存储卡。预期结果卡片写入成功出现成功场景。共享步骤 [5] 回读读取已写入键的介质。预期结果介质被识别数据与写入的键一致。这一组用例是读取 → 模拟 → 保存 → 写入 → 回读完整闭环的标准模板用例 3、4 与之同构可作为回归测试的基准流程。3. 用例 2Motorola Indala26 测试Indala26 协议实现位于 protocol_indala26.c。与用例 1 不同这一组不包含读取步骤直接从写入开始原文档第 2 节的步骤顺序即为如此用于验证以已有关卡数据为起点的流程进入 RFID。共享步骤 [4] 写入把已保存的键写入另一张存储卡。预期结果卡片写入成功出现成功场景。共享步骤 [2] 模拟模拟该卡用另一台 Flipper 读取。预期结果对端识别该卡键信息与原始卡完全一致。共享步骤 [3] 保存保存读出的键。预期结果键以指定名称保存保存后场景切换到 Saved 目录。共享步骤 [4] 写入再次写入。预期结果卡片写入成功出现成功场景。共享步骤 [5] 回读读取已写入键的介质。预期结果介质被识别数据与写入的键一致。执行时注意该用例依赖一张事先保存好的 Indala26 键文件.rfid文件位于/ext/lfrfid/可通过 Saved 目录选择加载加载逻辑见 lfrfid_load_key_from_file_select。4. 用例 3HID H10301Picopass测试HID H10301即 Picopass协议实现位于 protocol_h10301.c。此用例与用例 1 结构相同走完整五步闭环进入 RFID。共享步骤 [1] 读取用 Flipper 读取被测卡。预期结果读取成功键信息与原始卡一致。共享步骤 [2] 模拟模拟该卡并用另一台 Flipper 读取。预期结果对端识别该卡信息与原始卡完全一致。共享步骤 [3] 保存保存读出的键。预期结果以指定名称保存保存后切换到 Saved 目录。共享步骤 [4] 写入把已保存的键写入另一张卡。预期结果卡片写入成功出现成功场景。共享步骤 [5] 回读读取已写入的介质。预期结果介质被识别数据与写入的键一致。5. 用例 4Indala26 测试读取优先流程此用例覆盖 Indala26 的完整读取优先流程与用例 3 同构仅协议换为 Indala26protocol_indala26.c进入 RFID。共享步骤 [1] 读取。预期结果读取成功信息与原始卡一致。共享步骤 [2] 模拟。预期结果对端识别该卡信息与原始卡完全一致。共享步骤 [3] 保存。预期结果以指定名称保存切换至 Saved 目录。共享步骤 [4] 写入。预期结果卡片写入成功出现成功场景。共享步骤 [5] 回读。预期结果介质被识别数据与写入的键一致。6. 用例 5Troyka / Podorozhnik 与 troika 解析器检查此用例针对俄语区公交卡 Troika / Podorozhnik在原五步之外增加了一步特有的解析器检查原文档第 5 节共享步骤 [1] 读取用 Flipper 读取被测卡。预期结果读取成功键信息与原始卡一致。检查 troika 解析器工作预期结果读取卡片时会加载出该类卡片特有的附加信息列表。共享步骤 [2] 模拟模拟该卡并用另一台 Flipper 读取。预期结果对端识别该卡信息与原始卡完全一致。共享步骤 [3] 保存。预期结果以指定名称保存切换至 Saved 目录。从源码结构看当前仓库中 Troika 卡的解析器实现为 NFC 应用下的受支持卡片插件 troika.c该插件针对 Mifare Classic 1K/4K 卡维护了 1K 卡的 troika_1k_keys 与 4K 卡的 troika_4k_keys 扇区密钥表并通过 troika_get_card_config 指定数据扇区1K 卡为第 11 扇区4K 卡为第 8 扇区做卡型校验。测试中读取时加载附加信息列表的预期结果对应的正是这类受支持卡片解析器在读取后向用户呈现的卡型专属数据。执行本用例前建议确认固件中已启用该插件可通过 application.fam 查看其打包配置。7. 用例 6RFID 批量读取Reading原文档第 6 节验证多协议混读的识别能力进入 RFID → Reading依次读取 indala、em-marine、HID 三种标准的卡片。预期结果三种标准的卡片均被识别。保存所有读出的卡。预期结果卡片全部保存成功。从源码结构看这一能力由 Worker 的读取类型支撑LFRFIDWorkerReadTypeAuto表示自动模式固件会依次进入 ASK 与 PSK 解调阶段对应 lfrfid_worker.h 中LFRFIDWorkerReadStartASK、LFRFIDWorkerReadStartPSK、LFRFIDWorkerReadDone等读取阶段事件。读取界面使用自定义视图 lfrfid_view_read.c 实时展示当前识别到的协议因此批量读取多个不同标准的卡时界面应能随卡片切换更新协议名称。固件当前支持的 LF 协议全集见 lfrfid_protocols.h 枚举共 24 个协议EM4100 系、Indala26、H10301、HidGeneric、FDX A/B、FDX、Pyramid、Viking、Gallagher 等。8. 用例 7向 T5577 写卡测试T5577 是测试中写入目标卡的载体芯片。原文档第 7 节读取一张 RFID 卡或选择一张已保存的卡。将所选卡写入 T5577More → Write。预期结果卡片写入成功。分别写入 3 种不同类型的卡并检查从 T5577 的回读。预期结果读取器识别出各卡数据匹配。固件对 T5577 的写卡支持集中在 t5577.h 与 t5577.c。关键设计点T5577 共LFRFID_T5577_BLOCK_COUNT8个块块 0 为控制字t5577.h 定义了调制方式位FSK1/FSK2/Manchester/Biphase 等如LFRFID_T5577_MODULATION_FSK1 0x00004000与码速率位RF/8到RF/128测试不同协议卡时固件会按协议特性选择正确的调制与速率组合提供三种写入入口t5577_write直接写入、t5577_write_with_pass带密码、t5577_write_with_mask指定页码、可选密码的掩码写入见 t5577.h。写入请求的组织方式见 LFRFIDWriteRequest固件支持LFRFIDWriteTypeT5577与LFRFIDWriteTypeEM4305两种目标芯片em4305.h 实现 EM4305 方案。写卡场景的界面反馈与测试预期严格对应见 lfrfid_scene_write.c进入写卡场景时弹出 Writing 提示窗显示卡名未保存的卡则显示 Unsaved 协议名同时触发洋红色呼吸灯见 lfrfid_scene_write_on_enter——这就是预期结果中卡片写入过程的可视化阶段收到LFRFIDWorkerWriteOK后播放 success 提示音并切换到写卡成功场景LfRfidSceneWriteSuccess对应出现成功场景收到WriteProtocolCannotBeWritten时弹出 This protocol cannot be written收到WriteFobCannotBeWritten或WriteTooLongToWrite时提示 Make sure this card is writable and not protected见 lfrfid_scene_write_on_event。因此测试失败时可直接依据弹窗文案判断是协议不支持、卡片被保护还是数据超长。9. 用例 8手动建卡Add Manually原文档第 8 节验证不经读取直接构造卡数据的路径进入 RFID → Add Manually。创建一张 EM4100 卡。创建一张 H10301 卡。创建一张 I40134 卡。用另一台 Flipper 或读卡座读取所创建的卡。预期结果卡被读出数据一致。对应实现为手动选择卡型场景 lfrfid_scene_select_key.c用户在此场景选择协议如 EM4100、H10301并输入键值随后数据进入同一套保存/写入链路。该用例的价值在于验证协议编码函数encoder的正确性——即使没有物理原卡固件生成的卡数据也必须能被真实读取器或另一台 Flipper 还原出一致的 ID。10. 用例 9跨设备模拟验证Emulation原文档第 9 节验证模拟输出的射频数据在不同固件版本的对端设备上的可识别性进入 RFID → Saved选择一张已保存的键。选择已保存的 Indala 卡 → Emulate用另一台不同固件Flipper 读取。预期结果读取端显示的 ID 与模拟端 Flipper 的 ID 一致。选择已保存的 EM-Marine 卡 → Emulate用另一台 Flipper 读取。预期结果ID 一致。选择已保存的 HID 卡 → Emulate用另一台 Flipper 读取。预期结果ID 一致。从源码看这一用例有两条进入模拟场景的路径均在 lfrfid_app 中处理应用启动参数为.rfid文件路径时加载键数据后直接进入LfRfidSceneEmulate场景跳过主菜单适用于文件管理器/CLI 触发模拟启动参数匹配RPC %lX时进入 RPC 模式LfRfidSceneRpc由上位机远程控制模拟会话见 rpc_command_callback。跨固件版本互验的意义在于模拟侧输出的调制波形必须符合协议规范而非仅满足本固件自己的解码器另一台不同固件的 Flipper 或标准读取器是更严格的校验方。测试中ID 一致的判定标准即读取端解析出的卡号与模拟卡文件中存储的 ID 字段逐位相等。11. 测试执行建议与源码索引执行上述用例时的通用注意事项每组用例建议独立记录读取值 / 模拟回读值 / 写入回读值三方数据并逐字节比对这正是各用例 Expected result 中identical to the original的可操作化标准写入类用例用例 1/2/3/4/7失败时优先依据 lfrfid_scene_write.c 的弹窗文案归类协议不可写、卡片受保护、数据超长三类与 LFRFIDWorkerWriteResult 一一对应保存类用例失败时检查/ext/lfrfid/目录写入权限与磁盘空间保存入口逻辑见 lfrfid_save_key。核心源码索引便于深入对应实现关注点路径测试用例原文档documentation/testing/rfid_test_cases.mdRFID 应用入口applications/main/lfrfid/lfrfid.c应用常量与菜单定义applications/main/lfrfid/lfrfid_i.hCLI 接口辅助验证applications/main/lfrfid/lfrfid_cli.cWorker API读/写/模拟/原始lib/lfrfid/lfrfid_worker.h协议清单lib/lfrfid/protocols/lfrfid_protocols.hEM4100 / Indala26 / H10301 协议protocol_em4100.c、protocol_indala26.c、protocol_h10301.cT5577 / EM4305 写卡芯片工具lib/lfrfid/tools/t5577.h、lib/lfrfid/tools/em4305.h键文件读写.rfid 格式lib/lfrfid/lfrfid_dict_file.hTroika 卡解析插件applications/main/nfc/plugins/supported_cards/troika.c需要说明的适用前提本文所述菜单路径与源码映射基于当前仓库的固件结构用例中涉及的物理卡片EM Marine 4100、Indala26 卡、HID H10301、T5577 可编程卡等为硬件前提固件侧行为以上述源码为准。此外用例 5 中 Troyka/Podorozhnik 的附加信息列表依赖受支持卡片插件机制若目标固件未打包相应插件该步骤的预期结果需按实际启用情况评估。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表