iOS App 端的 BLE → MQTT 中繼程式碼範例
資訊/科技
奧提斯
更新日:2025年4月22日
最後這邊提供一些程式碼範例,有興趣的朋友都可以直接私訊我或是透過案件服務請我開發 App 唷。
iOS App BLE to MQTT 範例程式碼
1️⃣ 加入 CocoaMQTT 套件(使用 Swift Package Manager)
.package(url: "https://github.com/emqx/CocoaMQTT.git", from: "2.0.0")
2️⃣ BLE 掃描 + MQTT 發送
import SwiftUI
import CoreBluetooth
import CocoaMQTT
class BLEMQTTBridge: NSObject, ObservableObject {
private var centralManager: CBCentralManager!
private var mqttClient: CocoaMQTT!
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: .main)
// 初始化 MQTT 連線
let clientID = "iOSClient-" + String(Int.random(in: 0..<1000))
mqttClient = CocoaMQTT(clientID: clientID, host: "192.168.1.100", port: 1883)
mqttClient.connect()
}
}
extension BLEMQTTBridge: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(withServices: nil)
}
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber) {
if let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data {
// 假設溫度在第 2~3 bytes(看實際裝置格式)
let tempRaw = manufacturerData.subdata(in: 2..<4)
let tempCelsius = Double(Int(tempRaw[0])) + Double(tempRaw[1]) / 100.0
print("📡 偵測到溫度:\(tempCelsius)°C")
mqttClient.publish("home/ble/temperature", withString: "\(tempCelsius)", qos: .qos1)
}
}
}
💡 重點說明
CBCentralManager開始掃描 BLE 廣播- 解讀
manufacturerData中的 bytes(視你的感測器格式而定) - 使用
CocoaMQTT發送資料到你家的 MQTT broker - Topic 可以自訂為
home/ble/temperature或任何你要的分類
開發這段的時候我自己其實卡了一下,因為我的 BLE 手環廣播的資料格式很特別, 要先拆 byte,還要自己算溫度的小數點 最後我把它寫成一個小小的 BLE → MQTT Bridge,用 iPhone 直接掃描 BLE, 解析完就用 `CocoaMQTT` 丟上 MQTT Broker。 這樣我不用 Raspberry Pi,就能把 BLE 資料餵進 Homebridge、HomeKit、甚至 Grafana~
iOS App 客製化 上架。
iOS 軟體開發、修改、維護既有App
IT/程式 > iPhone/iPad/Mac應用程式開發
$ 10000
$ 10000
0 / 1000