Среда:
Сразу скажу, что HCI BlueZ C API ( hci_lib.h ) плохо документирован, учитывая, что существует ли API-интерфейс C hci_ *, контролирующий состояние обнаружения хоста? что-то похожее на «hci_write_simple_pairing_mode», позволяющее контролировать обнаруживаемость?
Следующая команда 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)
Решение можно найти на 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;
}