2015-10-01 20 views
5

私のアプリはBluetooth LEデバイスに接続する必要があります。通常、mBluetoothAdapter.startLeScan(mLeScanCallback);を使用してデバイススキャンを実行します。コールバックは利用可能なデバイスに関する情報を提供します。Android 4.4:Bluetooth低エネルギー; BLEデバイスをスキャンせずに接続する

専用のデバイスに接続したい場合は、あなたが私に

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 

、その後

mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 

ような何かを、それはあなたがBLEデバイスに接続する必要がある唯一のもののように見えます上記の2つの手順でBLEアドレスを知り、それに接続することです。したがって、既にBLEアドレスがわかっている場合(BLEデバイスのラベルに書かれているなど)、BLEスキャンを実行する必要はありません。

しかし、私が遭遇したのは、以前にBLEスキャンで見つけたことのないBLEデバイスがあれば、そのBLEアドレスを使用して直接接続することができないということです。私は少なくとも1回アンドロイド携帯電話でスキャンして見つけなければなりません。その後、私はもう一度スキャンする必要はなく、BLEアドレスを使用するだけでBLEデバイスに接続できます。

これはこのようなものか、何かを監督しましたか?

おかげでたくさん、 ステファン

+0

接続する前に[ペアリングおよび/またはボンディング](https://piratecomm.wordpress.com/2014/01/19/ble-pairing-vs-bonding/)する必要がありますか? – JimmyB

+0

私がBLEを理解する限り、これは必要ではありません。また、私がスキャンを実行する場合、私はペアリングやボンディングのために何もしないで動作します。問題は、BLEスキャンを実行せずにデバイスに直接接続することです。 – Stefan

答えて

4

デバイスアドレスは、単にBluetoothデバイスの一意の識別子であり、それは接続のための情報が含まれていません。このスキャンは、ブルートゥースデバイスからのブロードキャスト信号内の情報を検索して接続できるようにするために必要です。スキャンが完了すると、情報はデバイスのどこかに保存され、デバイスのアドレスにバインドされます。

私は、Bluetoothのアドレスの値を取得しようとすると、それが一度スキャンされるまでヌルを返すと思います。

+0

ソースを確認してもらえますか? – Andy

+1

[ソース](https://developer.bluetooth.org/TechnologyOverview/Pages/Baseband.aspx) これは具体的なことではありませんが、私がBluetoothプロトコルの専門家ではない間は、私の控除はデバイスアドレスデバイスを識別するために使用できますが、通信するチャネルは指定しません。このプロトコルは、スレーブデバイスとマスターデバイスが互いに学び、接続のためのさらなる指示を提供するための問い合わせチャネルを指定する。その情報が取得されると、マスタはその情報を保存して、次回に指示を既に持っているので直接接続を実行できます。 –

+0

これはボンディングされていないBLEデバイスにも当てはまります。つまり、一度スキャンが完了してサービスの検出が行われると、アンドロイドはサービスをキャッシュしてBluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address)を呼び出します。 1秒以内に接続されます。 – benchuk

関連する問題