7

よし、契約だ。Bluetoothが有効になっている2台のGalaxy Nexus電話を入手しました。

デバイスの検出と接続に使用する bluetooth 接続管理アプリを作成しました。また、デバイスがサポートできる利用可能なすべての UUID も出力します。

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htmを見ると、次の標準 UUID が Galaxy Nexus デバイスから公開されています。

  • 0x1116 - 昼寝
  • 0x112f - PBAP (電話帳アクセス プロファイル)
  • 0x111f - HFP (ハンズフリー)
  • 0x1105 - OPP (オブジェクト プッシュ プロファイル)
  • 0x1112 - HSP (ヘッドセット プロファイル)
  • 0x110c - AVRCP
  • 0x110a - A2DP

OPP プロファイル ( ) を介して接続しUUID 00001105-0000-1000-8000-00805F9B34FB、デバイス間でオブジェクト (ファイル) をプッシュしようとしています。すべてのBluetooth接続を検出、ペアリング/結合(スレッド化など)、および管理する方法について、 Android APIドキュメント全体を調べました。SPP (0x1101) プロファイルを介してレガシー ボード デバイスに正常に接続し、通信することができました。

ただし、socket.connect()2 台の Galaxy nexus フォン間で使用しようとすると、ペアリング ダイアログが表示さPairれ、両方のデバイスでボタンをクリックします。その後、すぐにConnection Refused IOException. 安全なリンクがキャッシュされているため、一度ペアリングが行われた後は二度と尋ねられないことに注意してください。

これらの標準 UUID を使用してこれらの標準プロファイルに接続できない場合、それらが公開されるのはなぜですか? アプリからこれらのプロファイルに接続して操作するにはどうすればよいですか? 私のアプリが何らかの形で信頼されていないからですか? 奇妙なのは、Android の機能でさえShareまったく機能しないことです。これは Android で完全に壊れているものですか?

ドキュメントにあるように、「よく知られている UUID SPP 1 0x1101」を使用するためのヒントを与えないようにしてください。これは私が望むものではありません。私はこれがどのように機能するかについてかなりよく理解しており、問題の実際の解決策または説明を探しています。

典型的な「リフレクション」ソリューションを見てきましたが、なぜこれがまだ Android で問題なのか理解できませんか? なぜ人々はこれを機能させるためにリフレクションを使用するのでしょうか? これを修正するために Android のバグを報告できますか?

これらの UUID が標準である場合、どのアプリもそれらに接続して対話できるはずです。これが問題になる理由と、この例外が発生する理由を教えてください。

前もって感謝します。

アップデート

そのため、何らかの理由で Android システムのオブジェクト プッシュが機能し始めました。実際にアプリ経由で接続しようとしましたが、機能しませんでした。次に、連絡先アプリに行き、魔法のように機能する連絡先を共有しようとしました. その後、自分のアプリに戻ったところ、今では機能しています...うわー。それは非常に奇妙であり、これには説明が必要です。

4

2 に答える 2

4

私はこの同じ問題に遭遇し、自分に合った解決策を見つけることができました.

私の場合、3 つの異なるテスト デバイス (Nexus 5、Galaxy S4、Note 2) を使用していますが、何らかの理由で、Note 2 は Bluetooth モジュールに接続されませんが、他の 2 つには接続されます。

私が見つけた理由は、Bluetooth ドライバーはさまざまであり、異なるデバイス間の接続を作成するには、わずかに異なる接続方法が必要であるということです。

私が使用する 3 つの方法は、「セキュア」、「非セキュア」、および「リフレクション メソッド」/「hax」と呼ばれます。

            switch(connType)
            {
            case Secure:
                tmpSocket = device.createRfcommSocketToServiceRecord(_uuid);
                break;

            case Insecure:
                tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid);
                break;

            case Hax:
                Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
                tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1));   
                break;
            } 

私の場合、セキュア モードは Nexus 5 と Galaxy S4 の両方で機能しましたが、Note 2 では機能しませんでした。

いくつかのテストの後、Note 2 は「安全でない」モードを使用してのみ動作することがわかったので、これに対応するために、基本的に接続を試み、必要に応じてさまざまなモードを循環させます。別の接続モードを試みると、単に「接続を再試行しています」というメッセージが表示されます。したがって、セキュアを使用して接続が失敗した場合は、インセキュアを使用してからリフレクション メソッドを使用してみます。

これら 3 つの方法のいずれかが機能しないというケースに遭遇したことはありません。

于 2014-03-18T05:38:25.487 に答える
2

非標準のプロファイルを使用してみましたか? つまり、UUIDアプリ専用のカスタムです。これは、同じプロファイルに登録されている他のアプリではなく、(ほとんどの場合) 自分のアプリにのみ接続していることを知るのにも役立ちます。

私の経験からすると、Bluetooth ペアリングは、最初のペア試行では非常にバグが多くなります。ただし、カスタムを使用すると、UUIDこれがいくらか役立ちます。

リフレクション法(だと思います)はもともと特定のデバイスのバグを修正する試みでしたが、他の場所でもそれを使用して成功した人もいると思います. この装置は、スピカまたは類似のものと呼ばれていました。

コメントの 1 つにも投稿されているように、失敗した後も接続を再試行します。

基本的に、最初の試行は失敗する予定のコードを作成しますが、失敗した場合、コードは 5 秒後に再接続を試みます。

これらは不完全なソリューションですが、Android での Bluetooth の実装も不完全です (IMHO)。それが役立つことを願っています

編集

質問の更新とコメントに基づいて:

何かが間違いなくバグであることに同意します。私が考える問題の一部は、BT ドライバーが異なり、それぞれが異なる癖を持つ異なる BT スタックを持っていることです。UUIDまた、リフレクション メソッドと custom 、およびその他の標準メソッドの両方を利用する質問も見つけました。これは私には極端に思えますが、ほとんどの領域をカバーしています。残念ながら、アプリ開発者として、低レベルのスタック/コード/ドライバーを制御することはできません。

2 つの Bluetooth 共有アプリで、最初のペアリングが常に難しいことに気付きました。

それが私だけではないことを知ってうれしいです。

于 2012-09-19T00:12:34.570 に答える