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

我正在尝试使用Google提供的Bluetooth Chat示例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()) 

我总是得到connect()方法抛出的IOException错误。 当我做一个toString的exception,我得到“服务发现失败”。 我的问题主要是什么情况下,会导致IOException抛出连接方法? 我知道那些在源代码中,但我不知道如何编写应用程序的Java层和包含实际堆栈接口的C / C ++层。 我知道它使用蓝色的C / C + +编写的蓝牙栈,但不知道如何绑定到Java层,这是我认为是抛出exception。 任何帮助指出我可以尝试解决这个问题的地方是不可思议的。

也只是为了说明我能够与RS232适配器配对就好,但我永远不能实际连接。 这里是更多参考的logcat输出:

 I / ActivityManager(1018):显示的活动com.example.android.BluetoothChat / .DeviceListActivity:326ms(总计326ms)
 E / BluetoothService.cpp(1018):stopDiscoveryNative:StopDiscovery中的D-Bus错误:org.bluez.Error.Failed(无效的发现会话)
 D / BluetoothChat(1729):onActivityResult -1
 D / BluetoothChatService(1729):连接到:00:06:66:03:0C:51
 D / BluetoothChatService(1729):setState()STATE_LISTEN  - > STATE_CONNECTING
 E / BluetoothChat(1729):+恢复+
 I / BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_CONNECTING
 I / BluetoothChatService(1729):BEGIN 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):CONNECTION FAIL TOSTRING:java.io.IOException:服务发现失败
 D / BluetoothChatService(1729):setState()STATE_CONNECTING  - > STATE_LISTEN
 D / BluetoothChatService(1729):开始
 D / BluetoothChatService(1729):setState()STATE_LISTEN  - > STATE_LISTEN
 I / BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_LISTEN
 V / BluetoothEventRedirector(1080):收到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:从/ 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芯片连接到embedded式设备。 我的工作Python代码(使用PyBluez库),我想移植到Android,如下所示:

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

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

作为我在Android API中看到的唯一logging的机制,可以执行UUID的SDP查找,但我稍微不知所措。 使用我的Linux主机上的“sdptool browse”是空的,所以我推测这个芯片缺乏SDP支持。

Solutions Collecting From Web of "蓝牙RFCOMM / SDP连接到Android的RS232适配器"

好的简短的答案是我不得不使用这个UUID为了连接到我的SPP设备:

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

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

我想这是涉及到索尼爱立信手机的bug( 见这里 )。

我能够连接从/到一个Android 2.0设备和我的Mac使用蓝牙和完全组成的UUID。 试图做一个j2me设备(一个索尼爱立信w910i)相同的东西,只有当android是服务器,否则我得到同样的例外,你。

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

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

PS。 奇怪的是我的mac确实能够看到这个服务,即使这个ServiceRecord是“破”的,我猜测android只是懒得去看ServiceClassIDList中的第一个UUID,而我的pc通过列表search每一个元素。 但这只是我的猜测:)

您设置的波特率必须与所连接的设备相匹配。 他们有默认的115200或切换到9600,但是如果你需要其他的(在我的情况下1200为一个调查仪器),你需要通过超级terminal*和一个空调制解调器电缆设置。

*虽然bluesnap设备的文档build议使用超级terminal,但它有问题。 经过几个电话bluesnap,他们build议:

首先,将设备连接到PC时,尝试使用115200 8,N,1和Xclosures跳线设置回到其原始位置。 启用DTE时,如果不使用专门为DTR / DTE连接devise的特殊软件,则无法build立terminal连接。

其次,超级terminal已经知道BlueSnap的问题。 我会build议尝试TeraTerm或腻子。

花了我4天才发现这个!

你的蓝牙设备的波特率是多less? 我连接了,但是我的数据显示为混合波特率的典型乱码。 我有我的设置为57600,这是我见过其他人使用。 哦,谢谢你张贴结果,UUID让我工作了几天。

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