現在、BlueZ 5.0とLinuxを使用して複数のBLEデバイスに接続しようとしています。私は1つのホストBLEアダプタを持っており、この機能を接続して実行するためにgatttoolを変更しました。変更されたgatttoolのインスタンスを実行すると、正常に接続してBLEデバイスから通知データを受信します。変更されたgatttoolの別のインスタンスを実行して別のBLEデバイスに接続すると、このアプリケーションは両方のBLEデバイスから通知データの受信を開始し、最初のアプリケーションはデータを受信しなくなります。私は、これは両方のアプリケーションが同じアドレスとPSM(最新のインスタンスがデータを受け取るのに対し、もう1つは飢えている)にソケットを設定しているソケット設定によると考えています。この状態を防ぐ方法はありますか?理想的には、1つのアプリケーションで複数のデバイスに接続する必要があります。私は、複数のソケットが上記の複数のインスタンスと同じ問題を持つという理由で、アプリケーションが1つのソケットだけを持つことができると仮定します。私のBLEデバイスは心拍モニタとして機能するTI CC2540キーフォブです。LinuxとBluez 5.0を使用した複数のBLE接続
答えて
私はより多くのスペースを持つことができるように私は私のコードを動作させるためにPythonとCの組み合わせを使用していますので、それができるので、私の「コード」は面白いに見えるかもしれ
...答えを開始いずれかから。また、Bluez 4は私が使用していたカーネルをサポートしていないため、使用しました。問題がある場合はお知らせください。明確にすることができます。
いくつかのやり方があるようですが、個の別々のソケットを開いてしまいました。 単一のソケットを開き、フィルタリングを解除するソケットオプションを設定すると、すべてのパケットを1か所で取得する必要があります。しかし、これが私の最初のやり方でした。私の接続が数秒で死ぬことがわかりました。
接続をスキャンするには、socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
を開き、0
にbind
を入力してください。 (使用可能なデバイス番号を取得するにはhci_get_route
という機能があります)hci_le_set_scan_parameters
を呼び出してオプションを設定し、setsockopt(SOL_HCI, HCI_FILTER, filter)
を呼び出してLEスキャンイベントを取得してから、hci_le_set_scan_enable
を呼び出してスキャンを有効にすることができます。
各デバイスの接続はsocket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
で行われ、connect
を特定のデバイスアドレスを持つstruct sockaddr_l2
でソケット上の特定のデバイスに接続するよう指示します。そのソケットでは、そのデバイスからのパケットだけを取得する必要があります。 (1つの注意点...私はアクティブなスキャンが行われている間、ドングルが接続を許可しないことを発見しました。接続する前に一時的にシャットダウンしてから再度オンにしなければなりませんでした。そうでなければ、errno )
Bluez 5ですべてをやると思われる方法は、DBUSを使用することです。残念ながら、それは実際に私がやっていたことのための選択肢ではありませんでした。私が言及した関数は、明らかにデフォルトでは5にインストールされていない共有ライブラリにあります(あなたはそれをconfigure
でインストールするよう明示的に要求しなければなりません)。彼らは人々がDBUSを代わりに使用することを奨励したいので、彼らはデフォルトで共有ライブラリのインストールを止めました。
DBUSを使用しないでこの問題を最初に解決したいと思います。受信ソケットデータに関連付けられたハンドルを取得して、データを正しい接続に関連付けることができるようにする必要があります。 ioctl(socket、HCIGETCONNINFO、cr)呼び出しは、BLEデバイスでは機能しません。接続と着信データに関連付けられたハンドル情報にアクセスする方法がありますか? – user2321427
私は理解しているか分からない...接続を開始していませんか?あなたはそのケースで既にハンドルを持っていて、あなたが接続しているものを知っていませんか? –
connect(socket、(struct sockaddr *)&addr、sizeof(addr))を実行すると、ソケット接続が行われたことを示す値0が返されます。 hcidumpを同時に実行すると、ハンドル1025が接続に割り当てられていることがわかります。その接続のさらなるデータトランザクションは、そのハンドルを使用します。私はそのハンドルにアクセスしようとしています。 – user2321427
私たちはhcitoolとgatttoolのコードを組み合わせました。このコードは、2つのデバイス(scan、hci_le_create_conn、およびgatt_connect)に対してうまく機能します。私は使用されるデバイスの数に制限はないと信じています。
1 Start cmd_lescan (from hcitool.c)
2.For each device scanned -
cmd_lecc (from hcitool.c)
gatt_connect (from gatttool.c)
このようにして、1つのプロセスで複数のBLEデバイスを管理できます。
if (meta->subevent != 0x02)
continue;
感謝とコメントを楽しみにして:私たちはちょうど非広告メッセージを無視している、スキャンをオフにする必要はありません。
cmd_leccとGATT_connectを使用して同じデバイスに2つの接続を行う理由を説明できますか? – abhiarora
- 1. Bluez/Linuxを使用すると、BLE ibeaconsをブロードキャストするデーモンを実行し、同時にRFCOMMを使用して接続できますか?
- 2. BLEスキャン/接続用のラッパーとしてAltBeaconを使用
- 3. linuxとBlueZのBluetoothサブシステム
- 4. は、随時BLE接続
- 5. Linux BlueZカスタム製造スキャンレスポンスデータ
- 6. BlueZでの接続とペアリングの違い
- 7. bluez python dbusインターフェイスを使用してBluetooth LEデバイスに接続
- 8. StropheとOpenfireを使用した複数の同時XMPP接続
- 9. BLE接続経由で複数のAndroid携帯をRFduinoに接続する
- 10. BLE接続のバックグラウンドサービス
- 11. BlueZ DBUS API - BLEデバイスでGATTインターフェイスを使用できない
- 12. BLEデバイスのタイムアウト後にAndroid BLEが再接続しない[RxAndroidBleの使用]
- 13. 複数のBLEペリフェラルへの中央接続?
- 14. 同時BLE接続
- 15. BLE:接続間隔の最大パケット数
- 16. Ble多重接続
- 17. BLE接続中止
- 18. 近接接続にBLE RSSI値を使用する
- 19. MAC iosを使用してBLEデバイスに接続
- 20. OpenSSLを使用した複数の接続
- 21. Arduino BLE CurieBLEを使用した複数のサービス
- 22. hibernateを使用した複数の接続
- 23. 同じ接続を使用した複数スレッドのWebリクエスト
- 24. (datagrip)複数のスキーマを使用したデータベース接続
- 25. POGを使用した複数のデータベース接続
- 26. レンジングビーコンの間のBLE接続
- 27. BLE接続パラメータの設定
- 28. ドッカー画像を使用したAzure LinuxアプリケーションサービスのMongo接続エラー
- 29. bluez 5.43とDBus
- 30. Redisの - 複数の接続試行と接続Redisのため
これはあなたが望むものではありませんか? 1つのアプリケーションを複数のデバイスに接続させたい場合は、単一のソケットを通して実行できます。私は、各メッセージがデバイスのBTアドレスと一緒に届くと思いますので、適切なデバイスに関連付けることができます。 –
これで、1つのソケットを使用する必要があることを理解しました。 ACL接続ハンドルを使用してデータを分離する必要があります。 BlueZでこのハンドルにアクセスするのが難しいです。 socket(PF_BLUETOOTH、SOCK_STREAM、BTPROTO_RFCOMM)はソケットを作成します。 connect(sock、(struct sockaddr *)&addr、sizeof(addr))はソケットを接続します。 ioctl(socket、HCIGETCONNINFO、cr)を使用してハンドルにアクセスすると、errno 2(ファイルなし)が返されます。宛先アドレスが正しい。私の作成したソケットは5の値を返しますが、socket = hci_open_dev(dev_id)は6の値を返します。このハンドルを取得するには、より良い方法がありますか? – user2321427
ioctl(socket、HCIGETCONNINFO、cr)メソッドは、Bluetoothクラシックデバイスでは正常に動作しますが、BLEデバイスでは正常に動作しません。私はデータのペアリングの目的でBLEデバイスのACLデータハンドルにアクセスする方法が必要です。これはBlueZで可能ですか? – user2321427