【问题标题】:Bluetooth service problem蓝牙服务问题
【发布时间】:2010-05-08 20:33:11
【问题描述】:

我需要创建一个自定义蓝牙服务,并且必须使用 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

你能帮帮我吗?

谢谢!

【问题讨论】:

    标签: c++ android network-programming bluetooth winsock2


    【解决方案1】:

    您必须在绑定之前创建SDP 记录并使用WSASetService 发布它并等待连接。 关注this tutorial,即可获得连接。

    【讨论】:

    • 嗨..是的..我看到了那个教程但是(引用):“发布的 SDP 信息的格式非常复杂,以至于 Windows CE 提供了一个特殊的 COM 控件来构造和解构 SDP 记录。 ..作为一种快捷方式,许多蓝牙应用程序组成一个通用记录,要么手动组装记录,要么使用 Platform Builder 中提供的名为 BthNsCreate(Windows CE SDK 中提供)的示例工具。”我已经问过 BthNsCreate stackoverflow.com/questions/2763966/… 有什么建议吗?
    • 你在结构中使用了 BT_PORT_ANY,所以我认为这就是为什么你会得到一个与你不同的 UUID。
    • SOCKADDR_BTH 结构的文档说,如果您使用绑定,则忽略 serviceClassId。在我的应用程序(服务器)中,我将通道(端口参数)设置为 0,将 SDP 的最后一个字节设置为 0;在记录的偏移量 8 处,您拥有服务的 UUID 和最后一个字节,即通道。发布记录,UUID和频道绑定,你可以使用你的UUID在客户端查找频道。在客户端app中,我不设置频道,只设置服务的UUID,客户端进行SDP搜索找到频道。
    【解决方案2】:

    “发现失败”是指手机发送了一条广播消息,要求与指定的蓝牙 MAC 地址建立连接,但没有该地址的人响应。

    仔细检查远程设备的蓝牙 MAC 地址。

    【讨论】:

    • 如果我没记错的话,这是我可以通过 android developer.android.com/reference/android/bluetooth/… 建立蓝牙连接的唯一方法@我如何使用 MAC 地址?
    • BTDevice = BTAdapter.getRemoteDevice(PeerMAC); BTSocket = BTDevice.createRfcommSocketToServiceRecord(UUID);
    • 你的说法没有意义。当然,UUID 不是 MAC 地址。如果这是您已经在做的,那么您需要仔细检查您正在使用的蓝牙 MAC。在不知道对等设备的 MAC 的情况下,您无法建立蓝牙连接,如我上面的代码 sn-p 所示。
    • 对不起..我没有意识到第一句话!我会试试的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多