You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift下MbientLab设备MAC获取与MAC连接方案咨询

解决方案:iOS Swift 对接 MbientLab MetaWear 设备的MAC相关需求

一、从扫描结果中获取未连接设备的MAC地址

iOS CoreBluetooth框架不会直接暴露蓝牙设备的MAC地址,但MbientLab设备的广播数据包中包含了MAC信息,可通过解析设备的制造商数据提取。

修改你的扫描代码,添加MAC解析逻辑:

MetaWearScanner.shared.startScan(allowDuplicates: false) { (device: MetaWear) in
    let id = device.peripheral.identifier.uuidString
    var macAddress: String?
    
    // 解析MbientLab广播中的制造商数据提取MAC
    if let advertisementData = device.peripheral.advertisementData,
       let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data {
        // MbientLab的厂商ID为0x0277,广播数据中以小端序存储为[0x77, 0x02]
        if manufacturerData.count >= 8 && manufacturerData.subdata(in: 0..<2) == Data([0x77, 0x02]) {
            // 后续6字节为MAC地址(小端序),反转后转为大端格式匹配设备印刷值
            let macBytes = manufacturerData.subdata(in: 2..<8).reversed()
            macAddress = macBytes.map { String(format: "%02X", $0) }.joined(separator: ":")
        }
    }
    
    if let mac = macAddress {
        logger.trace("Found metawear device name:'\(device.name ?? "Unknown")' id:\(id) MAC:\(mac)")
        self.foundDevicesById[id] = device
        // 可将MAC与设备关联存储,供用户选择
    } else {
        logger.trace("Found metawear device but failed to extract MAC: \(device.name ?? "Unknown")")
    }
}

二、通过给定MAC地址连接MbientLab设备

iOS出于隐私限制,不支持直接通过MAC地址获取未扫描到的蓝牙设备,需通过扫描筛选出目标MAC对应的设备后再连接:

1. 扫描并匹配目标MAC

// 用户输入的目标MAC(格式示例:"AA:BB:CC:DD:EE:FF")
let targetMac = "AA:BB:CC:DD:EE:FF"
var targetDevice: MetaWear?

MetaWearScanner.shared.startScan(allowDuplicates: false) { (device: MetaWear) in
    guard let mac = self.extractMacFromDevice(device) else { return }
    
    if mac.uppercased() == targetMac.uppercased() {
        targetDevice = device
        MetaWearScanner.shared.stopScan()
        self.connectToDevice(device)
    }
}

// 提取MAC的工具方法
private func extractMacFromDevice(_ device: MetaWear) -> String? {
    guard let advertisementData = device.peripheral.advertisementData,
          let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data else {
        return nil
    }
    if manufacturerData.count >= 8 && manufacturerData.subdata(in: 0..<2) == Data([0x77, 0x02]) {
        let macBytes = manufacturerData.subdata(in: 2..<8).reversed()
        return macBytes.map { String(format: "%02X", $0) }.joined(separator: ":")
    }
    return nil
}

2. 连接设备并获取MetaWearBoard

private func connectToDevice(_ device: MetaWear) {
    device.connectAndSetup().continueWith { task in
        if let error = task.error {
            logger.error("Failed to connect: \(error.localizedDescription)")
        } else if let board = task.result {
            logger.trace("Connected to device with MAC: \(self.extractMacFromDevice(device) ?? "Unknown")")
            // 此处可复用Android端的业务逻辑,基于board操作传感器
        }
    }
}

补充说明

  • 若设备已配对,可通过CoreBluetooth的retrieveConnectedPeripherals(withServices:)方法快速获取,但未配对设备仍需扫描匹配。
  • 所有MAC匹配需统一大小写格式,避免因大小写差异导致匹配失败。

内容的提问来源于stack exchange,提问作者steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:21:55