Код ошибки 10049 bluetooth

Я пытаюсь установить соединение с настраиваемым устройством 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 SDKSamplesPocketPCCPPwin32BluetoothBthChat

    Try 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

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

ammme's user avatar

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

alanjmcf's user avatar

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

ammme's user avatar

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 SDKSamplesPocketPCCPPwin32BluetoothBthChat

    Try 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

Я пытаюсь установить соединение с настраиваемым устройством 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 SDKSamplesPocketPCCPPwin32BluetoothBthChat

    Try 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

Я разрабатываю 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 SDKSamplesPocketPCCPPwin32BluetoothBthChat

    Try 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

Я пытаюсь установить соединение с настраиваемым устройством 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

Понравилась статья? Поделить с друзьями:
  • Код ошибки 10040
  • Код ошибки 1004 окко что это
  • Код ошибки 1004 мегафон
  • Код ошибки 1004 геншин импакт
  • Код ошибки 1004 вк как исправить