蓝牙 - >服务发现失败

时间:2010-02-05 14:50:20

标签: android service bluetooth arduino discovery

我正在编写一个能够与我的PC通信的应用程序。我使用了SDK 2.1的蓝牙功能。

我可以找到设备,获取其MAC地址,创建一个RFCOMM套接字,但是当我启动连接时,收到以下错误消息。

  

服务发现失败。

  1. 是不是因为UUID,这在我的应用程序和我的电脑上是不一样的?
  2. 如何在我的电脑上获得正确的UUID?
  3. 如果我写了这样的应用程序,我的Nexus One是客户端还是服务器?

6 个答案:

答案 0 :(得分:7)

好的,我遇到了同样的问题,但我想我可以回答你的一些问题。如果您的PC打开SPP端口,例如,通过使用“sdptool add --channel = 3 SP”,您的Android手机将是客户端打开套接字并将此套接字连接到服务器(您的PC或任何其他蓝牙设备,例如,GPS,鼠标等)。

您可以通过阅读文章 Bluetooth 来获取此信息,我从这篇文章中删除了客户的定义。

如果您在服务器(PC等)上打开SPP端口,则表示您提供标准服务,并且为此服务分配了一个特殊的UUID。如果我没弄错的话,这将是:00001101-0000-1000-8000-00805F9B34FB

所以我认为我们应该从Android开发者那里得到一个合格的答案。或者在IRC办公时间周四问这个问题。

答案 1 :(得分:4)

提示:如果要连接蓝牙串行板,请尝试使用众所周知的SPP UUID 00001101-0000-1000-8000-00805F9B34FB。但是,如果您要连接到Android对等设备,请生成您自己的唯一UUID。

The Link

答案 2 :(得分:2)

虽然它可能是您的UUID,但我还建议您确保蓝牙MAC准确且大写。

我还建议在Linux机器上的终端中运行hcidump -X,看看在整个过程中是否可以看到Linux机器和手机之间的任何双向流量。

答案 3 :(得分:2)

我找到了一种确保在设备上找到UUID的方法。在客户端,device.createRfcommSocketToServiceRecord(uuid);之前添加:

Process process = Runtime.getRuntime().exec("su -c 'sdptool records " + device.getAddress() + "'");
process.waitFor();

该过程在20-30秒内被冻结,因为Android正在获取服务。但之后,如果服务器处于发现模式(如果服务器是Android手机),则连接每次都成功!

答案 4 :(得分:1)

在第一次连接后重新连接SPP时遇到了同样的问题。

这是因为rfcomm channel=-1中的BluetoothService.java。我将updateDeviceServiceChannelCache()添加到fetchRemoteUuids()的末尾,然后就可以了!

答案 5 :(得分:0)

这件事主要发生在HTC。我遇到了同样的问题。如果您第一次成功连接但之后失败,只需重新启动手机,失败的服务将重新启动。