Может ли устройство Bluetooth распознаваться по его уникальному адресу из приложения Windows C ++? - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно написать приложение, которое должно идентифицировать устройства «ESP32» и отправлять / получать данные из приложения Windows C ++.

Q1: я использую WSALookupServiceBegin() API, чтобы найти устройство BT, оно не работает должным образом. API возвращает 10108, пока я не нажму вручную «Добавить устройства» в окне Windows Bluetooth. Есть ли другой API / сервис, который может обнаружить BT рядом с устройствами, или я неправильно использую WSALookupServiceBegin() API? WSALookupServiceBegin() берет данные устройства из кеша Bluetooth? Я получил это сомнение, потому что API работает нормально только после ручного поиска в Windows.

Q2: можно ли подключиться к любому устройству Bluetooth только с Mac ID устройства BT из Windows?

Пожалуйста, найдите код ниже.

WSAQUERYSET data;
HANDLE handle;
ZeroMemory(&data, sizeof(data));
data.dwSize = sizeof(data);
data.dwNameSpace = NS_BTH;
data.lpcsaBuffer = NULL;

WSALookupServiceBegin(&data, LUP_CONTAINERS, &handle);
while(WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, 
&dwSize, pwsaResults)
{
 service_classID = pwsaResults->lpServiceClassId;
 _BTH_DEVICE_INFO *dev = (_BTH_DEVICE_INFO *)pwsaResults->lpBlob->pBlobData;

    SOCKET          LocalSocket = INVALID_SOCKET;
    SOCKADDR_BTH    SockAddrBthServer;

    SockAddrBthServer.btAddr = dev->address;
    SockAddrBthServer.addressFamily = AF_BTH;
    SockAddrBthServer.serviceClassId = *service_classID;
    SockAddrBthServer.port = 0;

    // connect to socket
    LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
    if (INVALID_SOCKET == LocalSocket) {
        wprintf(L"socket() call failed. WSAGetLastError = [%d]\n", WSAGetLastError());
        return -1;
    }

    if (SOCKET_ERROR == connect(LocalSocket,
        (struct sockaddr *) &SockAddrBthServer,
        sizeof(SOCKADDR_BTH))) {
        wprintf(L"connect() call failed. WSAGetLastError=[%d]\n", WSAGetLastError());
        return -1;
    }

}

ВЫХОД:

вызов connect () не выполнен. WSAGetLastError = [10049]

1 Ответ

0 голосов
/ 05 сентября 2018

WSALookupServiceBegin - правильный путь, но вы должны предоставить правильные флаги для него. Также вы можете использовать функции BluetoothFidnFirstDevice и BluetoothFindNextDevice из Bluetooth API.

Однако оба метода всегда возвращают сопряженные устройства, даже если они недоступны (вместе с только что найденными устройствами).

Судя по вашему описанию, вы не указали правильные флаги для функции WSAxxx.

Если вам известен MAC-адрес устройства, и он не был изменен, вы можете подключиться к устройству по MAC-адресу, не открывая его каждый раз. В зависимости от требований к аутентификации вашего устройства вам даже не нужно выполнять сопряжение с устройством (конечно, если ваше устройство не требует аутентификации и / или шифрования).

...