我正在编写一个能够与我的 PC 通信的应用程序。我使用了 SDK 2.1 的蓝牙功能。
我可以找到设备,获取它们的 MAC 地址,创建一个RFCOMM套接字,但是当我开始连接时,我收到以下错误消息。
服务发现失败。
- 是因为UUID在我的应用程序和我的 PC 上不一样吗?
- 如何在我的 PC 上获得正确的 UUID?
如果我编写这样的应用程序,我的Nexus One是客户端还是服务器?
好的,我遇到了同样的问题,但我想我可以回答你的一些问题。如果您的 PC 打开了 SPP 端口,例如,通过使用“sdptool add --channel=3 SP”,您的 Android 手机将成为客户端打开套接字并通过此套接字连接到服务器(您的 PC 或任何其他蓝牙设备,例如,GPS、鼠标等)。
您可以通过阅读文章蓝牙获得此信息,我从本文中取出客户端的定义。
如果您在服务器(您的 PC 等)上打开 SPP 端口,则您提供的是标准服务,并且为该服务分配了一个特殊的 UUID。这将是:00001101-0000-1000-8000-00805F9B34FB
如果我没记错的话。
所以我认为我们应该从安卓开发者那里得到一个合格的答案。或者在周四 IRC 办公时间问这个问题。
提示:如果您要连接到蓝牙串行板,请尝试使用众所周知的 SPP UUID 00001101-0000-1000-8000-00805F9B34FB。但是,如果您要连接到 Android 对等体,请生成您自己的唯一 UUID。
我找到了一种方法来确保在设备上找到 UUID。在客户端,在device.createRfcommSocketToServiceRecord(uuid);
添加之前:
Process process = Runtime.getRuntime().exec("su -c 'sdptool records " + device.getAddress() + "'");
process.waitFor();
该过程在 20-30 秒内被冻结,因为 Android 正在获取服务。但是之后,如果服务器处于发现模式(如果服务器是Android手机),则每次连接都成功!
虽然它可能是您的 UUID,但我也建议您确保蓝牙 MAC 是准确的且大写的。
我还建议hcidump -X
在 Linux 机器上的终端中运行,看看你是否可以在整个过程中看到你的 Linux 机器和手机之间的任何双向流量。
在第一次连接后重新连接 SPP 时我遇到了同样的问题。
这是因为rfcomm channel=-1
在BluetoothService.java
. 我添加updateDeviceServiceChannelCache()
到末尾fetchRemoteUuids()
,然后它工作了!
这件事主要发生在HTC身上。我遇到了同样的问题。如果您第一次连接成功但后来失败,只需重新启动手机,失败的服务就会重新启动。