HCI_LE_Set_Advertising_Enable コマンドが成功した場合はステータスを返し、コマンドが失敗した場合はステータス コード[2]HCI_LE_Set_Advertising_Enable
を返す [1] コマンドを使用して、BLE アドバタイジングを有効にすることができます。0x00
0x01 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、コントローラ エラー コード