2

HCI_LE_Set_Advertising_Enable コマンドが成功した場合はステータスを返し、コマンドが失敗した場合はステータス コード[2]HCI_LE_Set_Advertising_Enableを返す [1] コマンドを使用して、BLE アドバタイジングを有効にすることができます。0x000x01 to 0xFF

広告が既に有効になっている場合 (たとえば、Advertising_Enableパラメータを に設定してこのコマンドを 2 回呼び出す0x01)、このコマンドまたはHCI_LE_Set_Advertising_Dataコマンドは status を返します0x0C (Command Disallowed)

これには (少なくとも) 2 つの問題があります。

  • すでに有効になっている広告を有効にすると、ランダム アドレスが変更される可能性があります。すでに無効になっている広告を無効にしても効果はありません。[1]

  • BlueZ スタックには、ほとんどの HCI ライブラリ関数の最後に次のコードが含まれています。
        if (status) {
            errno = EIO;
            return -1;
        }
    
    これにより、たとえばhci_le_set_advertise_enable、関数が一般的な失敗コードを返し-1、 に設定さerrnoれますEIO。これは、他の BlueZ エラー、HCI エラー、または実際の IO エラー (HCI レイヤーは UART を使用) と区別できません。

安全/厳密なエラー処理を実行できるように、LE アドバタイズメントが既に有効になっているかどうかを確認する方法は? BT Core Specs にGet Advertising Statusのコマンドが見つかりません。私は何かに頼ることはできません

if ((rc == -1) && (errno == EIO)) {
    /* Actually OK, advertising is already enabled */
    return 0;
}

ありがとうございました。

参考文献:

  • [1] BT CS 5.2 [Vol 4] パート E、セクション 7.8.9
  • [2] BT CS 5.2 [Vol 1] パート F、コントローラ エラー コード
4

1 に答える 1