【问题标题】:nRF52 Service Discovery doesn't happen on iOSnRF52 服务发现不会在 iOS 上发生
【发布时间】:2021-06-13 20:10:16
【问题描述】:

我在发现服务时遇到了一些问题。

似乎可以毫无问题地连接到 Android,但在 iOS 上连接失败。从运行测试连接来看,似乎没有发现服务。在示例或文档中,我没有看到有关连接上此问题服务发现的任何信息。 这是因为 gatt 服务的开发者给了我新服务的更新,所以我必须将 ipad 置于飞行模式,是否有针对此问题的编程解决方案?

有人有什么建议吗?

【问题讨论】:

    标签: ios swift core-bluetooth service-discovery nrf52


    【解决方案1】:

    听起来您在发现新添加的 BLE 服务时遇到了问题。这很可能是由 iOS 缓存您的设备信息引起的。为此,您应该使用 Service Changed Characteristic。

    根据Bluetooth Core specification,版本 5.2,卷。 3, Part G, 7 DEFINED GENERIC ATTRIBUTE PROFILE SERVICE 服务改变的特征是

    如果可以添加、更改或删除服务器上的服务定义,则必须这样做;否则可选

    来自 Apple 的 Accessory Design Guide 还声明:

    仅当配件具有能力时,配件才应实现服务更改特性 在其生命周期内更改其服务。 设备可以使用 Service Changed 特性来确定它是否可以依赖先前读取的 (缓存)来自设备的信息。请参阅蓝牙 4.0 规范,第 3 卷,G 部分,部分 7.1.

    【讨论】:

    • 感谢您的回答,但我不明白解决方案我究竟应该怎么做,清除缓存?或者到底是什么?你能给我举个例子吗
    • 您必须在外围设备上实现“服务更改特征”。你用的是什么设备?
    • 对不起,但我不明白你的答案,我的工作是发现服务而不是“实施服务已更改”,所以我启用通知(如果它们存在)并写入或读取我需要的内容,我正在使用核心蓝牙,我用的是iPad pro,但我认为不是设备问题
    • 您无法在 iPad 上解决问题,必须在蓝牙设备本身上解决。 Core Bluetooth 会保存您的所有设备信息,并且不会寻找新服务,除非蓝牙设备具有我所说的服务。它可以防止 Core Bluetooth 缓存设备数据。也许其他人对你有更好的解决方案,这是我知道的唯一一个。
    【解决方案2】:

    经过很多天,我找到了解决方案,您应该像这样发现您的外围设备,

    print("peripheral peripheral.name \(advertisementData)")
    guard let nameAdvertisementData = advertisementData["kCBAdvDataLocalName"] as? String else {
            return
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多