17

私はどこでも見て、すべてを試しましたが、何もうまくいかないようです:(

iOS では、iOS デバイスがデータを交換する必要があるアプリ (iOS 6 以降用) を作成しています。したがって、両方のデバイスが同時にペリフェラルであると同時にセントラルである必要があります。WWDC ビデオで指定されているとおりに実行しましたが、デバイスが相互に正常に接続できません。

1 つのデバイスを中央のみ、もう 1 つを周辺機器のみにすると、中央のデバイスが周辺機器にシームレスに接続されます。

ただし、両方のデバイスが同時にペリフェラルとセントラルの場合、ランダムなエラーが発生します。どの段階でも (サービス/特性の検出または通知値の設定YES) エラーが発生することdiscoverServicesがあり、呼び出されないこともありますdidDiscoverServices

私がしなければならない何か違うことがありますか?周辺機器と中央のコードを 1 つのビュー コントローラーに統合しただけです。デバイス「a」がデバイス「b」に接続し、次にデバイス「b」がデバイス「a」に接続すると、多くの場合動作することに気付きました。NSThread sleepForTimeInterval:私はこれを、デバイスごとに異なる時間を手動で使用して管理していますが、信頼できる (手動で事前定義されていない) 方法で、1 つのデバイスを最初に (次に別のデバイスを) 接続するにはどうすればよいでしょうか?

エラーが発生した場合、通常は単にUnknown error

コードやその他の情報が必要な場合はお知らせください:)

4

3 に答える 3

26

はい、同時に両方の役割を担うことができます。CBPeripheralManageraと aを初期化するだけCBCentralManagerです。周辺機器マネージャーが初期化され、状態を受け取るとすぐにPOWER ON、デバイスは周辺機器として機能し始めます。この時点でサービスを追加して、他のデバイスからの接続を受信できます。同時に、中央マネージャーを使用して他の周辺機器をスキャンし、接続を開始できます。

周辺機器として機能する場合でも、自分のデバイスに接続することはできません。

エラーについては、次のことをお勧めします。

  1. 接続を開始する前にスキャンをオフにします。つまり、スキャン、周辺機器の検索、スキャンの停止、接続です。接続とスキャンは相容れない。
  2. メイン キューではなく、Bluetooth イベントを処理するための専用キューを使用します。[[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

私の理解によると、1 つのデバイスは一度に 1 つのモードで動作します。つまり、デバイスがペリフェラル モードで動作している場合、中央モードとして動作することはできません。BTLE 転送Light Blueのような標準的な例が見られる場合、それらは一度に 1 つのモードで動作しています。

于 2013-07-19T03:44:47.523 に答える
0

まず、「同時」とは?デバイスが他のデバイスをスキャンしている間に他のデバイスにアドバタイズすることを意味する場合、それはできません。ただし、広告とスキャンに対して同じロックを共有する 2 つのスレッドを作成できます。スキャンの前に広告を停止し、広告の前にスキャンを停止します。iPhone 4s と iPad air でテストしたところ、うまくいきました。

于 2014-11-06T14:03:25.210 に答える