【问题标题】:How do I format an bluetooth address as a btaddr?如何将蓝牙地址格式化为 btaddr?
【发布时间】:2021-11-27 02:47:57
【问题描述】:

我有一个蓝牙地址 (7C9EBD4CBFB2),需要使用 winsock 连接。这是我的代码,它返回错误为 -1,并且不会连接到我的设备。

#include <winsock2.h>
#include <ws2bth.h>
#pragma comment(lib, "Ws2_32.lib")
#include <Windows.h>
#include <iostream>
using namespace std;
SOCKADDR_BTH sockAddr;
SOCKET btSocket;
int error;

int main() {
    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 = 0x7C9EBD4CBFB2;
    error = connect(btSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
    cout << error;
}

如何格式化它以用作 btaddr?谢谢。

【问题讨论】:

  • 这一行的错误:sockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;。必须是 sockAddr.serviceClassId = SerialPortServiceClass_UUID

标签: c++ bluetooth winsock


【解决方案1】:

您没有在socket() 之前调用WSAStartup()。如果您一直在进行更好的错误检查,您会更快地意识到这一点。见Handling Winsock Errors

socket() 将返回 INVALID_SOCKET (-1),然后 WSAGetLastError() 将返回 WSANOTINITIALISED (10093)。

成功的WSAStartup尚未执行。

应用程序未调用 WSAStartupWSAStartup 失败。应用程序可能正在访问当前活动任务不拥有的套接字(即尝试在任务之间共享套接字),或者 WSACleanup 已被调用太多次。

然后connect() 会以SOCKET_ERROR (-1) 失败,WSAGetLastError() 会返回WSAENOTSOCK (10038)。

非套接字上的套接字操作。

试图对不是套接字的东西进行操作。套接字句柄参数没有引用有效的套接字,或者对于 selectfd_set 的成员无效。

根据Bluetooth Programming with Windows Sockets 文档:

与所有 Windows Sockets 应用程序编程一样,必须调用 WSAStartup 函数来启动 Windows Sockets 功能并启用蓝牙。

始终检查系统调用的错误代码!

试试这样的:

#include <winsock2.h>
#include <ws2bth.h>
#include <Windows.h>
#include <iostream>
#include <cstdio>
#pragma comment(lib, "Ws2_32.lib")

int str2ba(const char *straddr, BTH_ADDR *btaddr)
{
    int i;
    unsigned int aaddr[6];
    BTH_ADDR tmpaddr = 0;

    if (std::sscanf(straddr, "%02x:%02x:%02x:%02x:%02x:%02x",
                    &aaddr[0], &aaddr[1], &aaddr[2],
                    &aaddr[3], &aaddr[4], &aaddr[5]) != 6)
        return 1;
    *btaddr = 0;
    for (i = 0; i < 6; i++) {
        tmpaddr = (BTH_ADDR) (aaddr[i] & 0xff);
        *btaddr = ((*btaddr) << 8) + tmpaddr;
    }
    return 0;
}

int main() {
    WSADATA wsa;
    memset(&wsa, 0, sizeof(wsa));

    int error = WSAStartup(MAKEWORD(2,2), &wsa);
    if (error != 0) {
        std::cerr << "WSAStartup() failed, error: " << error;
        return -1;
    }

    SOCKET btSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
    if (btSocket == INVALID_SOCKET) {
        error = WSAGetLastError();
        std::cerr << "socket() failed, error: " << error;
        WSACleanup();
        return -1;
    }

    SOCKADDR_BTH sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.addressFamily = AF_BTH;
    sockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
    sockAddr.port = BT_PORT_ANY;
    str2ba("7C:9E:BD:4C:BF:B2", &sockAddr.btAddr);

    if (connect(btSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR) {
        error = WSAGetLastError();
        std::cerr << "connect() failed, error: " << error;
        closesocket(btSocket);
        WSACleanup();
        return -1;
    }

    // use btSocket as needed...

    closesocket(btSocket);
    return 0;
}

【讨论】:

  • 谢谢!我认为有更好的方法来检查套接字错误,但我不知道如何。
  • 看了你的回答我就知道了。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
相关资源
最近更新 更多