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

