Visual Studio — Bluetooth с C ++ и Winsock

Мне очень трудно получить информацию о связи Bluetooth в C ++. В частности, я хочу избежать использования каких-либо сторонних библиотек и просто хочу подключиться к устройству, уже связанному с моим компьютером.

Устройство уже имеет введенный пароль и доступно в разделе «Показать устройства Bluetooth» в разделе «Мои устройства и принтеры». Я использую Windows 7 и Visual Studio 2013 Professional для разработки на C ++.

У меня есть пример кода (отсюда http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedotherprotocol4k.html), которая отображает информацию на моем радио Bluetooth, а затем отображает информацию об устройстве, и, кажется, работает хорошо. Хотя он распечатывает все Bluetooth-устройства, уже сопряженные с компьютером, а не те, которые находятся в пределах досягаемости, но это может быть моей ошибочной интерпретацией того, что код должен делать.

Я просматривал справочную страницу Bluetooth (http://msdn.microsoft.com/en-us/library/windows/desktop/aa362930%28v=vs.85%29.aspx) и все функции связаны с настройкой доступности радио Bluetooth и другими подобными вещами; никаких признаков подключения к найденному устройству вообще.

Я, должно быть, что-то упускаю, использую неправильные ключевые слова при поиске в Google или что-то еще, потому что я ничего не нашел о подключении к устройству Bluetooth!

Если у кого-то есть предложения, код или ссылки, это было бы здорово! Я могу подключиться к своему устройству с помощью последовательной функциональности (очень легко), но мне нужно вручную ввести COM-порт, на котором он зарегистрирован, что не очень удобно для пользователя. Я хочу отсканировать и выбрать или ввести имя устройства Bluetooth и подключиться таким образом.

ура

РЕДАКТИРОВАТЬ:

Ответ 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

Решение

Если у вас есть адрес Bluetooth из обнаружения или из списка сопряженных устройств, вы можете подключиться к нему следующим образом (необходимо добавить проверку ошибок):

#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. Вам также может понадобиться повторить попытку подключения несколько раз. Некоторые плохо реализованные устройства Bluetooth (кашель 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
7

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

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

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