17

到处寻找并尝试了一切,但似乎没有任何效果:(

在 iOS 上,我正在制作一个 iOS 设备需要在其中交换数据的应用程序(适用于 iOS 6 及更高版本)。因此,这两个设备需要同时是外围设备和中心设备。我已经完全按照 WWDC 视频中的说明完成了操作,但是设备之间无法成功连接。

当我将一台设备设为中央设备另一台设备设为外围设备,中央设备与外围设备无缝连接。

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

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

如果我确实遇到错误,通常它们只是Unknown error

如果您需要任何代码或任何其他信息,请告诉我:)

4

3 回答 3

26

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

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

对于您的错误,我建议:

  1. 在启动连接之前关闭扫描。即扫描、查找外设、停止扫描、连接。连接和扫描互不相干。
  2. 使用专用队列来处理蓝牙事件,而不是主队列。[[CBCentralManager alloc] initWithDelegate:self queue:my_dedicated_bluetooth_q]
  3. 不幸的是,堆栈有时会变得不稳定。甚至重新启动也是可能的。但这通常只发生在重负载或多个同时连接的情况下。希望这将在 iOS7 中得到改进。
  4. 最近Unknown error开始出现几个开发人员的不知名。从您的描述来看,您的设置可能失败的原因可能有很多,并且需要更多信息才能很好地适应 SO 问题。

有关更多信息,我建议您搜索 bluetooth-dev 邮件列表存档https://lists.apple.com/archives/Bluetooth-dev或发送邮件 Bluetooth-dev@lists.apple.com。如果您提出这样的合理问题,社区会提供很大的帮助。

于 2013-08-06T20:26:19.040 回答
0

据我了解,一台设备一次可以使用一种模式。也就是说,如果设备在外围模式下工作,那么您就不能将其作为中央模式工作。如果您看到一些标准示例,例如BTLE transfer或 lilke Light Blue,它们一次只能在一种模式下工作。

于 2013-07-19T03:44:47.523 回答
0

首先,“同一时间”是什么意思?如果您的意思是设备在扫描其他设备时向其他设备广播,则不能。但是您可以创建两个线程,它们共享相同的广告和扫描锁。扫描前停止广告,广告前停止扫描。我在我的 iPhone 4s 和 iPad air 上进行了测试,运行良好。

于 2014-11-06T14:03:25.210 回答