可以通过Windows C ++应用程序中的唯一地址检测到蓝牙设备吗?

时间:2018-09-05 08:08:07

标签: c++ windows bluetooth esp32

我必须编写一个必须识别“ ESP32”设备并从Windows C ++应用程序发送/接收数据的应用程序。

Q1:我正在使用WSALookupServiceBegin() API查找BT设备,但该设备无法正常工作。 API返回10108,直到我在Windows蓝牙窗口中手动单击“添加设备”。是否有其他API /服务可以在设备附近发现BT,还是我错误地使用了WSALookupServiceBegin() API? WSALookupServiceBegin()是否从蓝牙缓存中获取设备数据?我对此表示怀疑,因为API仅在Windows中手动搜索后才能正常工作。

Q2:是否可以从Windows仅通过BT设备的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]

1 个答案:

答案 0 :(得分:1)

WSALookupServiceBegin是正确的方法,但是您必须为其提供正确的标志。您也可以使用Bluetooth API中的BluetoothFidnFirstDeviceBluetoothFindNextDevice函数。

但是,这两种方法总是返回配对的设备,即使它们不可用(以及刚刚找到的设备)。

从您的描述看来,您没有为WSAxxx函数提供正确的标志。

如果您知道设备的MAC并且尚未更改,则可以通过MAC连接到设备,而无需每次都重新发现它。根据设备的身份验证要求,甚至不需要与设备配对(当然,如果您的设备不需要身份验证和/或加密)。