使用C++和Winsock实现蓝牙技术

8
我发现在C++中获取蓝牙通信的信息非常困难。具体来说,我想避免使用任何第三方库,只想连接到已经与我的电脑配对的设备。
该设备已经输入了密码,并在“我的设备和打印机”下的“显示蓝牙设备”中可用。我正在使用Windows 7和Visual Studio 2013专业版进行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;
}
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

谢谢您的回复和示例代码,我感觉离成功很近了。我正在使用原帖中第一个链接中的代码,并从m_device_info.Address.ullLong请求中获取地址,这给了我UID(66663322e)。这与蓝牙属性下的UID(00:06:63:32:2e)匹配,但没有冒号或起始零。当我将其用作sockAddr.btAddr时,似乎无法正常工作,因为错误函数返回-1。我是否以错误的格式输入了地址(UID)?再次感谢。 - ritchie888
蓝牙地址由6个字节组成(例如00:06:63:32:2e:fb),而不是5个(可能有一个额外的前导0x00)。如果您先配对设备,则可以在“控制面板->设备和打印机->您的设备->属性->蓝牙地址”中看到它的BT地址。我已编辑我的答案以显示我如何从配对列表数据中获取地址。 - BitBank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接