
感測器 UI Demo
資訊/科技

奧提斯
更新日:2025年4月22日
看了前幾篇,應該有人會好奇在iPhone 上呈現會是什麼樣子呢,這裡提供一些簡易的範本,有興趣的朋友可以照著步驟試試看,說不定你也會一頭栽進BLE的世界喔。
SwiftUI + CoreBluetooth 的基本範例專案,功能是:
✅ 掃描並連線到你的 Nordic DK 開發板
✅ 讀取一個感測器特徵值(例如溫度)
✅ 即時顯示資料在畫面上
📦 專案結構概覽
BLESensorApp/ ├── ContentView.swift # SwiftUI 主畫面 ├── BluetoothManager.swift # CoreBluetooth 邏輯集中處理 └── Models/ └── SensorData.swift # 感測資料模型(可選)
1. BluetoothManager.swift
import CoreBluetooth import Foundation class BluetoothManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeripheralDelegate { @Published var temperature: Double = 0.0 @Published var isConnected = false private var centralManager: CBCentralManager! private var peripheral: CBPeripheral? // 替換成你的 Service 與 Characteristic UUID private let sensorServiceUUID = CBUUID(string: "XXXX") private let temperatureCharUUID = CBUUID(string: "YYYY") override init() { super.init() centralManager = CBCentralManager(delegate: self, queue: nil) } // MARK: - CBCentralManagerDelegate func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { central.scanForPeripherals(withServices: [sensorServiceUUID], options: nil) } } func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { self.peripheral = peripheral self.peripheral?.delegate = self centralManager.stopScan() centralManager.connect(peripheral, options: nil) } func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { isConnected = true peripheral.discoverServices([sensorServiceUUID]) } // MARK: - CBPeripheralDelegate func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { guard let services = peripheral.services else { return } for service in services { peripheral.discoverCharacteristics([temperatureCharUUID], for: service) } } func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { guard let characteristics = service.characteristics else { return } for char in characteristics { if char.uuid == temperatureCharUUID { peripheral.setNotifyValue(true, for: char) } } } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { guard let data = characteristic.value else { return } // 假設溫度是 1 byte 的 UInt8 數值 let temp = Double(data.first ?? 0) DispatchQueue.main.async { self.temperature = temp } } }
🖼 2. ContentView.swift
import SwiftUI struct ContentView: View { @StateObject private var bluetoothManager = BluetoothManager() var body: some View { VStack(spacing: 20) { Text(bluetoothManager.isConnected ? "✅ 已連線" : "🔍 掃描中…") .font(.headline) Text("🌡️ 溫度:\(bluetoothManager.temperature, specifier: "%.1f") °C") .font(.largeTitle) .bold() Spacer() } .padding() }
}
🧪 注意事項
你需要把 sensorServiceUUID 和 temperatureCharUUID 替換成你 Nordic 開發板廣播的 UUID。
若特徵值是 2 bytes 或 Float32,就要修改 didUpdateValueFor 解析的方式。
iOS App 客製化 上架。
iOS 軟體開發、修改、維護既有App
IT/程式 > iPhone/iPad/Mac應用程式開發
$ 10000

$ 10000

0 / 1000