核心蓝牙:无法让iPhone(中心)和Mac(外设)配对。

4
我正在开发一款iPhone应用和一款Mac应用,它们通过蓝牙LE相互通信。iPhone是中心设备,而Mac是外围设备。我希望iPhone应用程序能够在重新启动后重新连接到Mac应用程序。因此,我将代表Mac的外围设备的UUID保存在NSUserDefaults中,然后当iPhone应用程序启动时,我调用-[CBCentralManager retrievePeripheralsWithIdentifiers:],传入UUID。虽然这个方法返回了外围设备,但是当我调用-[CBCentralManager connectPeripheral:options:]时,iPhone从未重新连接到Mac。根据这篇SO文章,问题在于两个设备需要配对,以使Mac的UUID持久化。这就带来了我的问题。我无论如何都无法让iPhone和Mac配对。根据Core Bluetooth编程指南的这一页,要求已配对的连接的方法是使外围设备设置特征的属性和权限为适当的值。我引用以下内容:

您可以通过设置适当的特征属性和权限来确保只有受信任的设备可以访问敏感特征值。继续上面的示例,要仅允许受信任的设备检索成员的电子邮件地址,请设置适当的特征属性和权限,如下所示:

emailCharacteristic = [[CBMutableCharacteristic alloc]
    initWithType:emailCharacteristicUUID
    properties:CBCharacteristicPropertyRead
    | CBCharacteristicPropertyNotifyEncryptionRequired
    value:nil permissions:CBAttributePermissionsReadEncryptionRequired];

然而,这并行不通。即使我正确地设置了特征的权限和属性,iPhone仍然可以在没有显示配对对话框的情况下读/写它。在其他地方,我被告知启动配对的方法是让外围设备拒绝具有不足身份验证错误的读/写请求。根据帖子,

要配对,您需要用不足身份验证错误响应写入请求。例如,对于iOS外围设备,您将编写以下内容:

- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
  ...

  [peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];

  ...
}

但这仍然不起作用!当Mac以不充分的身份验证错误拒绝写入请求时,iPhone会收到一个-[CBPeripheralDelegate peripheral:didWriteValueForCharacteristic:error:]回调,并显示一个错误,指出"身份验证不足"。没有配对对话框。我不知道该怎么办,如果无法使其工作,我考虑完全放弃Core Bluetooth。如果您有任何想法如何使其工作,请告诉我。


只是猜测:也许是因为您尝试“写入”特征值,但其权限仅允许“读取”?因此,即使配对成功,中心设备仍无法写入该特征值,因此不会启动配对过程。 - Michał Ciuba
1个回答

0

来自苹果DTS: “我已经与这里的其他工程师进行了核实,我们认为在两个iOS设备之间不可能出现配对弹出窗口,但是可以在iOS设备和BLE外围设备之间出现。”

因此,配对弹出窗口仅在iOS / Mac应用程序和外围设备之间发生。rdar时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接