0

Bluetoothを搭載した2台のラップトップを接続しようとしています。これは、サーバーを作成するために使用しているコードです。

WSADATA wsd;
WSAStartup (MAKEWORD(1,0), &wsd);

SOCKET server_socket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

SOCKADDR_BTH sa;
memset(&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.port = 0 & 0xFF;

if(0 != bind(server_socket, (SOCKADDR *)&sa, sizeof(sa)))
{
    std::cout << "BIND ERROR: " << WSAGetLastError () << std::endl;
    closesocket(server_socket);
    return false;
}

if(0 != listen (server_socket, 5))
{
    std::cout << "LISTEN ERROR: " << WSAGetLastError () << std::endl;
    closesocket(server_socket);
    return false;
}

SOCKADDR_BTH sa2;
int size = sizeof(sa2);
SOCKET s2 = accept(server_socket, (SOCKADDR*)&sa2, &size);
if(s2 == INVALID_SOCKET)
{
    std::cout << "ACCEPT ERROR: " << WSAGetLastError () << std::endl;
    return false;
}
else
{
    std::cout << "Connected? " << WSAGetLastError () << std::endl;
}

そしてクライアントとして以下:

WSADATA wsd;
WSAStartup (MAKEWORD(1,0), &wsd);

SOCKET client_socket = socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BTH;
sa.btAddr = (BTH_ADDR)d.getDeviceAddress();
sa.port = 0;
sa.serviceClassId = *d.getLpServiceClassId();

if(client_socket == INVALID_SOCKET)
{
    std::cout << "SOCKET ERROR: " << WSAGetLastError () << std::endl;
    return false;
}
if (0 != connect (client_socket, (SOCKADDR *)&sa, sizeof(sa))) 
{
    std::cout << "CONNECT ERROR: " << WSAGetLastError () << std::endl;
    return false;
}
else
{
    //std::cout << "CONNECT ERROR: " << WSAGetLastError () << std::endl;
    //Perform error handling.s
    send(client_socket, "ABC",3,0);
    closesocket (client_socket);
    return true;
}

ここで、「b」は引数として与える Bluetooth デバイスで、bluetoothdevice クラスには次のフィールドがあります。

LPSOCKADDR local_address;
LPSOCKADDR device_address;
LPGUID lp_service_class_id;

これは機能する必要があります。しかし、サーバーに接続しようとすると、サーバーは何も取得せず、クライアントはエラー 10060 を返します。

このエラーは次のことを意味します。

WSAETIMEDOUT 10060

The I/O timed out at the Bluetooth radio level (PAGE_TIMEOUT).

Windows で Bluetooth スタックを操作したことがあり、このエラーの原因を知っている人はいますか?

4

1 に答える 1

0

サービスを Bluetooth SDP に登録しましたか? いいえの場合、クライアント コードで現在のアプローチを使用して接続することはできないと思います。MSDN から:

The bind function does not automatically advertise the server application using the Bluetooth SDP; applications must call the WSASetService function to be found by remote Bluetooth applications.

bindおよびconnectfuncsの bluetooth ドキュメントも参照してください。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa362901%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop /aa362901%28v=vs.85%29.aspx

私が理解しているように、別のアプローチは、portサーバー側とクライアント側の両方で明示的に指定しようとすることです。しかし、それは遊び場のアプリケーションだけで十分です.

Bluetooth の使用方法の詳細については、 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363058%28v=vs.85%29.aspxを参照してください。

于 2012-11-29T15:08:56.847 に答える