技能誌

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
iOS App 客製化 上架。
$ 10000
iOS App 客製化 上架。
0 / 1000
回到文章列表