我正在开发一个信标检测应用程序,目前非常适用于kontakt品牌信标。
客户向我发送了一些我从未见过的新信标,并且我已经搜索了谷歌,但我找不到他们的品牌。
以下与他们给我的这个灯塔有关的信息:
uuid: fda50693-a4e2-4fb1-afcf-c6eb07647825
pass: 000000
name: ion_beacon00021
major: 16789
minor: 24532
我已将我的代码转换为监控两个uuid而不使其正常工作
for (index, beaconID) in beaconsIds.enumerated() {
let beaconUUID = UUID(uuidString: beaconID)!
let identifier = "BLERegionBeacon \(index)"
let beaconRegion = CLBeaconRegion(proximityUUID: beaconUUID, identifier: identifier)
self.locationManager?.startMonitoring(for: beaconRegion)
self.locationManager?.startRangingBeacons(in: beaconRegion)
}
func configureLocationManager() {
self.locationManager = CLLocationManager()
self.locationManager!.delegate = self
self.locationManager!.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager!.distanceFilter = kCLDistanceFilterNone;
self.locationManager!.activityType = CLActivityType.automotiveNavigation;
for region in self.locationManager!.monitoredRegions {
self.locationManager?.stopMonitoring(for: region)
}
if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways {
self.locationManager?.requestAlwaysAuthorization()
}
self.locationManager!.startUpdatingLocation()
}
如果没有找到如何使这个新的ibeacon工作我已经使用第三方应用程序(如MyBeacon
,Detector
,Beacon Demonstrator
,Locate
)来验证是否我对这个信标的信息是正确的,但在任何应用程序中我都无法检测到这个信标。
我买了一个新电池,以确保它不那么简单,但两者都没有。:'(
我有想法使用任何检测蓝牙设备的应用程序,我发现BLE Scanner
。有了这个应用程序,我很幸运,并且可以意识到至少我对信标的名称是正确的,但没有找到任何与major or minor or pass
相关的名称。我也认为在那里看到的长身份可能是正确的,我没有...但我放弃了它,因为当我连接品牌kontakt也给了我一个不同的uuid。
ISCONNECTABLE
在YES和NO之间跳转。
当我使用BLE Scanner
检测信标Kontakt
时,显示名为SERVICEDATA
和ISCONNECTABLE
的附加信息仍为YES。
- 检测这些信标还有什么需要做的吗?
- 任何人都知道可能会发生什么?
非常感谢
修改
在davidgyoung的帮助下,我可以意识到Locate应用程序是否有效,但仅限于其Android版本。事实上,首先正确地返回我从该信标中获得的信息。
我发现这些信标可以使用名为BeaconFlyer的应用程序进行配置,在那里我意识到了发送给我的密码的原因。我能够改变uuid
虽然奇怪但我只是放数字而不是字母。我按照8-4-4-4-12的相同模式将其改为32个零。我仍然没有在IOS中获得任何结果但是在Android上工作,即使在更改了uuid之后。
有些品牌可能需要通过iOS设备检测才能被认证,并且Android没有这些限制。
编辑2
考虑到所有这些细节,似乎问题是IOS而不是android,所以我想到,如果我创建一个简单的android项目来测试信标的功能,我应该能够检测到它。
测试是通过注册这个UUID f7826da6-4fa2-4e98-8024-bc5b71e0893e
来完成的,这个UUID始终适用于我,并且我在没有任何问题的情况下检测到信标标记为kontakt
。
令我惊讶的是,即使没有注册我为这个品牌拥有的UUID,我也能毫无问题地检测到它。考虑到只注册1个标记为kontakt
答案 0 :(得分:5)
如果您使用相同的代码检测另一个信标,那么最简单的解释是您给出的ProxmityUUID是错误的。
您将无法从iOS上的BLE扫描仪确定正确的ProximityUUID,因为iOS阻止访问iBeacon广告,除非您事先知道ProximityUUID。如果您可以使用Android设备,则可以使用“定位”应用查看任何信标,无论其标识符如何。 https://play.google.com/store/apps/details?id=com.radiusnetworks.locate&hl=en您可以使用它来查明它实际发送的内容。如果您可以访问Mac,也有类似的MacOS应用程序。
答案 1 :(得分:3)
很明显,您的客户向您发送了“信标”,而不一定是“我信标”。正如davidyoung指出的那样,构成iBeacon的是specified (quite strictly) by Apple。如果您愿意的话,请从那里下载规格并查看。
我使用了几台BLE扫描仪来检查我使用的各种品牌iBeacons的uuid,major和minor数字,其中包括提到的BLE扫描仪。我认为规范并没有阻止以某种方式将额外的服务放入iBeacon,这导致不同的品牌iBeacons可能在不同的扫描仪中显示略有不同的信息。
但是,您在屏幕截图中显示的内容以及isconnectable
字段切换值的事实让我认为这些信标无法正常工作。
然后会有没有方式让它们在iOS上运行。您可以编写自己的蓝牙协议代码来处理它们,但这不会依赖Apple的iBeacon机制。这意味着即使应用程序暂停等区域监控等好东西也无法正常工作。这也可能是更多的电池耗尽,通常更多的工作。
我说的不是蓝牙专家,但是学到了很多:UUIDs 遍布各种规格。您(和Apple)引用的UUID是iBeacon应该发送的数据包的一部分,但我也看到UUID识别出一般的BLE 服务在(非Apple)参考文件中。当您扫描这样的信标并在几个地方看到UUID(或至少看起来像的字符串)时,这会让人感到困惑。因此,即使您遵循规范的信标(或者可以按照某种方式配置),我的猜测是有人搞砸了。例如,他们可以编辑(甚至使用硬连线和工具)错误的 UUID,而不是设置您需要使用的那个,但是意外地覆盖了将设备指定为iBeacon的部分(我想到了数据包的字节5和6,使您无法使用它们。
作为建议,我建议如下:如果您的客户对实际的iBeacon功能感兴趣,请告诉他们他们应该购买正确的信标。 kontakt实际上相当不错。我已经测试了廉价的中国仿制品,并建议反对那些,因为它们很快变得不可靠。最初节省一些钱可能很诱人,但如果你需要不断更换信标,那么最终会变得更加昂贵。
答案 2 :(得分:2)
关于可能发生的事情的另一个理论:
实施iBeacon的信标广告包必须具有Apple的制造商代码004c才能被iOS检测到。 Android没有这样的限制。如果这个信标发送不同的制造商代码,它将解释为什么只有Android才能检测到它。
你怎么知道这是真的?您需要以某种方式查看广告的原始字节。
答案 3 :(得分:1)
灯塔品牌是Iotton,它看起来像我们卖的那个: https://www.beaconzone.co.uk/ibeacon/ton9108
Kontakt应用程序不太可能显示Iotton信标,因为本地名称不正确。它更有可能是你的Kontakt灯塔 - 暂时关闭它。有了这个或任何信标,获得UUID并查看信标是否正常工作的最佳应用是Nordic nRF Connect。
答案 4 :(得分:1)
您确定已在CLLocationManager
设置了委托吗?代码没有显示,所以除非这是在上面或下面,你需要添加:
self.locationManager?.delegate = self
然后确保您的类实现CLLocationManagerDelegate
didRange(beacons: region:)
方法来获取回调。
如果您认为自己已经进行了此设置,则会显示该代码可能会显示其他缺少的内容,导致其无法正常工作。