蓝牙RFCOMM / SDP连接到Android中的RS232适配器

时间:2009-12-23 16:39:25

标签: android bluetooth rfcomm

我正在尝试使用谷歌提供的蓝牙聊天示例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被引入connect方法的情况?我知道那些是在某个地方的源代码,但我不确切知道你编写应用程序的java层和包含实际堆栈接口的C / C ++层。我知道它使用的是用C / C ++编写的bluez蓝牙堆栈,但不确定它是如何与java层绑定的,这就是我认为抛出异常的东西。指点我可以尝试解剖这个问题的任何帮助都是不可思议的。

另外请注意我能够与RS232适配器配对,但我无法实际连接。以下是logcat输出以供参考:

I/ActivityManager( 1018): Displayed activity com.example.android.BluetoothChat/.DeviceListActivity: 326 ms (total 326 ms)
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothChat( 1729): onActivityResult -1
D/BluetoothChatService( 1729): connect to: 00:06:66:03:0C:51
D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_CONNECTING
E/BluetoothChat( 1729): + ON RESUME +
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING
I/BluetoothChatService( 1729): BEGIN mConnectThread
E/BluetoothService.cpp( 1018): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51
I/BluetoothChatService( 1729): CONNECTION FAIL TOSTRING: java.io.IOException: Service discovery failed
D/BluetoothChatService( 1729): setState() STATE_CONNECTING -> STATE_LISTEN
D/BluetoothChatService( 1729): start
D/BluetoothChatService( 1729): setState() STATE_LISTEN -> STATE_LISTEN
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID
I/NotificationService( 1018): enqueueToast pkg=com.example.android.BluetoothChat callback=android.app.ITransientNotification$Stub$Proxy@446327c8 duration=0
I/BluetoothChat( 1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
E/BluetoothEventLoop.cpp( 1018): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51
V/BluetoothEventRedirector( 1080): Received android.bleutooth.device.action.UUID

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


以下内容与类似问题合并,该问题已在此处通过所选答案成功解决:

How can one connect to an rfcomm device other than another phone in Android?

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

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

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

...所以连接的服务只是定义为通道1,没有任何SDP查找。

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

5 个答案:

答案 0 :(得分:34)

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

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

我试图改变它,因为我认为只有“1101”部分是重要的,因为我看到提到SPP的东西遍布在intertubes的地方,但这使它不再连接。显然,特定的UUID应该用于连接到通用SPP设备。无论如何只是觉得我会把它发布在这里,所以任何这类问题的人都有答案。我花了大约3天才找到它大声笑!

答案 1 :(得分:2)

我猜这与索尼爱立信手机错误有关(see here)。

我能够使用蓝牙和完全组成的UUID从/向Android 2.0设备和我的mac连接。尝试使用j2me设备(sony ericsson w910i)做同样的事情只有在android是服务器的情况下工作,否则我会得到与你相同的例外。

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

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

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

答案 2 :(得分:1)

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

*虽然bluesnap设备的文档建议使用超级终端,但它存在问题。在几次调用bluesnap之后,他们建议:

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

其次,HyperTerminal已经知道BlueSnap的问题。我建议尝试TeraTerm或PuTTY。

花了我4天才发现这个!

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果'sdptool browse'报告没有关于该设备的信息,请尝试'sdptool记录[device-mac-here]'