2017-08-17 10 views
1

現在、私たちが開発したBLEデバイスに接続するlinux(最新のDebian Jessieを実行しているa.o. RasPi)のアプリケーションに取り組んでいます。このツールは、bluez(5.46)スタックのファイルをチェリーピッキングし、アプリケーションレイヤーを上に追加することで進化しました。これは、接続が非常に遅いという事実を除いて、すべてうまく動作します。私たちのツールの出力から、GATTのサービスと特性を伝えるためには、メッセージのトラックロードを交換する必要があり、それぞれの接続には1つの接続時間がかかることを理解しています。低電力デバイスであるため、接続間隔を比較的長くする必要があるため、遅延が大きくなります。BluezベースのGATT指向アプリケーションの接続間隔を変更する

Android BLEスキャナと接続すると、BLEスキャナが接続間隔を低い値に操作して、要求されたすべてのデータを取得してから、接続間隔を元の値に戻すことがわかりました。 BLE ScannerもBluezのアプリケーションも優先接続パラメータを考慮していないことに注意してください。

今私はアプリケーションを同じようにしたい:接続間隔を8msに設定し、特性とサービスに関するすべての情報を取得し、接続間隔を元に戻す。 Bluezスタックでは、HCIレイヤーでhci_le_conn_updateという素晴らしい機能が見つかりました。

しかし、アプリケーションの残りの部分はGATT機能の上に構築されています.BLE仕様では、これらの2つの階層間に階層が定義されていても、コード内では、その他。

HCI固有のhci_le_conn_update関数には、 'dd'(デバイスへのファイル記述子)と 'handle'(接続を識別する値)の2つのパラメータがあります。 hcitoolは、接続を作成すると最初のハンドルは64なので、その値で試してみました。 'dd'では、hci_dev_openを使ってデバイスのファイル記述子を取得しました。これはうまくいった。並べ替え

前述のとおり、最小値/最大値は完全に考慮されていません。だから私は6/10に設定すると11になり、6/50に設定すると60になります。これは私の好みにはあまりにも非決定的なものです。代わりに接続間隔を直接変更する関数が好きですとにかく無視されている範囲を与えること。また、ハードコーディングされたマジックナンバー64を使用しなければならないという事実は、私に悪い痒みを与えます。私は実際に組み込み機器の側で接続間隔を制御することができますが、私はクライアントアプリケーションの側で制御します。

目的は、Bluez-GATTベースのアプリケーションで接続間隔を更新することです。一定の制限内で、私はそこにどのように到達するか気にしません。助言がありますか?

+0

それはしばらくしており、私たちはこれをまったく間違った方法に近づけたことが判明しました。接続間隔を8〜500ミリ秒と指定し、クライアントに把握させます。我々はMCUが接続間隔ごとに少なくとも1回起きなければならないと考えていたので、これは非常に非効率的であることが懸念された。これは真実ではないことが判明している(BLEスタックは、スリープ状態に入ることができるときに信号を送るためのコールバックを提供する)。 49、それでも十分です(十分です)。 –

答えて

0

公式のdbus APIには、接続パラメータを変更する方法がありません。 (https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/gatt-api.txtおよびhttps://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txtを参照)。したがって、キーは、周辺機器側から接続パラメータ更新要求を送信することである。もちろん、未処理のhciコマンドを送信して実験することはできますが、これはちょっとした "ハッキー"であり、BlueZデーモンを台無しにすることはありません。

BlueZの接続パラメータ更新要求apiなどの機能については、ここではなくBlueZメーリングリスト(http://www.bluez.org/contact/)で説明します。

関連する問題