我正在尝试使用谷歌提供的蓝牙聊天示例 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 支持。