Я должен написать приложение, которое должно идентифицировать устройства «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]
WSALookupServiceBegin
это правильный путь, но вы должны предоставить правильные флаги для него. Также вы можете использовать BluetoothFidnFirstDevice
а также BluetoothFindNextDevice
функции из Bluetooth API.
Однако оба метода всегда возвращают спаренные устройства, даже если они недоступны (вместе с только что найденными устройствами).
Из вашего описания, похоже, вы не указали правильные флаги для WSAxxx
функция.
Если вы знаете MAC-адрес устройства, и он не был изменен, то вы можете подключиться к устройству по MAC-адресу без повторного обнаружения его каждый раз. В зависимости от требований к аутентификации вашего устройства вам даже не нужно выполнять сопряжение с устройством (конечно, если ваше устройство не требует аутентификации и / или шифрования).
Других решений пока нет …