2013-04-25 31 views
5

現在、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接続

+0

これはあなたが望むものではありませんか? 1つのアプリケーションを複数のデバイスに接続させたい場合は、単一のソケットを通して実行できます。私は、各メッセージがデバイスのBTアドレスと一緒に届くと思いますので、適切なデバイスに関連付けることができます。 –

+0

これで、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

+1

ioctl(socket、HCIGETCONNINFO、cr)メソッドは、Bluetoothクラシックデバイスでは正常に動作しますが、BLEデバイスでは正常に動作しません。私はデータのペアリングの目的でBLEデバイスのACLデータハンドルにアクセスする方法が必要です。これはBlueZで可能ですか? – user2321427

答えて

2

私はより多くのスペースを持つことができるように私は私のコードを動作させるためにPythonとCの組み合わせを使用していますので、それができるので、私の「コード」は面白いに見えるかもしれ

...答えを開始いずれかから。また、Bluez 4は私が使用していたカーネルをサポートしていないため、使用しました。問題がある場合はお知らせください。明確にすることができます。

いくつかのやり方があるようですが、個の別々のソケットを開いてしまいました。 単一のソケットを開き、フィルタリングを解除するソケットオプションを設定すると、すべてのパケットを1か所で取得する必要があります。しかし、これが私の最初のやり方でした。私の接続が数秒で死ぬことがわかりました。

接続をスキャンするには、socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)を開き、0bindを入力してください。 (使用可能なデバイス番号を取得するには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を代わりに使用することを奨励したいので、彼らはデフォルトで共有ライブラリのインストールを止めました。

+0

DBUSを使用しないでこの問題を最初に解決したいと思います。受信ソケットデータに関連付けられたハンドルを取得して、データを正しい接続に関連付けることができるようにする必要があります。 ioctl(socket、HCIGETCONNINFO、cr)呼び出しは、BLEデバイスでは機能しません。接続と着信データに関連付けられたハンドル情報にアクセスする方法がありますか? – user2321427

+0

私は理解しているか分からない...接続を開始していませんか?あなたはそのケースで既にハンドルを持っていて、あなたが接続しているものを知っていませんか? –

+1

connect(socket、(struct sockaddr *)&addr、sizeof(addr))を実行すると、ソケット接続が行われたことを示す値0が返されます。 hcidumpを同時に実行すると、ハンドル1025が接続に割り当てられていることがわかります。その接続のさらなるデータトランザクションは、そのハンドルを使用します。私はそのハンドルにアクセスしようとしています。 – user2321427

1

私たちは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; 

感謝とコメントを楽しみにして:私たちはちょうど非広告メッセージを無視している、スキャンをオフにする必要はありません。

+0

cmd_leccとGATT_connectを使用して同じデバイスに2つの接続を行う理由を説明できますか? – abhiarora

関連する問題