0

カスタムBluetoothサービスを作成する必要があり、C++を使用して開発する必要があります。多くの例を読みましたが、カスタムUUIDを使用して新しいサービスを公開することに成功しませんでした。Androidアプリからサービスに接続できるようにするには、UUIDを指定する必要があります。これは私が書いたものです:

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;

getgetsocknameで取得したSOCKADDR_BTH構造を出力すると、私のものではないUUIDが取得されます。さらに、getsocknameから読み取ったUUIDを使用してAndroidアプリケーションに接続すると、次の例外で接続が失敗します。

java.io.IOException: Service discovery failed

私たちを手伝ってくれますか??

ありがとう!

4

2 に答える 2

1

レコードを作成し、バインドして接続を待つ前にSDP公開する必要があります。このチュートリアルWSASetServiceに従うと、接続を受信できるようになります。

于 2010-05-11T16:51:05.310 に答える
0

「DiscoveryFailed」は、電話が指定されたBluetooth MACアドレスとの接続を要求するブロードキャストメッセージを送信したが、そのアドレスを持つ人が応答しなかったことを意味します。

リモートデバイスのBluetoothMACアドレスを再確認してください。

于 2010-05-10T19:16:56.597 に答える