20

我正在尝试使用谷歌提供的蓝牙聊天示例 API 应用程序连接到连接到另一台设备的蓝牙 RS232 适配器。这是供参考的应用程序:

http://developer.android.com/resources/samples/BluetoothChat/index.html

这里是 RS232 连接器的规格表,仅供参考:

http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

那么问题是当我去连接到设备时:

mmSocket.connect(); (BluetoothSocket::connect())

我总是收到IOException该方法引发的错误connect()。当我toString对异常执行操作时,我得到“服务发现失败”。我的问题主要是什么情况会导致IOException在连接方法中抛出一个?我知道那些在源代码中的某个地方,但我不确切知道您编写应用程序的 java 层和包含实际堆栈接口的 C/C++ 层。我知道它使用的是用 C/C++ 编写的 bluez 蓝牙堆栈,但不确定它如何与我认为抛出异常的 java 层相关联。任何帮助指出我可以尝试剖析这个问题的地方都是不可思议的。

另外需要注意的是,我可以很好地与 RS232 适配器配对,但我永远无法真正连接。这是 logcat 输出以供更多参考:

I/ActivityManager(1018):显示的活动 com.example.android.BluetoothChat/.DeviceListActivity:326 毫秒(总共 326 毫秒)
E/BluetoothService.cpp(1018):stopDiscoveryNative:StopDiscovery 中的 D-Bus 错误:org.bluez.Error.Failed(无效发现会话)
D/蓝牙聊天(1729):onActivityResult -1
D/BluetoothChatService(1729):连接到:00:06:66:03:0C:51
D/BluetoothChatService(1729):setState()STATE_LISTEN -> STATE_CONNECTING
电子/蓝牙聊天(1729):+恢复+
I/BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_CONNECTING
I/BluetoothChatService(1729):开始 mConnectThread
E/BluetoothService.cpp(1018):stopDiscoveryNative:StopDiscovery 中的 D-Bus 错误:org.bluez.Error.Failed(无效发现会话)
E/BluetoothEventLoop.cpp(1018):event_filter:从/org/bluez/1498/hci0/dev_00_06_66_03_0C_51接收信号org.bluez.Device:PropertyChanged
I/BluetoothChatService(1729):连接失败 TOSTRING:java.io.IOException:服务发现失败
D/BluetoothChatService(1729):setState()STATE_CONNECTING->STATE_LISTEN
D/蓝牙聊天服务(1729):开始
D/BluetoothChatService(1729):setState()STATE_LISTEN -> STATE_LISTEN
我/蓝牙聊天(1729):MESSAGE_STATE_CHANGE:STATE_LISTEN
V/BluetoothEventRedirector(1080): 收到 android.bleutooth.device.action.UUID
I/NotificationService(1018): enqueueToast pkg=com.example.android.BluetoothChat 回调=android.app.ITransientNotification$Stub$Proxy@446327c8 持续时间=0
我/蓝牙聊天(1729):MESSAGE_STATE_CHANGE:STATE_LISTEN
E/BluetoothEventLoop.cpp(1018):event_filter:从/org/bluez/1498/hci0/dev_00_06_66_03_0C_51接收信号org.bluez.Device:PropertyChanged
V/BluetoothEventRedirector(1080): 收到 android.bleutooth.device.action.UUID

我正在尝试连接的设备是00:06:66:03:0C:51我可以扫描的设备,并且显然可以很好地配对。


下面是从一个类似的问题合并而来的,该问题已通过此处选择的答案成功解决:

如何在 Android 中连接到除另一部手机之外的 rfcomm 设备?

Android API 提供了使用listenUsingRfcommWithServiceRecord()设置套接字和createRfcommSocketToServiceRecord()连接到该套接字的示例。

我正在尝试使用BlueSMiRF Gold芯片连接到嵌入式设备。我想移植到 Android的工作 Python 代码(使用PyBluez库)如下:

sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()

...所以要连接的服务被简单地定义为通道 1,没有任何 SDP 查找。

由于我在 Android API 中看到的唯一记录机制是对 UUID 进行 SDP 查找,所以我有点不知所措。在我的 Linux 主机上使用“sdptool browse”是空的,所以我推测有问题的芯片只是缺乏 SDP 支持。

4

5 回答 5

34

好的,简短的回答是我必须使用这个 UUID 才能连接到我的 SPP 设备:

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

我试图改变它,因为我认为只有“1101”部分很重要,因为我看到在中间管上到处都是 SPP 的东西,但这使它不再连接。显然,特定的 UUID 应该用于连接到通用 SPP 设备。无论如何,我只是想把它贴在这里,这样任何遇到这类问题的人都有答案。我花了大约 3 天时间才找到它,哈哈!

于 2010-01-13T17:28:38.660 回答
2

我猜这与索尼爱立信手机错误有关(请参见此处)。

我能够使用蓝牙和完全组成的 UUID 从/到 android 2.0 设备和我的 mac 连接。尝试用 j2me 设备(索尼爱立信 w910i)做同样的事情只有在 android 是服务器的情况下才有效,否则我会得到和你一样的异常。

据我所知,您使用的 UUID 是 spp 配置文件的“基地址”,并且在发出服务发现时服务器设备返回的 ServiceRecord 的 ServiceClassIDList 字段中,它应该列在您的 UUID 之后决定使用..显然在某些情况下并非如此(例如,我的手机首先列出了通用 UUID,然后是我的自定义 UUID)。

看起来这里的情况是一样的。您可以尝试手动更改 ServiceRecord 并返回正确的 ServiceClassIDList。也许它会为你工作..不幸的是,我愚蠢的手机拒绝改变它:(

PS。奇怪的是,我的 mac 确实能够看到服务,即使 ServiceRecord 被“损坏”,我猜 android 只是懒得看 ServiceClassIDList 中的第一个 UUID,而我的电脑通过列表搜索每个元素。但这只是我的假设:)

于 2010-02-10T09:38:00.723 回答
1

您设置的波特率必须与它所连接的设备相匹配。他们有默认的 115200 或切换到 9600,但如果您需要其他(在我的情况下为 1200 用于测量仪器),您需要通过超级终端*和零调制解调器电缆进行设置。

*尽管 bluesnap 设备的文档建议使用超级终端,但它存在问题。在给 bluesnap 打了几次电话后,他们建议:

首先,将设备连接到 PC 时,尝试使用 115200 8、N、1 和 X 关闭将跳线设置恢复到原来的位置。启用 DTE 后,如果不使用专门为 DTR/DTE 连接设计的特殊软件,则无法建立终端连接。

其次,HyperTerminal 已知 BlueSnap 存在问题。我建议尝试 TeraTerm 或 PuTTY。

我花了 4 天时间才发现这一点!

于 2012-12-12T02:16:30.850 回答
0

你的蓝牙设备设置的波特率是多少?我已连接,但我的数据显示为混合波特率时典型的乱码。我的设置为 57600,这是我看到其他人使用的。哦,感谢您发布结果,UUID 也让我工作了几天。

于 2010-03-14T05:12:19.607 回答
0

如果“sdptool browse”没有报告有关设备的信息,请尝试“sdptool records [device-mac-here]”

于 2010-04-18T01:42:20.267 回答