2010-05-08 3 views
0

Мне нужно создать пользовательский сервис bluetooth, и мне нужно его разработать с помощью C++. Я прочитал много примеров, но мне не удалось опубликовать новую службу с пользовательским UUID. Мне нужно указать UUID, чтобы иметь возможность подключиться к службе из приложения Android. Это то, что я писал:Проблема с обслуживанием Bluetooth

GUID service_UUID = { /* 00000003-0000-1000-8000-00805F9B34FB */ 
    0x00000003, 
    0x0000, 
    0x1000, 
    {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB} 
}; 
    SOCKET s, s2; 
SOCKADDR_BTH sab 
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) 
    return 1; 
printf("installing a new service\n"); 

s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); 
if (s == INVALID_SOCKET) 
{ 
    printf ("Socket creation failed, error %d\n", WSAGetLastError()); 
    return 1; 
} 

memset (&sab, 0, sizeof(sab)); 
sab.addressFamily = AF_BTH; 
sab.port = BT_PORT_ANY; 
sab.serviceClassId = service_UUID; 


if (0 != bind(s, (SOCKADDR *) &sab, sizeof(sab))) 
{ 
    printf ("bind() failed with error code %d\n", WSAGetLastError()); 
    closesocket (s); 
    return 1; 
} 
int result=sizeof(sab); 
getsockname(s,(SOCKADDR *) &sab, &result); 
printSOCKADDR_BTH(sab); 

if(listen (s, 5) == 0) 
    printf("listen() is OK! Listening for connection... :)\n"); 
else 
    printf("listen() failed with error code %d\n", WSAGetLastError()); 

printf("waiting connection"); 

for (; ;) 
{ 
    int ilen = sizeof(sab2); 
    s2 = accept (s, (SOCKADDR *)&sab2, &ilen); 
    printf ("accepted"); 
} 
if(closesocket(s) == 0) 
    printf("closesocket() pretty fine!\n"); 
if(WSACleanup() == 0) 
    printf("WSACleanup() is OK!\n"); 
return 0; 

Когда я распечатать структуру SOCKADDR_BTH извлеченного с ПОЛУЧИТЬ getsockname я получить UUID, который не является моим. Кроме того, если я использовать UUID чтение из getsockname для подключения Android приложение не удается установить соединение с этим исключением:

java.io.IOException: Service discovery failed 

Не могли бы вы мне помочь ??

Спасибо!

ответ

1

Вам необходимо создать запись SDP и опубликовать ее с помощью WSASetService, прежде чем связывать и ждать связей. Следуйте за this tutorial, и вы сможете получать соединения.

+0

Hi..yes..i видел этот учебник, но (QUOTE): «Формат опубликованной SDP-информации настолько сложный, что Windows CE предоставляет специальный COM-контроль для построения и деконструирования записей SDP ... В качестве ярлыка многие Приложения Bluetooth составляют общую запись, либо вручную собирающую запись, либо используя пример инструмента BthNsCreate (доступный в SDK Windows CE), который предоставляется в Platform Builder. " Я уже спросил о BthNsCreate http://stackoverflow.com/questions/2763966/how-to-get-an-sdp-record-for-bluetooth-service Любые предложения? – hara

+0

Вы используете BT_PORT_ANY в структуре, поэтому, по-моему, у вас UUID отличается от вашего. – rogerzanoni

+0

Документация структуры SOCKADDR_BTH говорит, что serviceClassId игнорируется, если вы используете bind. В моем приложении (сервере) я установил канал (параметр порта) равным 0, а последний байт SDP - 0; На смещении 8 записи у вас есть UUID вашей службы и последний байт, канал. Публикация записи, UUID и канала привязаны, и вы можете искать канал на клиенте, используя свой UUID. В клиентском приложении я не устанавливаю канал, только UUID службы, а клиент делает поиск SDP для поиска канала. – rogerzanoni

0

«Discovery Failed» означает, что телефон отправил широковещательное сообщение с просьбой о соединении с указанным MAC-адресом Bluetooth, но никто с этим адресом не ответил.

Дважды проверьте MAC-адрес Bluetooth на удаленном устройстве.

+0

если я не ошибаюсь, это единственный способ установить соединение Bluetooth через android http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord%28java.util.UUID% 29 Как я могу использовать MAC-адрес? – hara

+0

BTDevice = BTAdapter.getRemoteDevice (PeerMAC); BTSocket = BTDevice.createRfcommSocketToServiceRecord (UUID); –

+0

это то, что я делаю .. но UUID не является адресом mac..if, я не ошибаюсь .. – hara

Смежные вопросы