4

我正在尝试在两个 iOS 设备之间建立蓝牙连接。这个想法是一个设备提供服务并且多个设备连接到它:

设备 A(服务):用户在演示文稿中滑动

设备 B(多个客户端):用户观看演示,无交互

据我了解,提供服务的人应该通过创建 CBPeripheralManager 并实现 CBPeripheralManagerDelegate -> Device A 来宣传它并分别成为外围设备

另一方面,有多个中央设备使用 CBCentralManager 扫描外围设备并实现 CBCentralManagerDelegate。建立连接后,它们使用 CBPeripheral 类和 CBPeripheralDelegate -> Device B 向外围设备发送读写请求

现在我很困惑:据我了解,设备 A 无法直接向设备 B 发送信息,甚至无法识别连接是否已建立或丢失。但是客户端(设备 B)可以读取和写入数据并获得连接和断开连接通知。

所以我的第一个想法是交换角色。现在,中央设备通过扫描宣传他们想要使用该服务的设备(?!?)来提供服务,并且多个外围设备可以连接到一个中央设备。听起来它一定是错的,对吧?麻烦来了:现在外围设备(观看演示的用户)在连接已建立或丢失时不再收到通知(aaahhhhh)。

现在问题来了:有没有一种好方法可以让 iOS 设备成为外围设备并识别连接和断开连接(应该包括按距离断开连接等)?

添加:在 WWDC 2012 Session 705 (链接到演示幻灯片)中提到了方法 central:didConnect 和 central:didDisconnect。但即使在 CBPeripheralManagerDelegate 的 iOS 7 beta 文档中也没有提到这些方法。也许这是一条死胡同,苹果现在在嘲笑我……

谢谢你的帮助!

本杰明

4

2 回答 2

5

您应该使设备 A(演示者)成为外围设备,宣传服务,而设备 B(观众)成为中央设备,订阅外围设备的服务。

当中心连接到外围设备时,您可以使用 CBPeripheralManagerDelegate 获取通知。这是 CBPeripheralManager 委托方法的文档:CBPeripheralManagerDelegate 协议参考

这是您需要实现的方法来识别中央(设备 B,查看器)何时连接到您的外围设备(设备 A,演示者):

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic

这是您需要在中央(设备 B,查看器)与外围设备(设备 A,演示者)断开连接时识别的方法:

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic

当您需要通知订阅的中心(设备 B,观众)幻灯片已更改时,请使用此方法(newValue 将是演示文稿中更新位置的某种指示符,例如幻灯片编号):

[self.peripheralManager updateValue:newValue forCharacteristic:yourCharacteristic onSubscribedCentrals:nil];

如果您想通过一个简单的蓝牙 LE 演示与充当中央和外围设备的设备共享,您可以查看这个项目:SimpleShare

希望有帮助!如果我能澄清一些事情,请告诉我。

劳拉

于 2014-01-14T08:01:50.140 回答
4

从 iOS 10.3.3 开始,我编写了一个应用程序,将 iPhone 作为外围设备并使用 BLE 中央设备连接到它,iPhone 无法直接知道何时连接以及何时断开连接.

通知订阅或对特征的写入命令/请求可以被认为是了解中心已连接的一种方式,但检测断开连接仍然很棘手。我观察到,即使 BLE 中心断开连接,“didUnsubscribeFromCharacteristic”API 也不会启动,直到它自己实际取消订阅。

我所做的是使用一个计时器,每次收到“写入特征”时它都会自行重新启动。当它超时时,我声明连接丢失。

我不明白为什么 Apple 不为如此小的、基本的事物提供 API 并使我们的实现(和我们的生活)如此艰难?!

于 2017-09-20T05:11:54.950 回答