Я пытаюсь установить соединение с настраиваемым устройством Bluetooth без использования COM-портов. Однако я получаю сообщение об ошибке: [10049] «Запрошенный адрес недействителен в своем контексте». Что я делаю неправильно?
static Guid serviceClass= new Guid("4d36e978-e325-11ce-bfc1-08002be10318"); //GUID of device class
static BluetoothAddress addr = BluetoothAddress.Parse("001210160177"); //from device
BluetoothDeviceInfo device = new BluetoothDeviceInfo(addr);
device.SetServiceState(serviceClass, true);
Console.WriteLine(BluetoothSecurity.PairRequest(device.DeviceAddress, "0000")); //pairing my device - writes True
BluetoothEndPoint ep = new BluetoothEndPoint(addr, serviceClass);
BluetoothClient conn = new BluetoothClient(ep); //10049 error
conn.Connect(ep);
Console.WriteLine(conn.GetStream());
2 ответа
Лучший ответ
Все это описано в документации по проекту.
Короче, удалите эту строку SetServiceState
, это ненужно / плохо. Выполнять сопряжение каждый раз также необязательно и немного медленно, но, вероятно, не стоит менять, если оно работает хорошо.
Docs :
1) http://32feet.codeplex.com/documentation
- «См. Раздел« Общие подключения данных Bluetooth »ниже. BluetoothClient предоставляет поток для чтения и записи — нет необходимости использовать виртуальные COM-порты»
2) http://32feet.codeplex.com/wikipage?title=General % 20Bluetooth% 20Data% 20Connections
BluetoothAddress addr
= BluetoothAddress.Parse("001122334455");
Guid serviceClass;
serviceClass = BluetoothService.SerialPort;
// - or - etc
// serviceClass = MyConsts.MyServiceUuid
//
var ep = new BluetoothEndPoint(addr, serviceClass);
var cli = new BluetoothClient();
cli.Connect(ep);
Stream peerStream = cli.GetStream();
peerStream.Write/Read ...
3) http://32feet.codeplex.com/wikipage?title=Errors
- 10049 «Запрошенный адрес недействителен в своем контексте.»
- На удаленном устройстве не работает служба с данным идентификатором класса обслуживания
То есть Неверный идентификатор класса обслуживания.
2
alanjmcf
15 Мар 2014 в 14:55
Вот как наконец катится.
device.SetServiceState(serviceClass, true); //do it before pairing
...
BluetoothClient conn = new BluetoothClient();
conn.Connect(ep);
Также моя ошибка здесь:
static Guid serviceClass = new Guid("4d36e978-e325-11ce-bfc1-08002be10318");
//GUID of device class
Должно быть:
static Guid serviceClass = new Guid("00001101-0000-1000-8000-00805f9b34fb");
//GUID of bluetooth service
Чтобы увидеть правильный GUID, обратитесь к настройкам / свойствам вашего устройства (не ключа). Вы можете увидеть их из Windows.
0
ammme
14 Мар 2014 в 13:23
- Remove From My Forums
-
Question
-
Hi,
I’m writing a program to connect to a bluetooth device using Winsock. In discovery mode, I can find the device, but when I try to connect() I always get the error 10049 (WSAEADDRNOTAVAIL — Address not available). What is the problem?
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return (EXIT_FAILURE); if ((_socket = socket(AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET) return (EXIT_FAILURE); SOCKADDR_BTH sa; std::memset(&sa, 0, sizeof(sa)); int nSizeInput = sizeof(sa); int result = WSAStringToAddress(_address, AF_BTH, NULL, (LPSOCKADDR)&sa, &nSizeInput); // To validate the address... char addressStr[64] = {0}; DWORD dwSizeOfStr = sizeof(addressStr); WSAAddressToStringA((LPSOCKADDR)&sa, nSizeInput, NULL, addressStr, &dwSizeOfStr); result = connect(_socket, (SOCKADDR*)&sa, sizeof(sa));
Answers
-
There’s a sample that covers this in the WM6 SDK:
Windows Mobile 6 SDKSamplesPocketPCCPPwin32BluetoothBthChatTry setting the addressFamily member of SOCKADDR_BTH to AF_BT.
Also, try setting the btAddr member to one of the devices returned from WSALookupServiceNext.
http://msdn.microsoft.com/en-us/library/aa916570.aspx-PaulH
- Marked as answer by
Tuesday, March 1, 2011 8:15 AM
- Marked as answer by
I’m developing a dll in visual-c++ for client side application to connect my pc to my android phone via bluetooth. I use this function to find my bluetooth service on the phone(see commented code!):
bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){
this->checkStartup();
HBLUETOOTH_DEVICE_FIND found_devices;
BLUETOOTH_DEVICE_INFO device_info;
device_info.dwSize = sizeof(device_info);
BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria;
search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
search_criteria.fReturnAuthenticated = TRUE;
search_criteria.fReturnRemembered = FALSE;
search_criteria.fReturnConnected = FALSE;
search_criteria.fReturnUnknown = FALSE;
search_criteria.fIssueInquiry = FALSE;
search_criteria.cTimeoutMultiplier = 0;
found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info);
if (found_devices == NULL)
{
_tprintf(TEXT("Error: n%sn"), getErrorMessage(WSAGetLastError(), error));
return false;
}
WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.lpServiceClassId = guid;
querySet.dwNameSpace = NS_BTH;
SOCKADDR_BTH sab;
memset (&sab, 0, sizeof(sab));
sab.addressFamily = AF_BTH;
char addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);
bool found = false;
do
{
sab.btAddr = device_info.Address.ullLong;
if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){
_tprintf(TEXT("Error get the mac of the device %sn.Going to the next device."), device_info.szName);
}
else{
_tprintf(TEXT("Check on device %s%s for the service.n"), device_info.szName, addressAsString);
querySet.lpszContext =(LPWSTR) addressAsString;
HANDLE service_lookup_handle;
DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB;
int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle);
if (0 == result)
{
BYTE buffer[2000];
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults))
{
_tprintf(TEXT("Service : %sn"), pResults->lpszServiceInstanceName);
_tprintf(TEXT("Comment : %sn"), pResults->lpszComment);
*ret = pResults->lpcsaBuffer->RemoteAddr;
found = true;
/* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength))
{
printf("connected");
//closesocket (*sock);
//return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
*/
}
result = WSALookupServiceEnd(service_lookup_handle);
}
else
_tprintf(TEXT("%snGoing to the next device..n"), getErrorMessage(GetLastError(), error));
}
} while (BluetoothFindNextDevice(found_devices, &device_info) && !found);
if(found_devices)
BluetoothFindDeviceClose(found_devices);
_tprintf(TEXT("No more device.n"));
return found;
}
And this one to connect to the phone:
bool BlueRayXVR::connect(_SOCKET_ADDRESS* host)
{
this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (this->sock == INVALID_SOCKET)
{
_tprintf(TEXT("Failed to get bluetooth socket! %sn"), getErrorMessage(WSAGetLastError(), error));
exit(1);
}
if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength))
{
printf("connectedn");
return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
return FALSE;
}
In my test console app i do:
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
printf("service founded..try to connect..n");
if(blue->connect(&address))
blue->read();
}
The problem is that if i run my code i always get error 10049.
the strange thing is that if i uncomment the lines of code in findPairedService function and i just do
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
it succesfully connect to the phone….
what’s wrong??
Thanks!
I’m developing a dll in visual-c++ for client side application to connect my pc to my android phone via bluetooth. I use this function to find my bluetooth service on the phone(see commented code!):
bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){
this->checkStartup();
HBLUETOOTH_DEVICE_FIND found_devices;
BLUETOOTH_DEVICE_INFO device_info;
device_info.dwSize = sizeof(device_info);
BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria;
search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
search_criteria.fReturnAuthenticated = TRUE;
search_criteria.fReturnRemembered = FALSE;
search_criteria.fReturnConnected = FALSE;
search_criteria.fReturnUnknown = FALSE;
search_criteria.fIssueInquiry = FALSE;
search_criteria.cTimeoutMultiplier = 0;
found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info);
if (found_devices == NULL)
{
_tprintf(TEXT("Error: n%sn"), getErrorMessage(WSAGetLastError(), error));
return false;
}
WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.lpServiceClassId = guid;
querySet.dwNameSpace = NS_BTH;
SOCKADDR_BTH sab;
memset (&sab, 0, sizeof(sab));
sab.addressFamily = AF_BTH;
char addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);
bool found = false;
do
{
sab.btAddr = device_info.Address.ullLong;
if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){
_tprintf(TEXT("Error get the mac of the device %sn.Going to the next device."), device_info.szName);
}
else{
_tprintf(TEXT("Check on device %s%s for the service.n"), device_info.szName, addressAsString);
querySet.lpszContext =(LPWSTR) addressAsString;
HANDLE service_lookup_handle;
DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB;
int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle);
if (0 == result)
{
BYTE buffer[2000];
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults))
{
_tprintf(TEXT("Service : %sn"), pResults->lpszServiceInstanceName);
_tprintf(TEXT("Comment : %sn"), pResults->lpszComment);
*ret = pResults->lpcsaBuffer->RemoteAddr;
found = true;
/* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength))
{
printf("connected");
//closesocket (*sock);
//return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
*/
}
result = WSALookupServiceEnd(service_lookup_handle);
}
else
_tprintf(TEXT("%snGoing to the next device..n"), getErrorMessage(GetLastError(), error));
}
} while (BluetoothFindNextDevice(found_devices, &device_info) && !found);
if(found_devices)
BluetoothFindDeviceClose(found_devices);
_tprintf(TEXT("No more device.n"));
return found;
}
And this one to connect to the phone:
bool BlueRayXVR::connect(_SOCKET_ADDRESS* host)
{
this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (this->sock == INVALID_SOCKET)
{
_tprintf(TEXT("Failed to get bluetooth socket! %sn"), getErrorMessage(WSAGetLastError(), error));
exit(1);
}
if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength))
{
printf("connectedn");
return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
return FALSE;
}
In my test console app i do:
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
printf("service founded..try to connect..n");
if(blue->connect(&address))
blue->read();
}
The problem is that if i run my code i always get error 10049.
the strange thing is that if i uncomment the lines of code in findPairedService function and i just do
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
it succesfully connect to the phone….
what’s wrong??
Thanks!
I’m trying to establish a connection with a custom bluetooth device without using COM ports. However, I’m getting an error: [10049] «The requested address is not valid in its context». What am I doing wrong?
static Guid serviceClass= new Guid("4d36e978-e325-11ce-bfc1-08002be10318"); //GUID of device class
static BluetoothAddress addr = BluetoothAddress.Parse("001210160177"); //from device
BluetoothDeviceInfo device = new BluetoothDeviceInfo(addr);
device.SetServiceState(serviceClass, true);
Console.WriteLine(BluetoothSecurity.PairRequest(device.DeviceAddress, "0000")); //pairing my device - writes True
BluetoothEndPoint ep = new BluetoothEndPoint(addr, serviceClass);
BluetoothClient conn = new BluetoothClient(ep); //10049 error
conn.Connect(ep);
Console.WriteLine(conn.GetStream());
asked Mar 12, 2014 at 8:45
Its all covered in the project’s documentation.
In short, remove that SetServiceState
line it is unnecessary/bad. Doing the pairing each time is also unnecessary and a bit slow but probably not worth changing if its working well.
Docs:
1) http://32feet.codeplex.com/documentation
- «See section General Bluetooth Data Connections below. The BluetoothClient provides the Stream to read and write on — there is no need to use virtual COM ports»
2) http://32feet.codeplex.com/wikipage?title=General%20Bluetooth%20Data%20Connections
BluetoothAddress addr
= BluetoothAddress.Parse("001122334455");
Guid serviceClass;
serviceClass = BluetoothService.SerialPort;
// - or - etc
// serviceClass = MyConsts.MyServiceUuid
//
var ep = new BluetoothEndPoint(addr, serviceClass);
var cli = new BluetoothClient();
cli.Connect(ep);
Stream peerStream = cli.GetStream();
peerStream.Write/Read ...
3) http://32feet.codeplex.com/wikipage?title=Errors
- 10049 «The requested address is not valid in its context.»
- No Service with given Service Class Id is running on the remote device
i.e. Wrong Service Class Id.
answered Mar 15, 2014 at 10:55
alanjmcfalanjmcf
3,4221 gold badge17 silver badges14 bronze badges
Here’s how it finally rolls.
device.SetServiceState(serviceClass, true); //do it before pairing
...
BluetoothClient conn = new BluetoothClient();
conn.Connect(ep);
Also, my mistake here:
static Guid serviceClass = new Guid("4d36e978-e325-11ce-bfc1-08002be10318");
//GUID of device class
Should be:
static Guid serviceClass = new Guid("00001101-0000-1000-8000-00805f9b34fb");
//GUID of bluetooth service
For seeing the proper GUID, refer to your device’s (not dongle’s) settings/properties. You can see them from Windows.
answered Mar 14, 2014 at 9:23
ammmeammme
331 silver badge4 bronze badges
- Remove From My Forums
-
Question
-
Hi,
I’m writing a program to connect to a bluetooth device using Winsock. In discovery mode, I can find the device, but when I try to connect() I always get the error 10049 (WSAEADDRNOTAVAIL — Address not available). What is the problem?
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return (EXIT_FAILURE); if ((_socket = socket(AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET) return (EXIT_FAILURE); SOCKADDR_BTH sa; std::memset(&sa, 0, sizeof(sa)); int nSizeInput = sizeof(sa); int result = WSAStringToAddress(_address, AF_BTH, NULL, (LPSOCKADDR)&sa, &nSizeInput); // To validate the address... char addressStr[64] = {0}; DWORD dwSizeOfStr = sizeof(addressStr); WSAAddressToStringA((LPSOCKADDR)&sa, nSizeInput, NULL, addressStr, &dwSizeOfStr); result = connect(_socket, (SOCKADDR*)&sa, sizeof(sa));
Answers
-
There’s a sample that covers this in the WM6 SDK:
Windows Mobile 6 SDKSamplesPocketPCCPPwin32BluetoothBthChatTry setting the addressFamily member of SOCKADDR_BTH to AF_BT.
Also, try setting the btAddr member to one of the devices returned from WSALookupServiceNext.
http://msdn.microsoft.com/en-us/library/aa916570.aspx-PaulH
- Marked as answer by
Tuesday, March 1, 2011 8:15 AM
- Marked as answer by
Я пытаюсь установить соединение с настраиваемым устройством Bluetooth без использования COM-портов. Однако я получаю сообщение об ошибке: [10049] «Запрошенный адрес недействителен в своем контексте». Что я делаю неправильно?
static Guid serviceClass= new Guid("4d36e978-e325-11ce-bfc1-08002be10318"); //GUID of device class
static BluetoothAddress addr = BluetoothAddress.Parse("001210160177"); //from device
BluetoothDeviceInfo device = new BluetoothDeviceInfo(addr);
device.SetServiceState(serviceClass, true);
Console.WriteLine(BluetoothSecurity.PairRequest(device.DeviceAddress, "0000")); //pairing my device - writes True
BluetoothEndPoint ep = new BluetoothEndPoint(addr, serviceClass);
BluetoothClient conn = new BluetoothClient(ep); //10049 error
conn.Connect(ep);
Console.WriteLine(conn.GetStream());
2 ответа
Лучший ответ
Все это описано в документации по проекту.
Короче, удалите эту строку SetServiceState
, это ненужно / плохо. Выполнять сопряжение каждый раз также необязательно и немного медленно, но, вероятно, не стоит менять, если оно работает хорошо.
Docs :
1) http://32feet.codeplex.com/documentation
- «См. Раздел« Общие подключения данных Bluetooth »ниже. BluetoothClient предоставляет поток для чтения и записи — нет необходимости использовать виртуальные COM-порты»
2) http://32feet.codeplex.com/wikipage?title=General % 20Bluetooth% 20Data% 20Connections
BluetoothAddress addr
= BluetoothAddress.Parse("001122334455");
Guid serviceClass;
serviceClass = BluetoothService.SerialPort;
// - or - etc
// serviceClass = MyConsts.MyServiceUuid
//
var ep = new BluetoothEndPoint(addr, serviceClass);
var cli = new BluetoothClient();
cli.Connect(ep);
Stream peerStream = cli.GetStream();
peerStream.Write/Read ...
3) http://32feet.codeplex.com/wikipage?title=Errors
- 10049 «Запрошенный адрес недействителен в своем контексте.»
- На удаленном устройстве не работает служба с данным идентификатором класса обслуживания
То есть Неверный идентификатор класса обслуживания.
2
alanjmcf
15 Мар 2014 в 14:55
Вот как наконец катится.
device.SetServiceState(serviceClass, true); //do it before pairing
...
BluetoothClient conn = new BluetoothClient();
conn.Connect(ep);
Также моя ошибка здесь:
static Guid serviceClass = new Guid("4d36e978-e325-11ce-bfc1-08002be10318");
//GUID of device class
Должно быть:
static Guid serviceClass = new Guid("00001101-0000-1000-8000-00805f9b34fb");
//GUID of bluetooth service
Чтобы увидеть правильный GUID, обратитесь к настройкам / свойствам вашего устройства (не ключа). Вы можете увидеть их из Windows.
0
ammme
14 Мар 2014 в 13:23
Я пытаюсь установить соединение с пользовательским устройством Bluetooth без использования COM-портов. Однако я получаю сообщение об ошибке: [10049] «Запрошенный адрес недопустим в своем контексте». Что я делаю неправильно?
static Guid serviceClass= new Guid("4d36e978-e325-11ce-bfc1-08002be10318"); //GUID of device class
static BluetoothAddress addr = BluetoothAddress.Parse("001210160177"); //from device
BluetoothDeviceInfo device = new BluetoothDeviceInfo(addr);
device.SetServiceState(serviceClass, true);
Console.WriteLine(BluetoothSecurity.PairRequest(device.DeviceAddress, "0000")); //pairing my device - writes True
BluetoothEndPoint ep = new BluetoothEndPoint(addr, serviceClass);
BluetoothClient conn = new BluetoothClient(ep); //10049 error
conn.Connect(ep);
Console.WriteLine(conn.GetStream());
2014-03-12 08:45
2
ответа
Решение
Все это отражено в документации проекта.:-)
Короче убери что SetServiceState
линия это ненужно / плохо. Выполнение сопряжения каждый раз также не является необходимым и немного медленным, но, вероятно, не стоит менять его, если оно работает хорошо.
Docs:
1) http://32feet.codeplex.com/documentation
- «См. Раздел» Общие соединения Bluetooth для передачи данных «ниже. BluetoothClient предоставляет поток для чтения и записи — нет необходимости использовать виртуальные COM-порты»
2) http://32feet.codeplex.com/wikipage?title=General%20Bluetooth%20Data%20Connections
BluetoothAddress addr
= BluetoothAddress.Parse("001122334455");
Guid serviceClass;
serviceClass = BluetoothService.SerialPort;
// - or - etc
// serviceClass = MyConsts.MyServiceUuid
//
var ep = new BluetoothEndPoint(addr, serviceClass);
var cli = new BluetoothClient();
cli.Connect(ep);
Stream peerStream = cli.GetStream();
peerStream.Write/Read ...
3) http://32feet.codeplex.com/wikipage?title=Errors
- 10049 «Запрошенный адрес недопустим в своем контексте.»
- На удаленном устройстве не запущена служба с данным идентификатором класса обслуживания
т.е. неправильный идентификатор класса обслуживания.
user35049
15 мар ’14 в 10:55
2014-03-15 10:55
2014-03-15 10:55
Вот как это наконец катится.
device.SetServiceState(serviceClass, true); //do it before pairing
...
BluetoothClient conn = new BluetoothClient();
conn.Connect(ep);
Также моя ошибка здесь:
static Guid serviceClass = new Guid("4d36e978-e325-11ce-bfc1-08002be10318");
//GUID of device class
Должно быть:
static Guid serviceClass = new Guid("00001101-0000-1000-8000-00805f9b34fb");
//GUID of bluetooth service
Чтобы увидеть правильный GUID, обратитесь к настройкам / свойствам вашего устройства (не ключа). Вы можете увидеть их из Windows.
2014-03-14 09:23
- Remove From My Forums
-
Question
-
Hi,
I’m writing a program to connect to a bluetooth device using Winsock. In discovery mode, I can find the device, but when I try to connect() I always get the error 10049 (WSAEADDRNOTAVAIL — Address not available). What is the problem?
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return (EXIT_FAILURE); if ((_socket = socket(AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET) return (EXIT_FAILURE); SOCKADDR_BTH sa; std::memset(&sa, 0, sizeof(sa)); int nSizeInput = sizeof(sa); int result = WSAStringToAddress(_address, AF_BTH, NULL, (LPSOCKADDR)&sa, &nSizeInput); // To validate the address... char addressStr[64] = {0}; DWORD dwSizeOfStr = sizeof(addressStr); WSAAddressToStringA((LPSOCKADDR)&sa, nSizeInput, NULL, addressStr, &dwSizeOfStr); result = connect(_socket, (SOCKADDR*)&sa, sizeof(sa));
Answers
-
There’s a sample that covers this in the WM6 SDK:
Windows Mobile 6 SDKSamplesPocketPCCPPwin32BluetoothBthChatTry setting the addressFamily member of SOCKADDR_BTH to AF_BT.
Also, try setting the btAddr member to one of the devices returned from WSALookupServiceNext.
http://msdn.microsoft.com/en-us/library/aa916570.aspx-PaulH
-
Marked as answer by
Tuesday, March 1, 2011 8:15 AM
-
Marked as answer by
Я разрабатываю dll в visual-С++ для приложения на стороне клиента, чтобы подключить свой компьютер к мобильному телефону через Bluetooth. Я использую эту функцию для поиска моей службы bluetooth на телефоне (см. Код комментария!):
bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){
this->checkStartup();
HBLUETOOTH_DEVICE_FIND found_devices;
BLUETOOTH_DEVICE_INFO device_info;
device_info.dwSize = sizeof(device_info);
BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria;
search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
search_criteria.fReturnAuthenticated = TRUE;
search_criteria.fReturnRemembered = FALSE;
search_criteria.fReturnConnected = FALSE;
search_criteria.fReturnUnknown = FALSE;
search_criteria.fIssueInquiry = FALSE;
search_criteria.cTimeoutMultiplier = 0;
found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info);
if (found_devices == NULL)
{
_tprintf(TEXT("Error: n%sn"), getErrorMessage(WSAGetLastError(), error));
return false;
}
WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.lpServiceClassId = guid;
querySet.dwNameSpace = NS_BTH;
SOCKADDR_BTH sab;
memset (&sab, 0, sizeof(sab));
sab.addressFamily = AF_BTH;
char addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);
bool found = false;
do
{
sab.btAddr = device_info.Address.ullLong;
if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){
_tprintf(TEXT("Error get the mac of the device %sn.Going to the next device."), device_info.szName);
}
else{
_tprintf(TEXT("Check on device %s%s for the service.n"), device_info.szName, addressAsString);
querySet.lpszContext =(LPWSTR) addressAsString;
HANDLE service_lookup_handle;
DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB;
int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle);
if (0 == result)
{
BYTE buffer[2000];
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults))
{
_tprintf(TEXT("Service : %sn"), pResults->lpszServiceInstanceName);
_tprintf(TEXT("Comment : %sn"), pResults->lpszComment);
*ret = pResults->lpcsaBuffer->RemoteAddr;
found = true;
/* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength))
{
printf("connected");
//closesocket (*sock);
//return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
*/
}
result = WSALookupServiceEnd(service_lookup_handle);
}
else
_tprintf(TEXT("%snGoing to the next device..n"), getErrorMessage(GetLastError(), error));
}
} while (BluetoothFindNextDevice(found_devices, &device_info) && !found);
if(found_devices)
BluetoothFindDeviceClose(found_devices);
_tprintf(TEXT("No more device.n"));
return found;
}
И этот для подключения к телефону:
bool BlueRayXVR::connect(_SOCKET_ADDRESS* host)
{
this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (this->sock == INVALID_SOCKET)
{
_tprintf(TEXT("Failed to get bluetooth socket! %sn"), getErrorMessage(WSAGetLastError(), error));
exit(1);
}
if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength))
{
printf("connectedn");
return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
return FALSE;
}
В моем приложении консоли тестирования я делаю:
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
printf("service founded..try to connect..n");
if(blue->connect(&address))
blue->read();
}
Проблема в том, что если я запускаю свой код, я всегда получаю ошибку 10049.
странно, что если я раскомментирую строки кода в функции findPairedService, и я просто делаю
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
он успешно подключается к телефону….
что не так?
Спасибо!
I’m developing a dll in visual-c++ for client side application to connect my pc to my android phone via bluetooth. I use this function to find my bluetooth service on the phone(see commented code!):
bool BlueRayXVR::findPairedService(GUID* guid, _SOCKET_ADDRESS* ret){
this->checkStartup();
HBLUETOOTH_DEVICE_FIND found_devices;
BLUETOOTH_DEVICE_INFO device_info;
device_info.dwSize = sizeof(device_info);
BLUETOOTH_DEVICE_SEARCH_PARAMS search_criteria;
search_criteria.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
search_criteria.fReturnAuthenticated = TRUE;
search_criteria.fReturnRemembered = FALSE;
search_criteria.fReturnConnected = FALSE;
search_criteria.fReturnUnknown = FALSE;
search_criteria.fIssueInquiry = FALSE;
search_criteria.cTimeoutMultiplier = 0;
found_devices = BluetoothFindFirstDevice(&search_criteria, &device_info);
if (found_devices == NULL)
{
_tprintf(TEXT("Error: n%sn"), getErrorMessage(WSAGetLastError(), error));
return false;
}
WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.lpServiceClassId = guid;
querySet.dwNameSpace = NS_BTH;
SOCKADDR_BTH sab;
memset (&sab, 0, sizeof(sab));
sab.addressFamily = AF_BTH;
char addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);
bool found = false;
do
{
sab.btAddr = device_info.Address.ullLong;
if (0 != WSAAddressToString((LPSOCKADDR)&sab, sizeof(sab), NULL, (LPWSTR)addressAsString, &addressSize)){
_tprintf(TEXT("Error get the mac of the device %sn.Going to the next device."), device_info.szName);
}
else{
_tprintf(TEXT("Check on device %s%s for the service.n"), device_info.szName, addressAsString);
querySet.lpszContext =(LPWSTR) addressAsString;
HANDLE service_lookup_handle;
DWORD flags = LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB;
int result = WSALookupServiceBegin(&querySet, flags, &service_lookup_handle);
if (0 == result)
{
BYTE buffer[2000];
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
if(0 == WSALookupServiceNext(service_lookup_handle, flags, &bufferLength, pResults))
{
_tprintf(TEXT("Service : %sn"), pResults->lpszServiceInstanceName);
_tprintf(TEXT("Comment : %sn"), pResults->lpszComment);
*ret = pResults->lpcsaBuffer->RemoteAddr;
found = true;
/* this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (0 == ::connect(sock, ret->lpSockaddr, ret->iSockaddrLength))
{
printf("connected");
//closesocket (*sock);
//return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
*/
}
result = WSALookupServiceEnd(service_lookup_handle);
}
else
_tprintf(TEXT("%snGoing to the next device..n"), getErrorMessage(GetLastError(), error));
}
} while (BluetoothFindNextDevice(found_devices, &device_info) && !found);
if(found_devices)
BluetoothFindDeviceClose(found_devices);
_tprintf(TEXT("No more device.n"));
return found;
}
And this one to connect to the phone:
bool BlueRayXVR::connect(_SOCKET_ADDRESS* host)
{
this->sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
if (this->sock == INVALID_SOCKET)
{
_tprintf(TEXT("Failed to get bluetooth socket! %sn"), getErrorMessage(WSAGetLastError(), error));
exit(1);
}
if (0 == ::connect(sock, host->lpSockaddr, host->iSockaddrLength))
{
printf("connectedn");
return TRUE;
}
wprintf(L"errore %d: %s", WSAGetLastError(), this->getErrorMessage(WSAGetLastError(), this->error));
return FALSE;
}
In my test console app i do:
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
printf("service founded..try to connect..n");
if(blue->connect(&address))
blue->read();
}
The problem is that if i run my code i always get error 10049.
the strange thing is that if i uncomment the lines of code in findPairedService function and i just do
_SOCKET_ADDRESS address;
memset (&address, 0, sizeof(address));
if(blue->findPairedService(&blue->getDefaultGUID4XVR(), &address)){
it succesfully connect to the phone….
what’s wrong??
Thanks!
- Remove From My Forums
-
Question
-
Hi,
I’m writing a program to connect to a bluetooth device using Winsock. In discovery mode, I can find the device, but when I try to connect() I always get the error 10049 (WSAEADDRNOTAVAIL — Address not available). What is the problem?
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return (EXIT_FAILURE); if ((_socket = socket(AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM)) == INVALID_SOCKET) return (EXIT_FAILURE); SOCKADDR_BTH sa; std::memset(&sa, 0, sizeof(sa)); int nSizeInput = sizeof(sa); int result = WSAStringToAddress(_address, AF_BTH, NULL, (LPSOCKADDR)&sa, &nSizeInput); // To validate the address... char addressStr[64] = {0}; DWORD dwSizeOfStr = sizeof(addressStr); WSAAddressToStringA((LPSOCKADDR)&sa, nSizeInput, NULL, addressStr, &dwSizeOfStr); result = connect(_socket, (SOCKADDR*)&sa, sizeof(sa));
Answers
-
There’s a sample that covers this in the WM6 SDK:
Windows Mobile 6 SDKSamplesPocketPCCPPwin32BluetoothBthChatTry setting the addressFamily member of SOCKADDR_BTH to AF_BT.
Also, try setting the btAddr member to one of the devices returned from WSALookupServiceNext.
http://msdn.microsoft.com/en-us/library/aa916570.aspx-PaulH
-
Marked as answer by
Tuesday, March 1, 2011 8:15 AM
-
Marked as answer by
Я пытаюсь установить соединение с настраиваемым устройством Bluetooth без использования COM-портов. Однако я получаю сообщение об ошибке: [10049] «Запрошенный адрес недействителен в своем контексте». Что я делаю неправильно?
static Guid serviceClass= new Guid("4d36e978-e325-11ce-bfc1-08002be10318"); //GUID of device class
static BluetoothAddress addr = BluetoothAddress.Parse("001210160177"); //from device
BluetoothDeviceInfo device = new BluetoothDeviceInfo(addr);
device.SetServiceState(serviceClass, true);
Console.WriteLine(BluetoothSecurity.PairRequest(device.DeviceAddress, "0000")); //pairing my device - writes True
BluetoothEndPoint ep = new BluetoothEndPoint(addr, serviceClass);
BluetoothClient conn = new BluetoothClient(ep); //10049 error
conn.Connect(ep);
Console.WriteLine(conn.GetStream());
2 ответа
Лучший ответ
Все это описано в документации по проекту.
Короче, удалите эту строку SetServiceState
, это ненужно / плохо. Выполнять сопряжение каждый раз также необязательно и немного медленно, но, вероятно, не стоит менять, если оно работает хорошо.
Docs :
1) http://32feet.codeplex.com/documentation
- «См. Раздел« Общие подключения данных Bluetooth »ниже. BluetoothClient предоставляет поток для чтения и записи — нет необходимости использовать виртуальные COM-порты»
2) http://32feet.codeplex.com/wikipage?title=General % 20Bluetooth% 20Data% 20Connections
BluetoothAddress addr
= BluetoothAddress.Parse("001122334455");
Guid serviceClass;
serviceClass = BluetoothService.SerialPort;
// - or - etc
// serviceClass = MyConsts.MyServiceUuid
//
var ep = new BluetoothEndPoint(addr, serviceClass);
var cli = new BluetoothClient();
cli.Connect(ep);
Stream peerStream = cli.GetStream();
peerStream.Write/Read ...
3) http://32feet.codeplex.com/wikipage?title=Errors
- 10049 «Запрошенный адрес недействителен в своем контексте.»
- На удаленном устройстве не работает служба с данным идентификатором класса обслуживания
То есть Неверный идентификатор класса обслуживания.
2
alanjmcf
15 Мар 2014 в 14:55
Вот как наконец катится.
device.SetServiceState(serviceClass, true); //do it before pairing
...
BluetoothClient conn = new BluetoothClient();
conn.Connect(ep);
Также моя ошибка здесь:
static Guid serviceClass = new Guid("4d36e978-e325-11ce-bfc1-08002be10318");
//GUID of device class
Должно быть:
static Guid serviceClass = new Guid("00001101-0000-1000-8000-00805f9b34fb");
//GUID of bluetooth service
Чтобы увидеть правильный GUID, обратитесь к настройкам / свойствам вашего устройства (не ключа). Вы можете увидеть их из Windows.
0
ammme
14 Мар 2014 в 13:23