2013-07-10 38 views
3

我试图在两个iOS设备之间建立蓝牙连接。这个想法是,一个设备提供的服务和多个设备连接到它:经由呈递CBPeripheralManager连接回调

设备B(多个客户端)用户幻灯片::

设备A(服务),用户观看的呈现,没有相互作用

在我的理解中一个它提供的服务应该做广告,并分别通过创建一个CBPeripheralManager是外围和落实CBPeripheralManagerDelegate - >设备

在另一边,也有其扫描外设多个中央设备使用CBCentralM anager和实现CBCentralManagerDelegate。建立连接后,他们使用CBPeripheral类和CBPeripheralDelegate - > Device B向外设发送读取和写入请求。现在我感到困惑:从我所理解的设备A不能直接发送信息到设备B甚至无法识别连接是否已建立或丢失。但客户端(设备B)可以读取和写入数据并获得连接并断开通知。

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

我们的问题是:有没有让iOS设备的外围和认识的连接和断开(其中应包括由距离等断开连接)的好办法?

ADDED:在WWDC 2012会话705 (Link to presentation slides)方法中央:didConnect和中央:didDisconnect提及。但即使在CBPeripheralManagerDelegate的iOS 7 beta文档中也没有提及这些方法。也许这是一个死胡同,苹果我是在笑,现在...

感谢您的帮助!

本杰明

+0

真的希望我能找到一些东西来获得连接的通知。运气好的话? – christophercotton

回答

3

你应该让设备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

希望帮助!让我知道我能否澄清一些事情。

劳拉

+0

我试过peripheralManager:central:didSubscribeToCharacteristic:但它永远不会被调用。签名表示它将在特色订阅上被调用,而不是在中心连接上。我仍然在寻找一种方式在中心连接时获得通知。 – Lensflare

0

正如上,我写了一个程序,我让iPhone作为外设并连接使用BLE中央设备到iOS 10.3.3的,还有为iPhone就知道没有直接的方法当它连接和断开时。

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

我所做的是使用一个计时器,每次收到'写入特性'时都会重新启动自己。当它超时时,我宣布连接丢失。

我不明白为什么苹果公司不为这些小的基本事情提供API,并使我们的实现(以及我们的生活)如此艰难?!