在iOS上同时使用外围设备和中央设备

时间:2013-07-18 19:32:05

标签: ios objective-c core-bluetooth

我看了无处不在并尝试了所有内容,但似乎没有任何效果:(

在iOS上,我正在制作iOS设备需要交换数据的应用(适用于iOS 6及更高版本)。因此,两个设备需要同时是外围设备和中心设备。我完全按照WWDC视频中的规定完成了,但设备无法相互成功连接。

当我创建一个中央设备和另一个外围设备时,中央将无缝连接到外围设备。

但是,当两个设备同时是外围设备和中心设备时,我会收到随机错误:在任何阶段(发现服务/特性或将通知值设置为YES)有时会发生错误,有时会发生{{1甚至没有调用discoverServices

我应该做些什么吗?我只是将外设和中央代码合并到一个视图控制器中。我注意到,如果设备“a”连接到设备“b”,然后然后设备“b”连接到设备“a”,它就会更频繁地工作。我通过在每台设备上手动使用didDiscoverServices不同的时间来管理这个,但是我怎么能以可靠的(而不是手动预定义的)方式让一台设备先连接(然后另一台)呢? / p>

如果我收到错误,通常只是NSThread sleepForTimeInterval:

如果您需要任何代码或任何其他信息,请与我们联系:)

3 个答案:

答案 0 :(得分:22)

是的,它可以同时在两个角色中。您只需要初始化CBPeripheralManagerCBCentralManager。一旦外围设备管理器初始化并且您收到POWER ON状态,设备就会开始充当外围设备。您可以在此时添加服务并从其他设备接收连接。同时,您可以使用中央管理器扫描并启动与其他外围设备的连接。

请注意,即使它充当外围设备,也无法连接到您自己的设备。

对于您的错误,我建议:

  1. 在开始连接之前关闭扫描。也就是说,扫描,查找外围设备,停止扫描,连接。连接和扫描彼此不喜欢。
  2. 使用专用队列处理蓝牙事件,而不是主队列。 [[CBCentralManager alloc] initWithDelegate:self queue:my_dedicated_bluetooth_q]
  3. 不幸的是,堆栈有时会变得不稳定。甚至可以重启。但这通常只发生在重负载或多个同时连接的情况下。希望这将在iOS7中得到改进。
  4. 最近,几个开发人员开始出现这个不为人知的Unknown error。从您的描述来看,可能有很多原因可能导致您的设置失败,并且需要更多信息才能更好地解决SO问题。
  5. 有关详情,建议您搜索bluetooth-dev邮件列表档案https://lists.apple.com/archives/Bluetooth-dev或发送邮件Bluetooth-dev@lists.apple.com。如果你接近这样的合理问题,社区会提供很大的帮助。

答案 1 :(得分:0)

首先,你是什么意思“同时”? 如果您的意思是设备在扫描其他设备时向其他设备做广告,则不能。 但是你可以创建两个与广告和扫描共享相同锁定的线程。 在扫描之前,停止广告,在广告之前,停止扫描。 我在我的iPhone 4s和iPad上测试过,效果很好。

答案 2 :(得分:-1)

根据我的理解,一台设备可以一次使用一种模式。也就是说,如果设备在外围模式下工作,那么你就无法将其作为一种中心模式。如果你看到一些标准的例子,如BTLE transfer或lilke Light Blue,那么它们一次只能在一种模式下工作