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ページで問題を提起しました。確認できます こちら
参照用の要約の追加:
それは何でしょうか? AndroidまたはiOSには、AndroidからiOSまたはその逆への接続を許可しないiOSに制限がありますか?
ConnectGatt(...)を呼び出してデュアルモード(BLEおよびBR/EDR)デバイスとしてアドバタイズされるGATTサーバーに接続する場合、内部で追加されるTRANSPORT_AUTOフラグはAndroidをデフォルトに設定しますBR/EDRモード( link )。
次の回避策が可能です。
例:
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);
...
}
Arbel Israeli がコメントで指摘したように、Googleは connectGatt(...) のオーバーロードバージョンを導入しました。これにより、Android M。
比較的簡単な、簡単な作業例を作成し、Githubのオープンソースに含めました: https://github.com/GitGarage 。これまでのところ、Android Nexus 9およびiPhone 5sでのみテストされていますが、Nexus 6およびさまざまなiPhoneタイプでも動作するものと思われます。 1つのAndroidと1つのiPhoneの間で通信しますが、さらに多くのことを調整できると思います。
少し遅れるかもしれませんが、おそらくあなたの痛みは少し緩和されるかもしれません;)
クロスプラットフォームのBLE接続(iOS <-> Android)で多くの実験を行ってきましたが、多くの非互換性と接続の問題がまだあることがわかりました。 Androidの不安定性は別として、今日の時点では、それほど多くのAndroidデバイスが実際にBLEペリフェラルモードをサポートしていないことも考慮する必要があります。
したがって、ユースケースが機能駆動型であり、基本的なデータ交換のみが必要な場合は、ゼロから構築する必要なく、クロスプラットフォーム通信を実現できるフレームワークとライブラリを検討することをお勧めします。
例: http://p2pkit.io またはgoogle near
免責事項:私はUepaaで働いており、AndroidおよびiOS用のp2pkit.ioを開発しています。
API 23以降、TRANSPORT_LE
経由でBluetoothDevice.connectGatt
を渡すことができます。
以下をご覧くださいAndroid以下のドキュメント参照:
iOSデバイスは常にペリフェラルまたはセントラルですが、Androidデバイスはめったにありません。この場合、iOSデバイスはペリフェラルでなければならず、Androidはセントラルでなければなりません。周辺機器はサーバーであり、中央機器はクライアントであると考えることができます。これは簡単です。