web-dev-qa-db-ja.com

hcitoolを使用して広告パケットを設定する

USB Bluetooth4ドングルをiBeaconに設定する方法についてのよく知られたブログ投稿があります。まとめると、次の魔法のコマンドになります。

Sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00

この例の問題は、不透明であるため、これをより一般的な形式で使用するのが難しいことです。私はそれを少し分解することができました:

Sudo hcitool -i hci0 cmd

hciコマンドをhci0デバイスに送信します

0x08 0x0008 

広告パッケージを設定するのは魔法ですが、他のstackoverflowコマンドは「それを使用するだけで、尋ねないでください

1e

次のデータパケット全体の長さ(バイト単位)

02 01 1a 1a

広告パケットを設定するためのフラグです(詳細はリクエストに応じて)

ff 4c 00 ...

iBeacon情報をエンコードする「会社固有のデータ」です

私がやろうとしたのは、「FF ...」バイトをNAMEパラメータ「0409 41 42 43」(ABCに設定する必要があります)を設定するためのオペコードに置き換えることですが、それは機能しません。

これは他のあらゆる種類のパラメーター(TEMPやPOWERなど)の設定に非常に役立つため、hcitoolが広告パケットを設定する方法のいくつかの例を提供しないことに驚いています。他の誰かがhcitoolを使用してNAMEのようなものを設定した経験はありますか?

13
ScottJenson

返信が遅れますが、誰かがこれが役立つと思うかもしれません。 hcitoolを使用しているときに自分で解決策を探していたときに、それを見つけました。

hcitool cmd --helpを使用すると、このようなcmd <ogf> <ocf> ...が表示されます。 Bluetoothコア仕様 を調べて、OGFとOCFの0x08と0x0008がどうなるかを確認すると便利です。具体的にはVol。 2、パートE、7.8

LEコントローラコマンドの場合、OGFコードは0x08として定義されます

および0x0008のOCFの場合

Advertising_Data_Length、Advertising_Data

したがって、基本的に、0x08 0x0008では、送信されるデータの長さを(LEコントローラーで)設定していると言います。名前に関しては、BLEアドバタイズメントパケットの長さが31バイト(1E)であるため、31バイト全体を送信する必要があります。したがって、名前にABCしかない場合は、04 09 41 42 43の設定は正しいですが、それは5バイトだけです。 31の場合、00を26回追加する必要があります。加えすぎないように注意してください。

また、BLE広告という印象もありませんでした。パケットは固定の31バイトサイズですが、少なくともhcitool用です。送信サイズを1Eよりも小さい値に具体的に設定した場合は機能しません。

7
nomve

いいえ。この答えはどれも正確で明確ではありません。

1)BLEには個別のコマンドセットがあります。 「LE Set Advertising Data」コマンドを使用する必要があります(7.8.7 vol 2パートEを参照)。

2)LE Set Advertising Dataは、上記で説明したものよりもはるかに複雑です。少なくとも2つの1オクテット長フィールドがあり、パケットは32バイト長で、ゼロが埋め込まれている必要がありますが、最初の長さバイトは0x1e(31)ではなく、1つ以上のヘッダーを含む重要な使用部分の長さである必要があります。各ヘッダーには、長さ、1つのASタイプバイト(設定されたローカル名の場合は0x09)、および名前が含まれています。

LEローカル名を設定:

hciconfig hci0 down
hciconfig hci0 up
hcitool -i hci0 cmd 0x08 0x0008 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
hciconfig hci0 leadv 0

0x0c:次のヘッダーグループの長さ0x0b:このヘッダーの長さ0x09:完全な名前の残りのADタイプ0x0a長さは名前です

5

同様の質問に この回答 をチェックしてください。基本的には、巨大な Bluetooth Core Spec ドキュメントをダウンロードし、それが提供するすべてのコマンドを読む方法を説明しています。正しい形式を理解できれば(そしてコマンドが実際に何をするのかを理解できれば)、hcitoolコマンドを使用してこれらのコマンドのいずれかを実行できます。

主な注意点:自分で名前を設定しようとはしていませんが、仕様を見ると、仕様の482ページの「7.3.11ローカル名の書き込みコマンド」のセクションで説明されているようです。これによると、コマンドは以下で構成されます:

OCF: 0x0013
Name (up to 248 bytes)

だから私はこのようなコマンドを試してみます:

hcitool -i hci0 cmd 0x08 0x0013 41 42 43

もう1つのヒント:このようなコマンドを発行するときは、hcidump &を実行して、コマンドがバックグラウンドで実行されるようにしてください。次に、実験的なhcitoolコマンド(またはhciconfigコマンド)を入力して、実行された(人間が読める)コマンドと発生したエラー(存在する場合)に関する注釈付きの詳細を確認できます。

上記のヒントを使用して、バックグラウンドでhciconfig name abcを実行しているときに、hcidump &を実行してそのコマンドラインツールを使用してローカル名を設定することもできます。これにより、使用する適切なhcitoolコマンド値が表示されます。

3
davidgyoung

1つではなく2つのコマンドを使用する必要があるようです。 iBeaconデータは「LESetAdvertising Data」データに含まれており、この投稿の他の場所で言及されています。 BLEフレンドリ名を表示するには、追加コマンド「LE Set Scan Response Data」を使用できます。これには、受信者が(広告パケットを受動的に読み取るのではなく)デバイスをスキャンする必要があります。したがって、Angeloの例を this one と組み合わせて、デバイスをiBeaconとして設定し、スキャン応答データである「わかりやすい名前」を設定できます。

Sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00
Sudo hcitool -i hci0 cmd 0x08 0x0009 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

これは、BLEドングルを備えたUbuntuボックスを使用して私のために機能し、これを使用してビーコンをスキャンしました Android BLE スキャンアプリ

2
Matt Young