BlueZ hci_ * API для обнаружения хоста

Среда:

  • Linux
  • Bluetooth-стек BlueZ
  • C API
  • Нет использования интерфейса dbus

Сразу скажу, что HCI BlueZ C API ( hci_lib.h ) плохо документирован, учитывая, что существует ли API-интерфейс C hci_ *, контролирующий состояние обнаружения хоста? что-то похожее на «hci_write_simple_pairing_mode», позволяющее контролировать обнаруживаемость?

2

Решение

Следующая команда hci делает адаптер доступным для обнаружения
hciconfig hci0 piscan

Ниже приведен соответствующий код от hciconfig

if (!strcmp(opt, "pscan"))
dr.dev_opt = SCAN_PAGE;
else if (!strcmp(opt, "piscan"))
dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY;
if (ioctl(ctl, HCISETSCAN, (unsigned long) &dr) < 0) {

Вот ctl — это то, что получено из:

 if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0)
1

Другие решения

Решение можно найти на hciconfig.c в частности, при реализации ‘cmd_scan’ (имеющей opt = «piscan»), вывод которой следует

    HRESULT BluZbridge::SetDiscoverable(IN BOOL bVisible) {
if (0 == m_fdHCI)
return HRESULT_FROM_WIN32(ERROR_NOT_READY);
hci_dev_req req = { DEFAULT_HCI_ADAPTER_ID, ((TRUE == bVisible) ? (SCAN_PAGE | SCAN_INQUIRY) : SCAN_DISABLED) };
if (ioctl(m_fdHCI, HCISETSCAN, (unsigned long)&req) < 0) {
perror("Can't set scan mode on hci0");
return HRESULT_GET_ERRNO();
}
return S_OK;
}
0