2016-06-27 14 views
0

Bluetoothビーコンを使用してAndroid携帯端末と通信するためのアプリケーションを作成しています。私は1つのビーコン(クライアントとして機能する)と1つのアンドロイドモバイルデバイス(サーバとして機能し、接続をリスンする)の間でこれを成功裏に達成しました。以下のコードスニペットを見つけるMACアドレスなしのcreateInsecureRfcommSocketToServiceRecordを使用したAndroidのBluetooth接続

クライアントアプリ

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MACaddress); 
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
mBluetoothAdapter.cancelDiscovery(); 
socket.connect(); 

サーバーアプリ

mmServerSocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("NAME", UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
socket = mmServerSocket.accept(); 

は、これは私がそのを取得することができる午前1つのモバイルデバイス(サーバー)で正常に動作してくださいMACaddressの近くのBluetoothデバイスをスキャンしてください。しかし、レンジスキャニングに存在する約20〜25台のモバイルデバイスが非常に多くの時間を消費するケースを考えてください。私はスキャンを実行せずにこれをしたいと思います。

サーバーのMACaddressを使用せずにこれを達成する方法はありますか?ユニークなUUIDだけで接続を確立できますか?私は、デバイスをペアリングしたくないことに注意してください。

この点に関する他の解決方法も歓迎されます。ありがとう!

答えて

0

Bluetoothデバイスへのソケット接続を作成することはできません。Bluetoothデバイス自体を識別することなく、Bluetoothデバイスの一意の識別子はMACアドレスです。たとえUUIDだけでこれを行うことができるAndroid APIがあったとしても、基本的な実装では近くのデバイス(スキャンなど)を検索して、UUIDを使用してソケット接続を受け付けるデバイスを見つける必要があります。したがって、質問に記載されているスキャンがまだ行われなければなりません。

はい、スキャニングは、多数のBluetoothデバイスが周囲にある場合に、少しの電力とCPUを使用します。これは2通りに制限できます。

  1. 短時間だけスキャンします。あなたのユースケースでは、数秒間スキャンしてからサポートデバイスを見つけたら停止することができます。あまりにもリソースを集中させるべきではありません。興味のあるデバイスのみを一致させるのAndroid 5.0+の

  2. 使用スキャンフィルター。

+0

おかげでデビッド! BLEでスキャンフィルタを試してみましょう。しかし、一時的な回避策として、コードを使ってサーバのMACアドレスを偽装/偽装する方法はありますか?このようにして、事前にMACを知っているのでスキャンを避けることができます。私は、デバイスのルーティングやさまざまなサードパーティのアプリケーションを通じてMACスプーフィングのいくつかの方法を見つけましたが、Javaコードはありませんでした。 – deadpool

+0

私の経験は同じです。 MACをスプーフィングするには、rootとの低レベルのアクセスが必要です。 – davidgyoung

+0

私はUUIDを使用してスキャンフィルタを作成しましたが、1つのサーバで結果を得るのに3〜4秒かかります。それはもう一つの疑問を生みました - フィルターはスキャンを遅くしますか?スキャナーフラグメントは一致するUUIDをチェックする必要があるためです。私は1秒間に1台のデバイスをスキャンできることを望んでいました。それは可能でしょうか? @davidgyoung – deadpool

関連する問題