代码之家  ›  专栏  ›  技术社区  ›  ThePosey

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

  •  20
  • ThePosey  · 技术社区  · 16 年前

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

    还要注意的是,我可以很好地与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?

    listenUsingRfcommWithServiceRecord() 设置插座和 createRfcommSocketToServiceRecord()

    我正在尝试连接到一个带有 BlueSMiRF Gold 炸薯条我的工作Python代码(使用 PyBluez 库),我想移植到Android,如下所示:

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

    …因此,要连接到的服务仅定义为通道1,没有任何SDP查找。

    作为我在androidapi中看到的唯一一个对UUID进行SDP查找的机制,我有点不知所措。在我的Linux主机上使用“sdptool browse”的结果是空的,因此我猜测,所讨论的芯片只是缺少SDP支持。

    5 回复  |  直到 16 年前
        1
  •  34
  •   ThePosey    16 年前

    好的,简而言之,我必须使用此UUID才能连接到我的SPP设备:

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

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

        2
  •  2
  •   cheng81    16 年前

    see here ).

    我能够使用蓝牙和完全虚构的UUID连接android 2.0设备和mac。只有当android是服务器时,用j2me设备(索尼爱立信w910i)做同样的事情才有效,否则我会得到和你一样的例外。

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

    您可以尝试手动更改ServiceRecord并返回正确的ServiceClassIDList。也许它对你有用……不幸的是,我那愚蠢的手机拒绝更换它:(

    注:奇怪的是,我的mac电脑确实能够看到服务,即使ServiceRecord被“破坏”,我猜android只是费心在ServiceClassIDList中看到第一个UUID,而我的pc则在列表中搜索每个元素。但这只是我的假设:)

        3
  •  1
  •   John    13 年前

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

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

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

    我花了4天时间才弄明白!

        4
  •  0
  •   user293272 user293272    16 年前

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

        5
  •  0
  •   Gilead    16 年前

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

    推荐文章