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

iOS 7及以后版本下,如何通过CoreBluetooth识别扫描到的设备品牌?

如何用CoreBluetooth识别蓝牙设备品牌

这个问题问得很接地气!在iOS 7及以后版本用CoreBluetooth扫描蓝牙设备时,系统并没有直接提供一个能直接返回设备品牌的API,但我们可以通过几个间接的靠谱方法来识别品牌,下面给你详细拆解:

1. 从设备广播名称入手

很多厂商会把品牌名称直接嵌入蓝牙设备的广播名称里,比如AirPods会显示“AirPods”,戴尔的蓝牙外设可能会带“DELL”标识。你可以在扫描回调里读取广播数据的CBAdvertisementDataLocalNameKey字段,做关键词匹配:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    if let localName = advertisementData[CBAdvertisementDataLocalNameKey] as? String {
        switch true {
        case localName.contains("APPLE"), localName.contains("AirPods"), localName.contains("iPhone"):
            print("这是苹果品牌的设备")
        case localName.contains("DELL"):
            print("这是戴尔品牌的设备")
        case localName.contains("LENOVO"):
            print("这是联想品牌的设备")
        default:
            print("暂未识别到品牌,设备名称:\(localName)")
        }
    }
}

注意:这种方法有局限性,如果用户自定义了设备名称,识别就会失效,只能作为辅助手段。

2. 解析厂商专属广播数据(最靠谱的方法)

蓝牙广播里的CBAdvertisementDataManufacturerDataKey字段包含了厂商的官方标识——Company ID,这个ID是由蓝牙技术联盟(SIG)统一分配的固定值,不会被用户修改。比如苹果的Company ID是0x004C,戴尔是0x00D9,联想是0x01D1。

你可以在扫描回调里读取厂商数据,解析出前两个字节的Company ID,再对应到品牌:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    if let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data {
        guard manufacturerData.count >= 2 else { return }
        // 解析小端序的Company ID
        let companyID = UInt16(manufacturerData[0]) | UInt16(manufacturerData[1]) << 8
        switch companyID {
        case 0x004C:
            print("苹果品牌设备")
        case 0x00D9:
            print("戴尔品牌设备")
        case 0x01D1:
            print("联想品牌设备")
        default:
            print("未知品牌,对应的Company ID:\(companyID)")
        }
    }
}

这种方法准确率最高,唯一需要做的是提前收集好各个品牌对应的Company ID,你可以查蓝牙SIG的官方列表获取完整的ID对应关系。

3. 连接设备后识别专属服务UUID

有些品牌的设备会提供专属的蓝牙服务UUID,比如苹果的部分设备会包含其独有的服务UUID。这种方法需要先连接到设备,再发现它的服务列表来判断:

// 扫描到目标设备后发起连接
centralManager.connect(peripheral, options: nil)

// 连接成功后开始发现服务
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    peripheral.delegate = self
    peripheral.discoverServices(nil)
}

// 解析服务UUID
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else { return }
    for service in services {
        // 替换为目标品牌的专属服务UUID
        if service.uuid.uuidString == "0000FFE0-0000-1000-8000-00805F9B34FB" {
            print("这是某品牌的专属设备")
        }
    }
}

这种方法需要建立蓝牙连接,操作步骤更多,但识别精度更高,适合需要精准判断的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:24:39