6

Linux コンピューターで Bluetooth Low Energy Peripheral を作成する実験を行っています (目標は、iPhone から Bluetooth 経由でデータを送信することです)。私は現在ツールhciconfighcitoolおよびを使用していますhcidump

私の現在の実験は、iOS CoreBluetooth ライブラリが取得する特定の UUID を持つサービスを宣伝することです。(注: iBeacon を作成しようとしているわけではありません)。

現在、私を悩ませているのは、実際には 1 つのコマンドと同じくらい簡単です。

hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50

私がすべきだと思うことは次のとおりです。

  • 0x08: グループを BLE に設定
  • 0x0008: コマンドを HCI_LE_Set_Advertising_Data に設定

  • 0x15: ヘッダーの有効バイトの長さを 21 に設定します。 (フラグ パケットに 3 バイト、サービス構造に 18 バイト)
  • 0x02: Flags 構造体の長さを 2 バイトに設定
  • 0x01: 構造体の Type を AD Flags に設定
  • 0x1a: フラグ値:

    bit 0 (OFF) LE Limited Discoverable Mode
    bit 1 (ON) LE General Discoverable Mode
    bit 2 (OFF) BR/EDR Not Supported
    bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
    bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
    

(旗の終わり)

  • 0x11 サービス構造の長さを 17 バイトに設定
  • 0x07 構造タイプを 128 ビットに設定 完全なサービス UUID リスト
  • 0x41 ... 0x50 テスト サービスの UUID を ABCDEFGHIJKLMNOP に設定

で見る限り、hcidump適切に実行され、希望どおりに見えます。しかし、それはエラーで拒否されました:

LE Set Advertising Data (0x08|0x0008) ncmd 1
status 0x12
Error: Invalid HCI Command Parameters

そして、私はそれを正しくするために丸一日を費やしました. 熟練した誰かが私が間違ったことを見ていますか? そして、これはサービスを宣伝する正しい方法ですか?

(興味のある読者へのコンテキスト: NodeJs で Bleno ライブラリを使用してやりたいことを成功裏に達成しました。しかし、これはシステムの全体像には当てはまりません。広告のために HCITool を直接使用することは、実験のためだけであり、記述されます。後で Python で)

4

1 に答える 1

5

HCI_LE_Set_Advertising_Data ペイロードの長さは、正確に 32 バイトである必要があります。32 バイトになるように、コマンドをゼロ パディングしてみてください。

hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 00 00 00 00 00 00 00 00 00

hcidump --raw. 元のコマンドの出力を比較するを使用して、さらに洞察を得ることができます。

$hcidump --raw
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 16 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A 
  4B 4C 4D 4E 4F 50 
> 04 0E 04 01 08 2

ゼロが埋め込まれたもの:

HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 20 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A 
  4B 4C 4D 4E 4F 50 00 00 00 00 00 00 00 00 00 00 
> 04 0E 04 01 08 20 00 

さらに洞察を得るもう 1 つの方法は、hciconfig によって送信された SET_ADVERTISING_PARAMETERS コマンドのペイロードを実行hciconfig hci0 leadvして調べることです。hcidump --raw

ところで、使用している bluez のバージョンによっては、ゼロ以外のパディング コマンドも機能する場合があることに気付きました。

于 2016-03-09T09:24:44.287 に答える