iOS 中的 iBeacons - 没有来自实际 BLE 设备的回调,但是当另一个 iOS 设备用作广播器时会调用 didRangeBeacons
Posted
技术标签:
【中文标题】iOS 中的 iBeacons - 没有来自实际 BLE 设备的回调,但是当另一个 iOS 设备用作广播器时会调用 didRangeBeacons【英文标题】:iBeacons in iOS - no callbacks from actual BLE device but didRangeBeacons gets called when another iOS device is used as broadcaster 【发布时间】:2014-10-28 06:34:35 【问题描述】:我使用传感器标签作为广播器蓝牙低功耗设备,我无法识别方法 didRangeBeacons 中提到的信标阵列,在接收器应用程序 ios 设备上返回 0 计数。由于在此数组中没有观察到此类设备,因此无法找出 Proximity UUID、主要和次要值。
另一方面,当我将其他 iOS 设备用作广播器,然后尝试在方法 didRangeBeacons 中打印日志时,它为我们提供了带有信标的数组,这使我可以获取邻近 UUID、主要 &次要值。
我不怀疑代码中有任何问题,因为我测试了 2 个 ios 设备,其中广播应用程序安装了 2 个不同的 UUID,当注册相同的 UUID 以接收来自任何 BLE 广播公司的信号时,相同的 UUID 在接收器应用程序中发出信号。
我怀疑-
-
任何一个外部 BLE 设备(德州仪器的传感器标签)都没有创建我们可以接收信号的区域。
我们可能需要在 .plist 文件或 Xcode 中进行一些额外的设置,以接收来自除 iOS 设备之外的任何其他 BLE 设备作为广播器的信号。
为广播者和接收者注册的 UUID 可能不匹配以获取 didRangeBeacons 中的信号。
有人遇到过这个问题吗?请提出建议。
代码:
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
_beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:1 identifier:identifier];
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = YES;
self.beaconRegion.notifyEntryStateOnDisplay = YES;
[_locationManager startRangingBeaconsInRegion:_beaconRegion];
[_locationManager startMonitoringForRegion:_beaconRegion];`
【问题讨论】:
将您的代码放在您开始监控或开始测量信标的位置 请稍等。添加代码。_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self; NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString]; _beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:1 minor:1 identifier:identifier]; self.beaconRegion.notifyOnEntry = YES; self.beaconRegion.notifyOnExit = YES; self.beaconRegion.notifyEntryStateOnDisplay = YES; [_locationManager startRangingBeaconsInRegion:_beaconRegion]; [_locationManager startMonitoringForRegion:_beaconRegion];`
请点击您问题标签下方的“编辑”按钮并在此处添加代码
您是否在 SensorTag 上设置了主要 1 和次要 1? uuidString
是否与 SensorTag 上的 uuid 匹配?
【参考方案1】:
TI SensorTag 不能作为 iBeacon“开箱即用”运行。您需要安装iBeacon specific firmware from TI。除非您与 Apple 签署了 iBeacon 许可协议,否则 TI 不会提供此固件。
如果您不想通过 Apple 许可流程,我建议您查看其他信标硬件。
【讨论】:
谢谢保罗.. 我会检查的。【参考方案2】:最可能的解释是:
您的 SensorTag 未传输与上述代码中配置的 CLBeaconRegion 相同的 UUID/major/minor。
您的 SensorTag 根本没有传输格式良好的信标广告。
仅使用 iOS 设备很难解决此问题,因为 CoreLocation 固执地拒绝告诉您任何事情,除非一切都完全匹配,包括标识符。
如果您可以访问 android 4.3+ 设备或 OSX 机器,您可以使用这些来检查 SensorTag 广告,看看它是否发送了正确的信息。在 OSX 上,您可以尝试 ScanBeacon,它会显示所有信标广告,而不管标识符如何。在Android上,您可以使用Bluetooth LE Scanner.
如果您没有任何此类工具来检查您的传输,那么您应该简单地检查其配置,直到您确定它使用正确的标识符进行广播。
编辑: BLE Scanner 的输出应如下所示:
【讨论】:
感谢大卫的回复。我确实检查了蓝牙 LE 扫描仪,它返回了一些关于 GAP、GATT、设备信息的值,其余的所有其他列表都有未知服务。我可以在 GAT、GATT 的很多地方看到 UUID。但这将是我在监控时必须使用的 ID。此外,默认情况下,传感器标签正在广播的主要和次要值在哪里。 您能否附上您在蓝牙 LE 扫描仪上看到的屏幕截图? 谢谢大卫。我确实在“蓝牙 LE 扫描仪”android 应用程序中观察到 TI 传感器标签不显示 UUID、传感器标签作为广播者的主要和次要值。另一方面,当我将其他 iOS 设备作为广播器检查时,我可以看到这些值,这就是我从其他 iOS 设备获取信号的原因。 这告诉我您的 SensorTag 未配置为向 I 发送信标广告。您需要使用正确的固件对其进行刷新。以上是关于iOS 中的 iBeacons - 没有来自实际 BLE 设备的回调,但是当另一个 iOS 设备用作广播器时会调用 didRangeBeacons的主要内容,如果未能解决你的问题,请参考以下文章
Venmo 如何通过 iBeacon 功能将应用程序带入 iOS 前台?
了解 iOS 中的 iBeacons:didDetermineState 和 didEnterRegion 事件