2015-05-05 4 views
1

Окружающая среда:BlueZ hci_ * API, чтобы хозяин обнаруживаемым

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

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

+0

AFAIK В IC HCI нет такого API. Но определенно это через API-интерфейс адаптера Bluez DBUS (https://github.com/r10r/bluez/blob/master/doc/adapter-api.txt). И HCI lib действительно используется для внутреннего использования (хотя многие используют его). Одна из причин, почему это не лучше документировано, я думаю. – kaylum

ответ

0

Решение можно найти на hciconfig.c в конкретном на 'cmd_scan' реализации (с оцами = "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

Следующая 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)