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
相关产品推荐
相关产品推荐

