为啥 CBPeripheral 标识符和 UUID 不同?

Posted

技术标签:

【中文标题】为啥 CBPeripheral 标识符和 UUID 不同?【英文标题】:Why CBPeripheral identifier and UUID are different?为什么 CBPeripheral 标识符和 UUID 不同? 【发布时间】:2016-11-14 08:41:25 【问题描述】:

我有知道 UUID 的 iBeacon。如果我从 android 设备搜索此信标 - 我可以准确地看到此 UUID。

但是,当我从 ios 设备搜索此 iBeacon 时,无法使用此 UUID 找到它。我发现外围设备的标识符与 UUID 不同。

func centralManagerDidUpdateState(_ central: CBCentralManager) 
  let serviceUUID: CBUUID = CBUUID(string: "e2c56db5-dffb-48d2-b060-d0f5a71096e0")
  central.scanForPeripherals(withServices: [serviceUUID], options: nil)

为什么它们不同?如何搜索具有已知 UUID 的外围设备?

【问题讨论】:

服务 UUID 与设备 UUID 不同。此外,“纯”iBeacon 只能通过 CoreLocation 发现。另一个信息:如果您不与它们配对,BLE 中设备的 UUID 机会(它们是时间戳、读取 UUID 等之间的混合)。 【参考方案1】:

我怀疑您在 Android 上“发现”的不是 iBeacon 的 ProximityUUID,而是另一种 UUID(例如 Larme 在他的评论中建议的 GATT 服务。)有许多不同的 UUID 用于不同的蓝牙的东西。您想要的 iBeacons 称为 Proxmity UUID。

您可以尝试使用Locate App. 等专用信标扫描仪查看 Proximity UUID 如果您可以使用此应用看到信标,并且将其识别为 iBeacon,您也应该能够使用 CoreLocation 检测到它iOS 是这样的:

let region = CLBeaconRegion(proximityUUID: UUID(uuidString: "11111111-2222-3333-4444-c0765a17c9ab")!, identifier: "myBeacons")
locationManager.delegate = this
locationManager.startRangingBeacons(in: region)

您不能使用 CoreBluetooth API 来检测 iBeacon,因为 iOS 会阻止使用 CoreBluetooth 来检测 iBeacon。另请注意,在 iOS 上设置信标测距还有几个步骤(请求权限、定义回调方法),因此请查看 here 之类的教程。

【讨论】:

以上是关于为啥 CBPeripheral 标识符和 UUID 不同?的主要内容,如果未能解决你的问题,请参考以下文章

使用java.util.UUID生成唯一标识,为啥生成唯一标识的方法有些还需要参数?

NSUUID 到 NSString 从 (CBPeripheral *)aPeripheral

CBPeripheral Service 似乎是不可见的

蓝牙Mesh简介设备标识:UUID和Mesh地址

Linux系统固定磁盘标识符之wwid和uuid

Golang常用库之UUID