我正在尝试设置两个iOS设备之间的蓝牙连接。其想法是,一个设备提供服务,多个设备连接到该服务:
设备A(服务):用户在演示文稿中滑动
设备B(多客户端):用户观看演示文稿,无交互
在我的理解中,提供服务的人应该通过创建CBPeripheralManager和实现CBPeripheralManagerDelegate -> Device A来通告它,并分别作为外围设备
另一方面,有多个中央设备,它们使用CBCentralManager扫描外围设备并实现CBCentralManagerDelegate。在建立连接之后,它们使用CBPeripheral类和CBPeripheralDelegate ->设备B向外围设备发送读写请求
现在我感到困惑了:据我所知,设备A不能直接向设备B发送信息,甚至不能识别连接是否已建立或丢失。但是客户端(设备B)可以读取和写入数据,并获得连接和断开连接通知。
所以我的第一个想法是交换角色。现在,中央设备通过扫描通告它们想要使用该服务的设备来提供服务(?!?)并且多个外围设备可以连接到一个中央设备。听起来肯定是错的,对吧?问题来了:现在,如果连接已经建立或丢失,外围设备(观看演示文稿的用户)将不再收到通知(aaahhhhh)。
现在来看问题:有没有一种好方法可以让iOS设备成为外设,并识别连接和断开(应该包括按距离等断开连接)?
添加:在WWDC2012 Session 705 (Link to presentation slides)中提到了方法central:didConnect和central:didDisconnect。但即使在CBPeripheralManagerDelegate的iOS 7Beta文档中也没有提到这些方法。也许这是个死胡同,苹果现在正在嘲笑我……
谢谢你的帮助!
本杰明
发布于 2014-01-14 16:01:50
您应该使设备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
希望这能有所帮助!如果我能澄清什么请告诉我。
劳拉
发布于 2017-09-20 13:11:55
在我写了一个应用程序的iOS 10.3.3上,我将iPhone作为外设,并使用BLE中央设备连接到它,iPhone没有直接的方法知道它何时连接和何时断开。
对特征的通知订阅或写入命令/请求可以被认为是知道中央已经连接的一种方式,但是检测断开仍然是棘手的。我观察到,即使当BLE中央断开连接时,'didUnsubscribeFromCharacteristic‘API也不会被激活,直到它真正自己取消订阅。
我所做的是使用了一个计时器,它会在每次收到“write to characteristic”时自动重启。当它超时时,我声明连接断开。
我不明白为什么Apple不为这么小的基础的东西提供API,让我们的实现(和我们的生活)变得如此困难?!
https://stackoverflow.com/questions/17574399
复制相似问题