调用 writeValue 后,CBPeripheral 与 UnknownError Code=0 断开连接

CBPeripheral being disconnected with UnknownError Code=0 after calling writeValue

我正在开发一个使用蓝牙与智能设备通信的应用程序。 需要授权iPhone 方案如下:

  1. 使用一些服务 UUID 过滤器扫描设备
  2. 连接到设备、发现服务、发现特征
  3. 调用读取操作以检索 public 个键
  4. 交换收到 public 个密钥(使用 ECDH)
  5. 生成令牌
  6. 使用 writeValue
  7. 将加密令牌(使用 AES)写入设备

就是这样,在那之后我有稳定的连接并且能够与我的智能设备交互(将值写入受保护的属性)。

问题是,当我重新启动我的应用程序并执行上述所有步骤时,除了 Step_5(因为我之前生成并验证了令牌),在 Step_6 委托方法 didWriteValueFor: 甚至没有被调用,而不是使用 Error Domain=CBErrorDomain Code=0 "Unknown error." UserInfo={NSLocalizedDescription=Unknown error.} 调用此委托方法 didDisconnectPeripheral 并且我无法将值写入受保护的特性。

我不知道我做错了什么。任何帮助都会很好。

UPD[0]:有时我可以在 Step_6 上收到 didWriteValueFor: 的回调,但立即(比如不到 0.5 秒)iPhone 因上述错误而断开连接。

UPD[1]:另外我在关闭我的应用程序之前尝试 cancelPeripheralConnection() 因为智能设备由于硬件原因不处理多个连接,但这里没有运气.

UPD[2]: 好吧,经过三天的资料搜索,我发现我完全在错误的方向上挖掘。问题是我用 Xcode 中的“停止”按钮中断了应用程序,并没有通过 iPhone 手动关闭它,因此, willTerminate 没有被调用,即使它被调用时,它执行所有应该执行的进程的时间非常有限,因此连接没有中断(未调用 cancelPeripheralConnection 方法),下一次我启动了应用程序,我尝试与已经连接到我的应用程序的设备建立连接。

至少它开始经常连接,但有时我仍然会收到此错误。主要问题是:如何正确断开与设备的连接?现在我取消订阅所有具有 isNotify: true 的属性(设置为 false)并调用 cancelPeripheralConnection。在断开连接之前是否需要等待“取消订阅”过程?

UPD[3]: 等退订完成没关系。至少没有影响。

好吧,我找到了出现断开连接的原因: 由于 Smart Device 具有 public 密钥的几个特征,需要读取、加密然后发回,因此我读取和写入的顺序密钥很重要。由于 writeValuereadValue 是异步的,所以我的命令误入歧途了。我一开始维持秩序,一切都像时钟一样运转。