我需要創建一個自定義的藍牙服務,我必須用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
你能幫助我嗎?
謝謝!
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
你在結構中使用BT_PORT_ANY,所以這就是爲什麼你會得到與你不同的UUID。 – rogerzanoni 2010-05-11 18:26:41
SOCKADDR_BTH結構的文檔說如果使用綁定,serviceClassId將被忽略。在我的應用程序(服務器)中,我將通道(端口參數)設置爲0,將SDP的最後一個字節設置爲0;在記錄的偏移量8處,您有服務的UUID和最後一個字節,即通道。發佈記錄,UUID和頻道都是綁定的,您可以使用您的UUID在客戶端查找頻道。 在客戶端應用程序中,我沒有設置頻道,只有服務的UUID和客戶端通過SDP搜索來查找頻道。 – rogerzanoni 2010-05-11 18:27:22