当你有名字时,你能获得蓝牙设备的蓝牙MAC地址吗?

时间:2014-12-03 14:26:27

标签: c++ winapi bluetooth mac-address

我目前正在用C ++创建一个程序,允许设备(目前只是我的智能手机)与PC配对。我使用的是WinApi函数,它实际上工作得很好。

要使程序正常工作,我目前需要将设备的蓝牙MAC地址传递给程序,更具体地说, BluetoothRegisterForAuthenticationEx MSDN功能需要它来配对设备。

现在,我实际上并不想输入我的蓝牙MAC地址,但可以输入设备名称(或其他内容)来配对设备。

我查看了winapi蓝牙功能,但没有找到任何内容,所以我的问题是,

当我有其他信息(例如设备名称)但尚未配对时,我是否可以通过编程方式获取某个设备的蓝牙MAC地址? 如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

您可以使用WSALookupServiceBeginWSALookupServiceNext启动设备发现,然后针对检测到的每个设备(每个WSAQUERYSET)将lpszServiceInstanceName与用户键入的名称进行比较。如果匹配,则您在lpcsaBuffer->RemoteAddr.lpSockaddr字段中有mac地址。此字段可以转换为PSOCKADDR_BTH,然后您可以在PSOCKADDR_BTH->btAddr

中获取MAC地址
WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;
HANDLE hLookup;
if(0 != WSALookupServiceBegin(&querySet, LUP_CONTAINERS | LUP_FLUSHCACHE, &hLookup))
{
    if(WSAGetLastError() != WSASERVICE_NOT_FOUND)
    {
        // error during WSALookupServiceBegin
    }
    else
    {
        //No BlueTooth device Found
    }
    return res;
}
DWORD deviceLength = 2000;
char buf[deviceLength];
WSAQUERYSET* pDevice = PWSAQUERYSET(buf);
while (0 == WSALookupServiceNext(hLookup, LUP_RETURN_ADDR | LUP_RETURN_NAME, &deviceLength, pDevice))
{
    PSOCKADDR_BTH sa = PSOCKADDR_BTH(pDevice->lpcsaBuffer->RemoteAddr.lpSockaddr);
    if(sa->addressFamily != AF_BTH)
    {
       // Address family is not AF_BTH  for bluetooth device discovered
        continue;
    }
    //the name is available in pDevice->lpszServiceInstanceName
    //the MAC address is available in sa->btAddr
}
WSALookupServiceEnd(hLookup);

答案 1 :(得分:0)

我在Windows SDK示例中找到了我正在搜索的确切方法。

Microsoft SDK \ Windows \ v7.0 \ Samples \ netds \ winsock \ bluetooth

mehtod被称为NameToBthAddr,并且与Eric Lemanissier所暗示的相似。