源碼揭秘:藍牙串口調(diào)試工具箱如何實現(xiàn)定時宏回放)
nRF Toolbox宏系統(tǒng)源碼揭秘藍牙串口調(diào)試工具箱如何實現(xiàn)定時宏回放【免費下載鏈接】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調(diào)試工具箱內(nèi)置 UART 串口調(diào)試、DFU 固件升級、心率/血壓等健康傳感器演示模塊。其中最實用的功能之一是UART 宏系統(tǒng)把多條串口命令與毫秒級延時編排成一段腳本一鍵定時回放還能通過 Codable 序列化成 JSON 文件保存、共享。本文帶你快速讀懂它的 UART 命令模型、定時回放引擎與 Codable 序列化實現(xiàn)全文幾乎沒有難懂代碼新手也能看懂 ? 宏系統(tǒng)代碼都在哪模塊路徑速查宏系統(tǒng)的所有源碼集中在Profiles/UART/目錄下核心文件分工非常清晰文件路徑職責nRF Toolbox/Profiles/UART/Model/UARTCommandModel.swift文本命令、十六進制數(shù)據(jù)命令的模型定義nRF Toolbox/Profiles/UART/Macro/Model/UARTMarcoElement.swift宏元素標記協(xié)議與毫秒延時模型nRF Toolbox/Profiles/UART/Model/UARTMacro.swift宏整體模型 Codable 序列化實現(xiàn)nRF Toolbox/Profiles/UART/Model/UARTPreset.swift3×3 命令預(yù)設(shè)板支持 XML 導入導出nRF Toolbox/Profiles/UART/Utils/UARTMacroSaver.swift宏的 JSON 文件讀寫與目錄管理nRF Toolbox/BluetoothManager/BluetoothManager.swift定時回放引擎的發(fā)送實現(xiàn)nRF Toolbox/Profiles/UART/Macro/UARTMacrosTableViewController.swift宏編輯、添加延時、一鍵 Play 的界面單元測試位于nRF Toolbox Tests/UART/UARTMacroFileManagerTests.swift驗證了宏文件的存取邏輯閱讀源碼時可以參考它理解預(yù)期行為。 UART 命令模型從文本到原始字節(jié)的三種元素宏的每一步操作都是一個宏元素。源碼用一個空標記協(xié)議UARTMacroElement把所有元素統(tǒng)一成一個列表類型而真正干活的是三類模型元素類型定義文件含義回放時的行為TextCommandModel/UARTCommandModel.swift一段 UTF-8 文本可附加 CR / LF / CRLF 行尾轉(zhuǎn)成字節(jié)后寫入串口DataCommandModel/UARTCommandModel.swift一串十六進制原始字節(jié)如01 02 03原樣寫入串口UARTMacroTimeIntervalMacro/Model/UARTMarcoElement.swift一個毫秒數(shù)暫停指定毫秒后繼續(xù)幾個值得注意的設(shè)計細節(jié)行尾符抽象TextCommand支持cr、lf、crlf、none四種 EOLEnd of Line選項內(nèi)部直接映射為0x0d、0x0a等字節(jié)滿足不同設(shè)備對換行的要求??瘴荒P虴mptyModel用來占位例如 3×3 預(yù)設(shè)板上沒填的格子它實現(xiàn)了 Codable 但編碼時什么都不寫保證了序列化數(shù)組長度恒定。命令 圖標 數(shù)據(jù)每個命令都攜帶image圖標描述列表展示和發(fā)送邏輯共用同一份模型界面與數(shù)據(jù)天然一致。UARTPreset命令預(yù)設(shè)板固定存放 9 個命令位默認內(nèi)置了一組演示命令0x01、0x02、0x03、Pause、Play、Stop、Rew、Start、Repeat。它還能通過document計算屬性生成 XML 文檔、并通過init(data:)解析 XML 還原從而實現(xiàn)UART 預(yù)設(shè)的 XML 導入導出與其他遵循該格式的工具互通 ?? 定時回放引擎宏如何帶節(jié)奏發(fā)送回放引擎的實現(xiàn)藏在nRF Toolbox/BluetoothManager/BluetoothManager.swift的send(macro:)方法里核心邏輯非常樸素把宏的所有元素交給一個專用后臺隊列按順序逐個處理。macro.commands.forEach { element in switch element { case let command as UARTCommandModel: self.send(command: command) // 發(fā)送命令 case let timeInterval as UARTMacroTimeInterval: usleep(useconds_t(timeInterval.milliseconds * 1000)) // 暫停指定毫秒 } }拆解一下這個引擎順序執(zhí)行forEach遍歷命令列表遇到命令就發(fā)送遇到延時就睡眠——宏的回放本質(zhì)是命令 停頓的交替序列。不阻塞界面整個回放跑在btQueue.async的后臺隊列上usleep造成的卡頓不會影響用戶操作。延時精度到毫秒milliseconds * 1000把毫秒換算成微秒編輯界面里的步進器TimeIntervalTableViewCell也是以毫秒為步長調(diào)節(jié)的默認添加延時就是 100 ms。這種線性掃描 睡眠的方案沒有使用復雜的定時器或狀態(tài)機對藍牙調(diào)試這種低頻場景來說恰到好處——簡單、可靠、一眼能讀懂是很好的輕量級播放引擎范例。 Codable 序列化混合類型命令列表如何存成 JSON宏的難點在于一個命令列表里既可能是文本命令、數(shù)據(jù)命令也可能是延時元素。如果直接用 Swift 的 JSONEncoder 編碼一個Any列表類型信息會丟失讀取時就不知道該還原成哪個模型。源碼給出的答案是判別聯(lián)合Discriminated Union模式實現(xiàn)在nRF Toolbox/Profiles/UART/Model/UARTMacro.swift的UARTCommandContainer中定義一個CommandType枚舉empty/text/data/timeInterval把每個命令和它的類型一起包進UARTCommandContainerJSON 里先寫type字段再寫對應(yīng)的command內(nèi)容解碼時先讀出type再按類型決定command字段該還原成哪個具體模型。保存出來的 JSON 結(jié)構(gòu)大致如下簡化示意{ 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:)把容器數(shù)組還原成命令列表編碼時encode(to:)再把命令列表包裝回容器——一來一回類型信息零丟失。這個模式是 Swift 序列化接口/多態(tài)類型的通用解法遇到類似需求可以直接借鑒。 宏文件存儲JSON 文件在哪里宏的持久化由nRF Toolbox/Profiles/UART/Utils/UARTMacroSaver.swift中的UARTMacroFileManager負責存儲位置Documents/macros/宏名.json每個宏一個獨立 JSON 文件文件名就是宏名保存規(guī)則重名宏默認禁止覆蓋編輯模式下通過shodUpdate參數(shù)允許更新校驗兜底保存前界面會檢查宏名非空、至少包含一條命令出錯時彈出提示而不是崩潰。由于宏存在 Documents 目錄你還能通過 Mac 的文件共享把它拷貝出來備份或遷移到別的設(shè)備 新手實操在 App 中使用宏系統(tǒng)打開 UART 標簽頁切換到Macros宏列表點擊 Add New... 創(chuàng)建新宏輸入宏名從 3×3 預(yù)設(shè)板點選命令加入列表長按格子可以自定義命令內(nèi)容點擊列表末尾的 Add delay 添加毫秒延時用步進器調(diào)整間隔點 Play 立即回放點右上角保存宏就寫成了 JSON 文件存好。適合用它自動化的場景設(shè)備開機后連續(xù)下發(fā)查詢版本 → 等待 500 ms → 切換模式這類有時序要求的命令序列省去手動一條條點的麻煩。? 總結(jié)這套設(shè)計里最值得學習的 4 個點設(shè)計點出處一句話點評空標記協(xié)議統(tǒng)一異構(gòu)元素UARTMarcoElement用一個協(xié)議把文本、數(shù)據(jù)、延時裝進同一個數(shù)組判別聯(lián)合序列化UARTCommandContainer多態(tài)模型存 JSON 的教科書式解法隊列內(nèi)線性回放BluetoothManager.send(macro:)十幾行代碼實現(xiàn)帶延時的宏播放簡單可靠一宏一文件UARTMacroFileManager按名稱存 JSON天然支持備份、共享、測試整體來看nRF Toolbox 的宏系統(tǒng)麻雀雖小五臟俱全模型層清晰、序列化完備、回放引擎輕量是學習iOS 端藍牙調(diào)試工具 Codable 序列化的優(yōu)質(zhì)源碼樣本。動手打開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創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考