【问题标题】:New ibeacons not detected in my app在我的应用程序中未检测到新的 ibeacons
【发布时间】:2017-12-31 23:57:15
【问题描述】:

我正在开发一个信标检测应用程序,目前非常适用于 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 工作时,我求助于第三方应用程序(如 MyBeaconDetectorBeacon DemonstratorLocate)来验证我所拥有的关于这个信标的信息是否是正确,但在任何应用程序中我都无法让它检测到这个 ibeacon。

我买了一块新电池来确保它不是那么简单,但也不是那么简单。 :'(

我有使用任何检测蓝牙设备的应用程序的想法,我找到了BLE Scanner。有了这个应用程序,我很幸运,并且可以意识到至少我拥有的信标名称是正确的,但没有找到与major or minor or pass 相关的任何内容。我还认为那里看到的长 id 可能是正确的,而我所拥有的不是......但我放弃了它,因为当我连接品牌时,kontakt 也给了我一个不同的 uuid。

ISCONNECTABLE 在 YES 和 NO 之间跳转。

当我使用BLE Scanner 检测信标Kontakt 时,显示名为SERVICEDATAISCONNECTABLE 的附加信息仍为YES。

- 检测这些信标是否需要做其他事情?

- 有人知道发生了什么吗?

非常感谢

编辑

davidgyoung 的帮助下,我可以意识到 Locate 应用程序是否可以正常工作,但仅限于 android 版本。事实上,我一开始就正确地返回了我从那个信标那里得到的信息。

我发现这些信标可以使用一个名为 BeaconFlyer 的应用程序进行配置,并且在那里我意识到了发送给我的密码的原因。我能够更改uuid,尽管奇怪的是我只输入了数字而没有输入字母。我按照 8-4-4-4-12 的相同模式将其更改了 32 个零。即使在更改 uuid 之后,我仍然在 IOS 上没有得到任何结果,但在 android 上也可以工作。

可能有些品牌需要经过认证才能被iOS设备检测到,而android没有这些限制。

编辑 2

考虑到所有这些细节,问题似乎是 IOS 而不是 android,所以我想到如果我创建一个简单的 android 项目只是为了测试信标的功能,我应该能够检测到它。

测试是通过注册这个 UUID f7826da6-4fa2-4e98-8024-bc5b71e0893e 来完成的,它一直对我有用,我可以毫无问题地检测到信标标记kontakt

令我惊讶的是,即使没有注册我为这个品牌所拥有的 UUID,我也能毫无问题地检测到它。考虑到只注册 1 个 UUID 即标记 kontakt,这很奇怪

【问题讨论】:

    标签: ios swift bluetooth bluetooth-lowenergy ibeacon


    【解决方案1】:

    很明显,您的客户向您发送了“信标”,而不一定是“i信标”。正如 davidyoung 所指出的,构成 iBeacon 的是specified (quite strictly) by Apple。如果您愿意,请从那里下载规格并查看。

    我使用了几个 BLE 扫描仪来检查我使用的各种品牌 iBeacons 的 uuid、主要和次要编号,其中包括提到的 BLE 扫描仪。我认为规范不会阻止以某种方式将附加服务放入 iBeacon,这会导致不同品牌的 iBeacon 可能在不同的扫描仪中显示略有不同的信息。 但是,您在屏幕截图中显示的内容以及 isconnectable 字段切换值的事实让我认为这些信标无法正常工作。

    届时将有没有方法让它们在 iOS 上以这种方式工作。您可以编写自己的蓝牙协议代码来处理它们,但这将不依赖于 Apple 的 iBeacon 机制。这将意味着即使在应用程序暂停等情况下,区域监控等好东西也将不起作用。这也可能会消耗更多的电池,并且通常需要更多的工作。


    正如我所说,我不是蓝牙专家,但学到了很多:UUID 在规范中。您(和 Apple)引用的 UUID 是 iBeacon 应该发送的 数据包 的一部分,但我也看到 BLE 一般服务被 UUID 识别在(非 Apple)参考文档中。当您扫描这样的信标并在多个地方看到 UUID(或至少看起来像字符串的字符串)时,这可能会让人感到困惑。因此,即使您拥有的信标遵循规范(或者可以配置为以某种方式这样做),我的猜测是有人搞砸了。例如,他们可能编辑了(甚至可能使用硬连线连接和工具)错误 UUID,没有设置您需要使用的 UUID,而是意外覆盖了将设备指定为 iBeacon 的部分(想到数据包的第 5 和第 6 个字节),使您无法使用它们。

    作为建议,我建议如下:如果您的客户对 iBeacon 的实际功能感兴趣,请告诉他们应该购买正确的信标。 kontakt 的实际上相当不错。我已经测试过廉价的中国仿冒品,并建议不要使用它们,因为它们很快就会变得不可靠。一开始可能会节省几块钱,但如果您需要从长远来看不断更换信标,最终会变得更加昂贵。

    【讨论】:

    • 在这种情况下,问题的作者表示他能够检测到信标并使用 Android 扫描仪将它们解析为 iBeacon 格式。这是我碰巧写的,所以我知道它使用预期的 Apple iBeacon 格式对它们进行解码,不同之处在于它更能容忍不同的制造商代码。有关详细信息,请参阅我的回答,从“关于可能发生的事情的另一种理论”开始。
    • 嗯,然后验证它,我会说:它是一个信标,但不是一个 iBeacon,Apple 想要它。制造商代码(我假设您的意思是规范中的字节 5 和 6,对吗?)应该是固定的,afaik。当框架刚刚问世时,我已经与设计自己的信标的人交谈过,起初很多人虽然应该输入自己的“公司代码”,但结果总是需要为 0x4C 和 0x00。
    【解决方案2】:

    关于可能发生的事情的另一种理论:

    实现 iBeacon 的信标广告包必须具有 Apple 的制造商代码 004c 才能被 iOS 检测到。 Android没有这样的限制。如果此信标发送的是不同的制造商代码,它将解释为什么只有 Android 可以检测到它。

    您如何确定这是否属实?您需要以某种方式查看广告的原始字节。

    【讨论】:

      【解决方案3】:

      您确定已将代理设置为CLLocationManager?代码没有显示它,所以除非它位于上方或下方,否则您需要添加:

      self.locationManager?.delegate = self

      然后确保您的类实现CLLocationManagerDelegatedidRange(beacons: region:) 方法以获取回调。

      如果您认为您已经进行了此设置,则显示该代码可能会发现其他缺失的内容,从而使其无法正常工作。

      【讨论】:

      • 当然。如果不是这种情况.. 甚至无法检测到信标标记 kontakt。检查我的代码更新
      【解决方案4】:

      Beacon 品牌是 Iotton,它看起来像我们销售的那个: https://www.beaconzone.co.uk/ibeacon/ton9108

      Kontakt 应用程序不太可能显示 Iotton 信标,因为本地名称不正确。它更有可能是您的 Kontakt 信标 - 暂时将其关闭。使用此信标或任何信标,获取 UUID 并查看信标是否正常工作的最佳应用是 Nordic nRF Connect。

      【讨论】:

        【解决方案5】:

        如果您检测到另一个具有相同代码的信标,那么最简单的解释是给您的 ProxmityUUID 是错误的。

        您将无法通过 iOS 上的 BLE 扫描仪确定正确的 ProximityUUID,因为除非您事先知道 ProximityUUID,否则 iOS 会阻止访问 iBeacon 广告。如果您可以使用 Android 设备,则可以使用定位应用程序查看任何信标,而不管其标识符如何。 https://play.google.com/store/apps/details?id=com.radiusnetworks.locate&hl=en 您可以使用它来找出它实际发送的内容。如果您可以使用 Mac,也有适用于 MacOS 的类似应用程序。

        【讨论】:

        • 嗨,大卫...紧贴the ProxmityUUID you were given is wrong。很奇怪,因为使用Locate 应用程序我可以检测到 kontakt 标记,而无需之前添加 uuid。
        • 如果您在谈论 Locate for iOS,那么它开箱即用地检测 Kontakt 的原因是因为该应用程序已预先配置为查看 Kontakt 的默认 UUID。我知道,因为我是将其放入应用程序的作者。
        • 嗨,如果您检测到此信标,您给我的应用程序实际上是...我可以检测到我从信标获得的信息是正确的,谢谢。现在,您碰巧知道了未检测到此信标的原因是什么,无论我在我的应用程序和第三方应用程序中记录了多少数据
        • 好的,那么您确认 ProximityUUID 是否符合您的预期吗? Locate 是否将 UUID 显示为“fda50693-a4e2-4fb1-afcf-c6eb07647825”?
        • @Gero,我写了一篇关于这个的博客文章。虽然您确实可以在 CoreBluetooth 中获得回调以发现 iBeacon,但如果 iOS 发现广告格式与 iBeacon 布局匹配,它实际上会清除广告数据。所以回调是毫无价值的。在这里阅读更多:davidgyoungtech.com/2013/10/21/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 2015-03-26
        相关资源
        最近更新 更多