8

我发现很难在 C++ 中获取有关蓝牙通信的信息。具体来说,我想避免使用任何第三方库,我只想连接到已经与我的计算机配对的设备。

该设备已经输入了密码,并且可以在我的设备和打印机下的“显示蓝牙设备”中找到。我正在使用 Windows 7 和 Visual Studio 2013 Professional 进行 C++ 开发。

我有一些示例代码(来自这里http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedotherprotocol4k.html),它在我的蓝牙收音机上显示信息,然后显示设备信息,它似乎运行良好。尽管它会打印出每个已经与计算机配对的蓝牙设备,而不是在范围内的设备,但这可能是我误解了代码应该做什么。

我一直在浏览蓝牙参考页面(http://msdn.microsoft.com/en-us/library/windows/desktop/aa362930%28v=vs.85%29.aspx),所有功能都只是为了设置蓝牙无线电可用性和其他类似的事情;根本没有连接到找到的设备的迹象。

我一定是遗漏了一些东西,在谷歌搜索时使用了错误的关键词或其他东西,因为我没有发现任何关于连接到蓝牙设备的信息!

如果有人有任何建议、代码或链接,那就太好了!我可以使用串行功能连接到我的设备(非常容易),但我必须手动输入它注册的 COM 端口,这对用户不是很友好。我想扫描并选择,或输入蓝牙设备名称,然后以这种方式连接。

干杯

编辑:

BitBanks 的回答为我指明了正确的方向。唯一缺少的是任何套接字请求之前的 WSAStartup 请求:

WORD wVersionRequested;
WSADATA wsaData;
int err;

/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
    /* Tell the user that we could not find a usable */
    /* Winsock DLL.                                  */
    printf("WSAStartup failed with error: %d\n", err);
    return 1;
}
4

1 回答 1

10

如果您有来自发现或配对设备列表的蓝牙地址,您可以像这样连接到它(需要添加错误检查):

#include <winsock2.h>
#include <ws2bth.h>
SOCKADDR_BTH sockAddr;
SOCKET btSocket;
int error;

   btSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
   memset (&sockAddr, 0, sizeof(sockAddr));
   sockAddr.addressFamily = AF_BTH;
   sockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
   sockAddr.port = BT_PORT_ANY;
   sockAddr.btAddr = <your bluetooth address>
   error = connect(btSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));

一些设备宣传 SerialPortServiceClass_UUID 而不是 RFCOMM_PROTOCOL_UUID。您可能还需要多次重试连接。某些实施不佳的蓝牙设备(咳嗽PowerA Moga咳嗽)需要多次尝试连接。

这可能不是官方的做法,但我从配对列表中获得了我感兴趣的设备的 6 字节 BT 地址,如下所示:

unsigned char *p;
ULONGLONG ullAddr;

   p = (unsigned char *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr; // point to addr
   memcpy(&ullAddr, &p[2], 8); // copy Bluetooth address of device we found
于 2013-11-20T02:09:57.833 回答