Windows C++ 应用程序可以通过其唯一地址检测到蓝牙设备吗?
Can a Bluetooth device be detected by its unique address from Windows C++ application?
我必须编写一个应用程序,它必须从 Windows C++ 应用程序识别 "ESP32" 设备和 send/receive 数据。
问题 1:我正在使用 WSALookupServiceBegin()
API 查找 BT 设备,它没有按预期工作。 API returns 10108 直到我手动点击 Windows 蓝牙 window 中的 "Add devices"。是否有任何其他 API/service 可以在设备附近发现 BT,或者我是否错误地使用了 WSALookupServiceBegin()
API?
WSALookupServiceBegin()
是否从蓝牙缓存中获取设备数据?我有这个疑问,因为 API 只有在 Windows.
中手动搜索后才能正常工作
Q2: Windows 的蓝牙设备的 Mac ID 是否可以连接到任何蓝牙设备?
请在下面找到代码。
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
是正确的方法,但您必须为其提供正确的标志。您还可以使用蓝牙 API.
中的 BluetoothFidnFirstDevice
和 BluetoothFindNextDevice
功能
然而,这两种方法总是 return 配对设备,即使它们不可用(连同刚刚找到的设备)。
根据您的描述,您似乎没有为 WSAxxx
函数提供正确的标志。
如果您知道设备的 MAC 并且它没有被更改,那么您可以通过 MAC 连接到设备而无需每次都重新发现它。根据您设备的身份验证要求,您甚至不需要与设备配对(当然如果您的设备不需要身份验证 and/or 加密)。
我必须编写一个应用程序,它必须从 Windows C++ 应用程序识别 "ESP32" 设备和 send/receive 数据。
问题 1:我正在使用 WSALookupServiceBegin()
API 查找 BT 设备,它没有按预期工作。 API returns 10108 直到我手动点击 Windows 蓝牙 window 中的 "Add devices"。是否有任何其他 API/service 可以在设备附近发现 BT,或者我是否错误地使用了 WSALookupServiceBegin()
API?
WSALookupServiceBegin()
是否从蓝牙缓存中获取设备数据?我有这个疑问,因为 API 只有在 Windows.
Q2: Windows 的蓝牙设备的 Mac ID 是否可以连接到任何蓝牙设备?
请在下面找到代码。
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
是正确的方法,但您必须为其提供正确的标志。您还可以使用蓝牙 API.
BluetoothFidnFirstDevice
和 BluetoothFindNextDevice
功能
然而,这两种方法总是 return 配对设备,即使它们不可用(连同刚刚找到的设备)。
根据您的描述,您似乎没有为 WSAxxx
函数提供正确的标志。
如果您知道设备的 MAC 并且它没有被更改,那么您可以通过 MAC 连接到设备而无需每次都重新发现它。根据您设备的身份验证要求,您甚至不需要与设备配对(当然如果您的设备不需要身份验证 and/or 加密)。