Создание соединения Bluetooth на Windows с использованием C ++ (ошибка 10060)

Я пытаюсь подключить 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).

Есть ли здесь кто-нибудь, кто работал со стеком bluetooth на windows и знает, откуда эта ошибка?

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.

Также посмотрите документацию по Bluetooth для bind а также connect funcs:

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 явно на стороне сервера и клиента. Но этого будет достаточно только для игровых площадок.

Вы можете обратиться к http://msdn.microsoft.com/en-us/library/windows/desktop/aa363058%28v=vs.85%29.aspx для получения дополнительной информации об использовании Bluetooth.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]