2010-05-08 114 views
0

我需要創建一個自定義的藍牙服務,我必須用C++來開發它。我閱讀了很多示例,但我沒有成功發佈帶有自定義UUID的新服務。我需要指定一個UUID以便能夠連接到來自android應用程序的服務。這是我寫的:藍牙服務問題

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; 

當我打印用GET getsockname檢索SOCKADDR_BTH結構我得到一個UUID是不是我的。此外,如果我使用getsockname讀取的UUID到Android應用程序的連接失敗與此異常連接:

java.io.IOException: Service discovery failed 

你能幫助我嗎?

謝謝!

回答

1

在綁定和等待連接之前,您必須創建SDP記錄並使用WSASetService發佈它。 按照this tutorial,您將能夠接收連接。

+0

Hi..yes..i看到這個教程,但(QUOTE):「發佈的SDP信息的格式非常複雜,Windows CE提供了一個特殊的COM控件來構建和解構SDP記錄......作爲一種捷徑,許多藍牙應用程序組成一個通用記錄,可以手動組裝記錄或使用Platform Builder中提供的名爲BthNsCreate的示例工具(可在Windows CE SDK中獲得)。「我已經問過關於BthNsCreate http://stackoverflow.com/questions/2763966/how-to-get-an-sdp-record-for-bluetooth-service有什麼建議嗎? – hara 2010-05-11 17:24:39

+0

你在結構中使用BT_PORT_ANY,所以這就是爲什麼你會得到與你不同的UUID。 – rogerzanoni 2010-05-11 18:26:41

+0

SOCKADDR_BTH結構的文檔說如果使用綁定,serviceClassId將被忽略。在我的應用程序(服務器)中,我將通道(端口參數)設置爲0,將SDP的最後一個字節設置爲0;在記錄的偏移量8處,您有服務的UUID和最後一個字節,即通道。發佈記錄,UUID和頻道都是綁定的,您可以使用您的UUID在客戶端查找頻道。 在客戶端應用程序中,我沒有設置頻道,只有服務的UUID和客戶端通過SDP搜索來查找頻道。 – rogerzanoni 2010-05-11 18:27:22

0

「發現失敗」表示電話發出廣播消息,要求與指定的藍牙MAC地址建立連接,但沒有人使用該地址進行響應。

仔細檢查遠程設備的藍牙MAC地址。

+0

如果我沒有錯,這是我可以通過android建立藍牙連接的唯一方法http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord%28java.util.UUID% 29我怎樣才能使用MAC地址? – hara 2010-05-10 19:47:23

+0

BTDevice = BTAdapter.getRemoteDevice(PeerMAC); BTSocket = BTDevice.createRfcommSocketToServiceRecord(UUID); – 2010-05-11 11:21:42

+0

這是我做的..但UUID不是一個MAC地址..如果我沒有錯.. – hara 2010-05-11 17:26:05