web-dev-qa-db-ja.com

AndroidデバイスをBLE(Bluetooth Low Energy)経由でiOSデバイスに接続する方法

Androidの新しいBluetooth Low Energy APIを使用するアプリケーションを作成しようとしています。このために、APIレベル18に付属するBLEサンプルから始めました。

Androidがペリフェラルとして機能できないことを読んだときに、Android電話を中央モードにして、BLEデバイスをスキャンしますその周り。この目的のために、心臓センサーをシミュレートした北欧プラットフォームでいくつかのテストを行いました。すべてが完璧に機能します!

この後、iPhone(iOS 7 beta 4)を選択し、周辺機器に配置して心拍数センサー前のテストとして。 Androidアプリは、デバイスを表示して接続できます。ただし、接続がアクティブになった後、2つのデバイスは3〜4秒で相互に切断されます。それに加えて、Android側でdiscoverServices()を呼び出すと、コールバックはトリガーされません!場合によっては、iOS Bluetoothチップがオフになっていても、Androidデバイスは「接続済み」イベントを受け取ります。これは非常に奇妙です。それを証明するために、私はNordic Boardを中央モードに設定しましたが、iOSデバイスに問題なく正しく接続できました。

どうなり得るか? AndroidまたはiOSには、AndroidからiOSまたはその逆への接続を許可しない制限がありますか?

ありがとう。

編集:いくつかのハードテストの後、AOSPページで問題を提起しました。確認できます こちら

82
edoardotognoni

参照用の要約の追加:

それは何でしょうか? AndroidまたはiOSには、AndroidからiOSまたはその逆への接続を許可しないiOSに制限がありますか?

ConnectGatt(...)を呼び出してデュアルモード(BLEおよびBR/EDR)デバイスとしてアドバタイズされるGATTサーバーに接続する場合、内部で追加されるTRANSPORT_AUTOフラグはAndroidをデフォルトに設定しますBR/EDRモード( link )。

次の回避策が可能です。

  1. 周辺機器側:適切なフラグを調整して、BR/EDR機能の広告を停止します( link
  2. 中央側:リフレクションを使用して隠しバージョンのconnectGatt()を呼び出して、トランスポートパラメーターを明示的にTRANSPORT_LEに設定します。

例:

public void connectToGatt(BluetoothDevice device) {    
   ...    
   Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);    
   int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);     // LE = 2, BREDR = 1, AUTO = 0    
   BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);    
   ... 
}

編集4/2016

Arbel Israeli がコメントで指摘したように、Googleは connectGatt(...) のオーバーロードバージョンを導入しました。これにより、Android M

7
Dominik Gebhart

比較的簡単な、簡単な作業例を作成し、Githubのオープンソースに含めました: https://github.com/GitGarage 。これまでのところ、Android Nexus 9およびiPhone 5sでのみテストされていますが、Nexus 6およびさまざまなiPhoneタイプでも動作するものと思われます。 1つのAndroidと1つのiPhoneの間で通信しますが、さらに多くのことを調整できると思います。

2
omikes

少し遅れるかもしれませんが、おそらくあなたの痛みは少し緩和されるかもしれません;)

クロスプラットフォームのBLE接続(iOS <-> Android)で多くの実験を行ってきましたが、多くの非互換性と接続の問題がまだあることがわかりました。 Androidの不安定性は別として、今日の時点では、それほど多くのAndroidデバイスが実際にBLEペリフェラルモードをサポートしていないことも考慮する必要があります。

したがって、ユースケースが機能駆動型であり、基本的なデータ交換のみが必要な場合は、ゼロから構築する必要なく、クロスプラットフォーム通信を実現できるフレームワークとライブラリを検討することをお勧めします。

例: http://p2pkit.io またはgoogle near

免責事項:私はUepaaで働いており、AndroidおよびiOS用のp2pkit.ioを開発しています。

2
p2pkit

API 23以降、TRANSPORT_LE経由でBluetoothDevice.connectGattを渡すことができます。

以下をご覧くださいAndroid以下のドキュメント参照:

1
Kevin Crain

iOSデバイスは常にペリフェラルまたはセントラルですが、Androidデバイスはめったにありません。この場合、iOSデバイスはペリフェラルでなければならず、Androidはセントラルでなければなりません。周辺機器はサーバーであり、中央機器はクライアントであると考えることができます。これは簡単です。

0
Mustafa Demir