Наличие удаленного устройства BlueZ - PullRequest
1 голос
/ 04 мая 2020

Использование BlueZ , который

является официальным Linux стеком Bluetooth

Я хотел бы знать, какой из двух приведенных ниже методы лучше подходят для обнаружения присутствия устройства поблизости. Точнее, я хочу периодически сканировать устройство Bluetooth (не BLE => рекламные пакеты не отправляются).

Я нашел два способа его обнаружения:

1.) Использование l2ping

# l2ping BTMAC

2.) Использование hcitool

# hcitool name BTMAC

Оба подхода работают.

Я хотел бы знать, какой подход разрядит больше батареи отсканированного устройство?

Глядя на решение № 1 ( источник l2ping ):

Он использует стандартный вызов сокета connect для подключения к удаленному устройству, затем использует send команда для отправки данных на него:

send(sk, send_buf, L2CAP_CMD_HDR_SIZE + size, 0)

Теперь L2CAP_CMD_HDR_SIZE равно 4, а по умолчанию size равно 44, поэтому всего 48 байтов отправляются и возвращаются с L2CAP_ECHO_REQ.

Для hcitool я только что нашел точку входа:

int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to);

Мои вопросы:

  • , какой из этих подходов лучше (менее энергозатратен) для удаленного устройство? Если есть какая-либо разница.
  • Должен ли я уменьшить размер l2ping? Какой должен быть минимум?
  • Правильно ли мое предположение, что hci_read_remote_name также подключается к удаленному устройству и отправляет ему какой-то запрос на получение его имени?

1 Ответ

1 голос
/ 12 мая 2020

Чтобы ответить на ваши вопросы: -

Какой из этих подходов лучше (менее энергозатратен) для удаленного устройства? Если есть какая-либо разница.

l2ping BTMA C - более подходящая команда исключительно потому, что она предназначена именно для этого. В то время как «имя hcitool BTMA C» используется для получения имени удаленного устройства, «l2ping» используется для обнаружения его присутствия, чего вы и хотите достичь. Разница в потребляемой мощности действительно минимальна, но если она есть, то l2ping должен потреблять меньше энергии.

Должен ли я уменьшить размер l2ping? Какой должен быть минимум?

Если изменение размера l2ping требует изменения исходного кода, то я рекомендую оставить его тем же. Оставляя его тем же, вы используете ту же команду, которая использовалась бесчисленное количество раз, и ту же команду, которая использовалась для квалификации стека BlueZ. Таким образом, существует меньше шансов на ошибку, и любое изменение не приведет к заметным улучшениям производительности или энергопотребления.

мое предположение верно, что hci_read_remote_name также подключается к удаленному устройству и отправляет некоторый запрос на него для вернуть свое имя?

Да, ваше предположение верно. В соответствии со спецификацией Bluetooth v5.2, том 4, часть E, раздел 7.1.19 Команда запроса удаленного имени:

Если между локальным устройством и устройством, соответствующим BD_ADDR, не установлено временное соединение, временный Будет установлено соединение на канальном уровне для получения функций LMP и имени удаленного устройства.

Надеюсь, это поможет.

...