iOS上的外设和中央

到处并尝试了一切 ,但似乎没有工作:(

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

当我只有一个设备只有中央和另一个只有外围设备,中央无缝连接到外围设备。

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

有什么不同的我应该做的? 我只是将外设和中央代码合并到一个视图控制器中。 我注意到,如果设备“a”连接到设备“b”, 然后设备“b”连接到设备“a”,则其工作经常不是。 我通过使用NSThread sleepForTimeInterval:来pipe理这个NSThread sleepForTimeInterval:手动为每个设备上不同的时间量,但我怎么能得到一个设备先连接(然后其他)在一个可靠的(而不是手动预定义)的方式?

如果我得到错误,通常他们只是Unknown error

请让我知道如果你需要任何代码或任何其他信息:)

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

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

对于你的错误,我build议:

  1. 在启动连接之前closures扫描。 也就是扫描,找外设,停止扫描,连接。 连接和扫描不相像。
  2. 使用专用队列来处理蓝牙事件,而不是主队列。 [[CBCentralManager alloc] initWithDelegate:self queue:my_dedicated_bluetooth_q]
  3. 不幸的是,堆栈有时变得不稳定。 即使重新启动也是可能的。 但是这通常只在重负荷或同时连接的情况下发生。 希望这会在iOS7中得到改善。
  4. 最近几个开发者开始出现一个Unknown error 。 从你的描述来看,可能有很多原因可能导致你的设置失败,并且需要更多的信息来说明什么适合SO问题。

欲了解更多信息,我build议你searchbluetooth-dev邮件列表存档https://lists.apple.com/archives/Bluetooth-dev或发送邮件Bluetooth-dev@lists.apple.com。 如果你用这样的合理的问题来处理这个问题,社区会给你很大的帮助

首先,你是什么意思“同一时间”? 如果您的设备是在其他设备扫描其他设备时向其他设备发送广告,则不能。 但是你可以创build两个共享同一个locking的广告和扫描的线程。 扫描前,停止广告,在广告之前停止扫描。 我testing了我的iPhone 4和iPad的空气,运行良好。

根据我的理解,一个设备一次可以使用一种模式。 也就是说,如果设备工作在外设模式,那么你不能把它作为中央模式工作。如果你看到一些标准的例子,如BTLE传输或Lilke Light Blue,那么它们一次只能工作在一种模式下。