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

标签 c++ windows bluetooth esp32

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

问题 1:我正在使用 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]

最佳答案

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

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

根据您的描述,您似乎没有为 WSAxxx 函数提供正确的标志。

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

关于c++ - 是否可以通过 Windows C++ 应用程序的唯一地址检测到蓝牙设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52180209/

相关文章:

ios - 将 CoreBluetooth 与 iBeacon 结合使用

c++ - 使用 Xcode 调试 c++ .cpp 文件

c++ - 右值在不使用 std::move 的情况下导致警告

c++ template<template> 成员函数的模板特化

windows - Ansible Delegate_to WinRM

iOS beacon 区域监控需要开启蓝牙

c++ - 引用初始化和常量表达式

windows - 连接到剪贴板?

c - 如何使用 cl 编译 Window API 程序?

bluetooth - 蓝牙 LE 中的单模和双模如何进行配对