我正在尝试在两个iOS设备之间建立蓝牙连接。我们的想法是,一台设备提供服务,并且多台设备连接到它:
设备A(服务):用户在演示文稿中滑动
设备B(多个客户端):用户观看演示文稿,无需交互
根据我的理解,提供服务的人应该通过创建CBPeripheralManager并实现CBPeripheralManagerDelegate - >来宣传它并分别作为外围设备。设备A
另一方面,有多个中央设备使用CBCentralManager扫描外围设备并实现CBCentralManagerDelegate。建立连接后,他们使用CBPeripheral类和CBPeripheralDelegate - >向外设发送读写请求。设备B
现在我感到困惑:据我所知,设备A无法直接向设备B发送信息,甚至无法识别连接是否已建立或丢失。但是客户端(设备B)可以读取和写入数据并获得连接和断开通知。
所以我的第一个想法是交换角色。现在,中央设备通过扫描广告他们想要使用该服务的设备来提供服务(?!?),并且多个外围设备可以连接到一个中央设备。听起来好像一定是错的,对吧?问题就出现了:现在,如果建立或丢失了连接(aaahhhhh),那么外围设备(观看演示文稿的用户)就不会得到通知。
现在提出一个问题:是否有一种方法可以使iOS设备成为外围设备并识别连接和断开连接(应该包括按距离等连接)?
ADDED:在WWDC 2012 Session 705 (Link to presentation slides)中提到了中心方法:didConnect和central:didDisconnect。但即使在CBPeripheralManagerDelegate的iOS 7 beta文档中,也没有提到方法。也许这是一个死胡同,苹果现在正在嘲笑我......
感谢您的帮助!
本杰明
答案 0 :(得分:4)
您应该将设备A(演示者)作为外围设备,宣传服务,然后将设备B(观众)设置为中心,该中心订阅外围设备的服务。
当中央连接到外围设备时,您可以使用CBPeripheralManagerDelegate接收通知。以下是CBPeripheralManager委托方法的文档:CBPeripheralManagerDelegate Protocol Reference
这是您需要实现的方法,以识别中央(设备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
希望有所帮助!如果我能澄清一些事情,请告诉我。
劳拉
答案 1 :(得分:2)
从iOS 10.3.3开始我已经编写了一个应用程序,我将iPhone作为外围设备并使用BLE中央设备连接到它,因此iPhone无法直接知道连接时和断开连接时。
通知订阅或对特性的写命令/请求可以被认为是知道中央已连接的一种方式,但检测断开仍然是棘手的。我观察到,即使BLE中央断开连接,也确实“取消订阅”的特点是'在实际执行取消订阅之前,API不会被激活。
我所做的是使用一个计时器,每当“特征”写入时,它就会自动重启。收到了。当它超时时,我声明连接丢失了。
我不明白为什么Apple没有为这些小型的基本内容提供API,让我们的实施(和我们的生活)如此努力?!