BLE(Bluetooth Low Energy)を介してAndroidデバイスをiOSデバイスに接続する方法


82

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

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

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

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

ありがとう。

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


2
ドキュメントによると、Androidはサーバー(心拍数モニターなど)としての実行をサポートしていますが、生成される値は偽物です。一方、例はなく、ドキュメントには間違ったことをするように指示されており、広告を開始する方法はありません(ドキュメントにはできると書かれていますが)。
Brian Reinhold 2013

あなたが正しい。BluetoothGattServerに関するドキュメントのバグをすでに見つけました。getProfileProxyメソッドを使用してGattServerインスタンスを作成することはできませんが(ドキュメントに記載されているように)、BluetoothManager.openGattServer()から作成できます。それはすでに問題としてグーグルに報告されています。とにかく、はいAndroidはGattServerとして機能できますが、アドバタイズすることはできません。興味があるかもしれませんが、私はすでにテストを行っており、2つのデバイスを接続した後、リモートはAndroidから公開されたGattサーバーを見ることができます。この質問に関する私の問題レポートを確認するには、最初の回答のコメントを確認してください。
edoardotognoni 2013

ええ、私もそれにつまずいて、その問題に私の2セントを追加しました。現在、アドバタイズできない温度計サーバーがあるため、使用できません。
Brian Reinhold 2013

私はあなたとほぼ同じスレッドを開きました:stackoverflow.com/questions/18410081/…あなたが見つけた解決策がないかこのスレッドを監視します。
afrederick 2013

質問の編集セクションに投稿したAndroidの問題を読んでください。このプロセスが失敗する理由が明確に説明されています。それは私たちが考えるAndroidのせいです。主に、固定BLEチャネルを介して許可されていないメッセージを送信しています。私たちにできることは、新しいAndroidのリリースを待つことだけだと思います:(
edoardotognoni 2013

回答:


7

参照用の要約の追加:

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

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

次の回避策が可能です。

  1. 周辺機器側:適切なフラグを調整して、BR / EDR機能の宣伝を停止します(リンク
  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);    
   ... 
}

2016年4月編集

以下のようArbelイスラエルはコメントで指摘し、Googleがのオーバーロードされたバージョンを導入connectGatt(...)でトランスポートを指定することができますAndroidのMを


おかげで、それは私のために働きます、アンドロイドMでグーグルがトランスポート変数を取るconnectGattメソッドのオーバーロードを追加したことに注意してください:connectGatt(コンテキストコンテキスト、ブールautoConnect、BluetoothGattCallbackコールバック、intトランスポート)
arbel03 2016

1
ああ、このヒントに感謝し、彼らはついにそれを実行可能にしました。
Dominik Gebhart 2016

2

比較的単純な簡単な実例を作成し、Githubのオープンソースに含めました:https//github.com/GitGarage。これまでのところ、Android Nexus9とiPhone5sでのみテストされていますが、Nexus6とさまざまなiPhoneタイプでも動作すると思います。これまでのところ、1つのAndroidと1つのiPhoneの間で通信するように明示的に設定されていますが、さらに多くのことを行うように調整できると思います。


2

少し遅れるかもしれませんが、おそらくあなたの痛みは少し和らげることができます;)

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

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

例:http//p2pkit.ioまたは近くのグーグル

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



0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.