查找蓝牙设备的uuid

问题描述 投票:0回答:1

我正在尝试获取有关蓝牙设备提供的服务的信息。使用WSALookupServiceNext,我可以获得所有服务的列表。但是,无论我尝试发现哪种蓝牙设备,生成的WSAQUERYSET结构(pqs)都不会包含lpServiceClassId字段(而lpszServiceInstanceName始终存在)。我想知道服务的UUID,以确定它属于Table 2: Service Class Profile Identifiers的哪个类。

#include<winsock2.h>

int main()
{
    WSADATA data;
    WSAStartup(MAKEWORD(2, 2), &data);

    WSAQUERYSET qs{};
    qs.dwSize = sizeof(WSAQUERYSET);
    qs.dwNameSpace = NS_BTH;
    qs.dwNumberOfCsAddrs = 0;
    qs.lpszContext = (LPWSTR)L"12:34:56:78:99:11";
    qs.lpServiceClassId = const_cast<LPGUID>(&PublicBrowseGroupServiceClass_UUID);

    const DWORD flags = LUP_FLUSHCACHE | LUP_RETURN_ALL;
    HANDLE hlookup = nullptr;
    WSALookupServiceBegin(&qs, flags, &hlookup);
    while (true) {
        char buff[4096];
        WSAQUERYSET* pqs = (WSAQUERYSET*)buff;
        DWORD size = sizeof(buff);
        memset(buff, 0, size);

        const INT res = WSALookupServiceNext(hlookup, flags, &size, pqs);
        if (res != 0 && GetLastError() == WSA_E_NO_MORE) {
            break;
        }

        // it prints "service name=Advanced Audio, service uuid=0x0"
        wprintf(L"service name=%s, service uuid=0x%X\n", pqs->lpszServiceInstanceName, pqs->lpServiceClassId->Data1);
    }
}
c++ windows winapi bluetooth winsock2
1个回答
0
投票

回答我自己的问题:为了获得服务ID,我们必须解析从WSALookupServiceNext函数调用返回并可以通过WSAQUERYSET.lpBlob成员访问的SPD结构。有关更多详细信息,请参见Mike Petrichenko's comment。另外,还有一个很好的示例,如何从Qt framework source code实现它。

至于我,我决定不遵循这条路,因为我的目标是编写一个用于配对蓝牙设备的控制台实用程序。我发现使用Windows.Devices.Enumeration API有更好的方法。最后,使用此API,我设法创建了正在使用的BluetoothDevicePairing实用程序。

© www.soinside.com 2019 - 2024. All rights reserved.