nRF Toolbox宏系统源码揭秘:蓝牙串口调试工具箱如何实现定时宏回放 nRF Toolbox宏系统源码揭秘蓝牙串口调试工具箱如何实现定时宏回放【免费下载链接】IOS-nRF-ToolboxThe nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location.项目地址: https://gitcode.com/gh_mirrors/io/IOS-nRF-ToolboxnRF Toolbox是 Nordic Semiconductor 出品的开源蓝牙低功耗BLE调试工具箱内置 UART 串口调试、DFU 固件升级、心率/血压等健康传感器演示模块。其中最实用的功能之一是UART 宏系统把多条串口命令与毫秒级延时编排成一段脚本一键定时回放还能通过 Codable 序列化成 JSON 文件保存、共享。本文带你快速读懂它的 UART 命令模型、定时回放引擎与 Codable 序列化实现全文几乎没有难懂代码新手也能看懂 ✨![nRF Toolbox蓝牙低功耗调试工具箱启动画面内置UART宏系统与串口调试功能](https://raw.gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox/raw/4d071a82fd39241cc8a376058c8033fd1ff54597/nRF Toolbox/Images.xcassets/splashscreen.imageset/splashscreen3x.png?utm_sourcegitcode_repo_files) 宏系统代码都在哪模块路径速查宏系统的所有源码集中在Profiles/UART/目录下核心文件分工非常清晰文件路径职责nRF Toolbox/Profiles/UART/Model/UARTCommandModel.swift文本命令、十六进制数据命令的模型定义nRF Toolbox/Profiles/UART/Macro/Model/UARTMarcoElement.swift宏元素标记协议与毫秒延时模型nRF Toolbox/Profiles/UART/Model/UARTMacro.swift宏整体模型 Codable 序列化实现nRF Toolbox/Profiles/UART/Model/UARTPreset.swift3×3 命令预设板支持 XML 导入导出nRF Toolbox/Profiles/UART/Utils/UARTMacroSaver.swift宏的 JSON 文件读写与目录管理nRF Toolbox/BluetoothManager/BluetoothManager.swift定时回放引擎的发送实现nRF Toolbox/Profiles/UART/Macro/UARTMacrosTableViewController.swift宏编辑、添加延时、一键 Play 的界面单元测试位于nRF Toolbox Tests/UART/UARTMacroFileManagerTests.swift验证了宏文件的存取逻辑阅读源码时可以参考它理解预期行为。 UART 命令模型从文本到原始字节的三种元素宏的每一步操作都是一个宏元素。源码用一个空标记协议UARTMacroElement把所有元素统一成一个列表类型而真正干活的是三类模型元素类型定义文件含义回放时的行为TextCommandModel/UARTCommandModel.swift一段 UTF-8 文本可附加 CR / LF / CRLF 行尾转成字节后写入串口DataCommandModel/UARTCommandModel.swift一串十六进制原始字节如01 02 03原样写入串口UARTMacroTimeIntervalMacro/Model/UARTMarcoElement.swift一个毫秒数暂停指定毫秒后继续几个值得注意的设计细节行尾符抽象TextCommand支持cr、lf、crlf、none四种 EOLEnd of Line选项内部直接映射为0x0d、0x0a等字节满足不同设备对换行的要求。空位模型EmptyModel用来占位例如 3×3 预设板上没填的格子它实现了 Codable 但编码时什么都不写保证了序列化数组长度恒定。命令 图标 数据每个命令都携带image图标描述列表展示和发送逻辑共用同一份模型界面与数据天然一致。UARTPreset命令预设板固定存放 9 个命令位默认内置了一组演示命令0x01、0x02、0x03、Pause、Play、Stop、Rew、Start、Repeat。它还能通过document计算属性生成 XML 文档、并通过init(data:)解析 XML 还原从而实现UART 预设的 XML 导入导出与其他遵循该格式的工具互通 ![在nRF Toolbox中选择文件的界面可用于选择UART预设XML文件导入](https://raw.gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox/raw/4d071a82fd39241cc8a376058c8033fd1ff54597/nRF Toolbox/Images.xcassets/email_3.imageset/email_3.png?utm_sourcegitcode_repo_files)⏱️ 定时回放引擎宏如何带节奏发送回放引擎的实现藏在nRF Toolbox/BluetoothManager/BluetoothManager.swift的send(macro:)方法里核心逻辑非常朴素把宏的所有元素交给一个专用后台队列按顺序逐个处理。macro.commands.forEach { element in switch element { case let command as UARTCommandModel: self.send(command: command) // 发送命令 case let timeInterval as UARTMacroTimeInterval: usleep(useconds_t(timeInterval.milliseconds * 1000)) // 暂停指定毫秒 } }拆解一下这个引擎顺序执行forEach遍历命令列表遇到命令就发送遇到延时就睡眠——宏的回放本质是命令 停顿的交替序列。不阻塞界面整个回放跑在btQueue.async的后台队列上usleep造成的卡顿不会影响用户操作。延时精度到毫秒milliseconds * 1000把毫秒换算成微秒编辑界面里的步进器TimeIntervalTableViewCell也是以毫秒为步长调节的默认添加延时就是 100 ms。这种线性扫描 睡眠的方案没有使用复杂的定时器或状态机对蓝牙调试这种低频场景来说恰到好处——简单、可靠、一眼能读懂是很好的轻量级播放引擎范例。 Codable 序列化混合类型命令列表如何存成 JSON宏的难点在于一个命令列表里既可能是文本命令、数据命令也可能是延时元素。如果直接用 Swift 的 JSONEncoder 编码一个Any列表类型信息会丢失读取时就不知道该还原成哪个模型。源码给出的答案是判别联合Discriminated Union模式实现在nRF Toolbox/Profiles/UART/Model/UARTMacro.swift的UARTCommandContainer中定义一个CommandType枚举empty/text/data/timeInterval把每个命令和它的类型一起包进UARTCommandContainerJSON 里先写type字段再写对应的command内容解码时先读出type再按类型决定command字段该还原成哪个具体模型。保存出来的 JSON 结构大致如下简化示意{ name: Demo, preset: { name: Demo, commands: [] }, commands: [ { type: text, command: { text: Hello } }, { type: timeInterval, command: { milliseconds: 500 } }, { type: data, command: { data: 0102 } } ] }读取时UARTMacro.init(from:)把容器数组还原成命令列表编码时encode(to:)再把命令列表包装回容器——一来一回类型信息零丢失。这个模式是 Swift 序列化接口/多态类型的通用解法遇到类似需求可以直接借鉴。 宏文件存储JSON 文件在哪里宏的持久化由nRF Toolbox/Profiles/UART/Utils/UARTMacroSaver.swift中的UARTMacroFileManager负责存储位置Documents/macros/宏名.json每个宏一个独立 JSON 文件文件名就是宏名保存规则重名宏默认禁止覆盖编辑模式下通过shodUpdate参数允许更新校验兜底保存前界面会检查宏名非空、至少包含一条命令出错时弹出提示而不是崩溃。由于宏存在 Documents 目录你还能通过 Mac 的文件共享把它拷贝出来备份或迁移到别的设备![macOS文件共享界面中显示nRF Toolbox文档目录宏JSON文件存放于此](https://raw.gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox/raw/4d071a82fd39241cc8a376058c8033fd1ff54597/nRF Toolbox/Images.xcassets/itunes_2.imageset/itunes_2.png?utm_sourcegitcode_repo_files) 新手实操在 App 中使用宏系统打开 UART 标签页切换到Macros宏列表点击 Add New... 创建新宏输入宏名从 3×3 预设板点选命令加入列表长按格子可以自定义命令内容点击列表末尾的 Add delay 添加毫秒延时用步进器调整间隔点 Play 立即回放点右上角保存宏就写成了 JSON 文件存好。适合用它自动化的场景设备开机后连续下发查询版本 → 等待 500 ms → 切换模式这类有时序要求的命令序列省去手动一条条点的麻烦。✅ 总结这套设计里最值得学习的 4 个点设计点出处一句话点评空标记协议统一异构元素UARTMarcoElement用一个协议把文本、数据、延时装进同一个数组判别联合序列化UARTCommandContainer多态模型存 JSON 的教科书式解法队列内线性回放BluetoothManager.send(macro:)十几行代码实现带延时的宏播放简单可靠一宏一文件UARTMacroFileManager按名称存 JSON天然支持备份、共享、测试整体来看nRF Toolbox 的宏系统麻雀虽小五脏俱全模型层清晰、序列化完备、回放引擎轻量是学习iOS 端蓝牙调试工具 Codable 序列化的优质源码样本。动手打开nRF Toolbox/Profiles/UART/目录对照本文读一遍源码一个下午就能完全吃透 【免费下载链接】IOS-nRF-ToolboxThe nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location.项目地址: https://gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考