调用 writeValue 后,CBPeripheral 与 UnknownError Code=0 断开连接
CBPeripheral being disconnected with UnknownError Code=0 after calling writeValue
我正在开发一个使用蓝牙与智能设备通信的应用程序。
需要授权iPhone 方案如下:
- 使用一些服务 UUID 过滤器扫描设备
- 连接到设备、发现服务、发现特征
- 调用读取操作以检索 public 个键
- 交换收到 public 个密钥(使用 ECDH)
- 生成令牌
- 使用 writeValue
将加密令牌(使用 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 密钥的几个特征,需要读取、加密然后发回,因此我读取和写入的顺序密钥很重要。由于 writeValue
和 readValue
是异步的,所以我的命令误入歧途了。我一开始维持秩序,一切都像时钟一样运转。
我正在开发一个使用蓝牙与智能设备通信的应用程序。 需要授权iPhone 方案如下:
- 使用一些服务 UUID 过滤器扫描设备
- 连接到设备、发现服务、发现特征
- 调用读取操作以检索 public 个键
- 交换收到 public 个密钥(使用 ECDH)
- 生成令牌
- 使用 writeValue 将加密令牌(使用 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 密钥的几个特征,需要读取、加密然后发回,因此我读取和写入的顺序密钥很重要。由于 writeValue
和 readValue
是异步的,所以我的命令误入歧途了。我一开始维持秩序,一切都像时钟一样运转。