【问题标题】:Bluetooth connection only works first time蓝牙连接仅在第一次工作
【发布时间】:2011-07-20 14:35:12
【问题描述】:

我正在尝试使用蓝牙 (SPP) 为 medical device 开发一个 Android 应用程序。我以 BluetoothChat 作为起点(另请参阅 earlier post)。现在我觉得我面临一个奇怪的问题,我也很难描述它。在 Nexus S 上进行测试。

完成测量后,医疗设备会检查其内存中的蓝牙地址和有关先前配对设备的其他信息。如果找到,它将尝试启动连接(当手机上的应用程序正在侦听连接时)然后传输数据,否则它会启动查询过程。

第一次正常:配对过程,建立连接和传输数据。收到数据后,应用程序会回复一个 ACK​​ 包并终止连接。

其余时间不起作用:测量后,我可以在 LogCat 中看到手机从设备接收到信号(就像第一次一样),所以我知道设备保存了手机的蓝牙地址。系统似乎忽略了信号(或至少没有任何反应),没有建立连接,因此即使我使用BluetoothServerSocketaccept 方法与它工作时的方式相同,也没有传输数据。如果我从手机中删除配对记录,此信号将启动配对过程并且设备再次配对,但它们仍然不会建立连接或传输数据。我猜关于信号的消息表示尝试建立连接,但出现了问题。日志中的消息与连接成功时的消息相同,可以在LogCat中看到:

03-22 14:21:55.335: ERROR/BluetoothEventLoop.cpp(114): event_filter: 收到信号 org.bluez.Device:PropertyChanged from /org/bluez/4123/hci0/dev_00_A0_96_2D_05_E8

令人困惑的是,它是一条错误消息,并且在它正常工作时会显示在日志中。

奇怪的是,他们第一次成功配对时它就起作用了,但之后就再也没有了。当数据被传输并且设备接收到 ACK 时,它会保存蓝牙地址“和其他有用的信息”。我可以重现成功的“第一次”的唯一方法是将医疗设备与另一台设备配对,然后再次将其与手机上的应用程序配对。

我对究竟是什么导致了这个问题感到困惑。 有人知道吗?

如果问题是由医疗设备而不是手机引起的,恐怕我的问题有点具体到让其他人熟悉。我在想它可能与链接密钥或频道有关?但另一方面,正如我所说,如果我从手机中删除配对,我会再次收到配对请求。

医疗设备较旧,使用蓝牙 1.2。现在让我感到震惊的是,我应该看看是否有任何与连接相关的问题。 可能是使用蓝牙 1.2 的设备在配对时存储哪些信息的另一个策略?

目前我觉得我正在为一个我不完全理解的问题而苦苦挣扎,但如果我以后能理解的话,我当然会带着我的结论回来。我希望我没有忘记重要的细节。

提前致谢/F

【问题讨论】:

    标签: android bluetooth


    【解决方案1】:

    嗨 fredricus 我的问题与你的问题类似,我正在运行一个蓝牙服务,当蓝牙打开时,它会继续监听数据。你已经解决了将 android 设备连接到医疗设备的问题,因为你提到你使用了反射。但万一如果医疗启动连接将能够连接到安卓设备。

    【讨论】:

    • 好吧,要明确一点:在我的例子中,医疗设备连接到我的 Android 应用程序提供的蓝牙服务。我设法让医疗设备连接到它,并使用反射来获取端口(RFCOMM 通道)。因此,如果这是您的问题,您应该尝试找到 here 的反射代码。
    • 另外,如果医疗设备启动连接,请注意您还必须注意服务名称和 UUID(用于设置协议/配置文件),以确保设备实际尝试连接到您的蓝牙服务。您可以在this link 中找到相应配置文件/协议的 UUID:s。
    【解决方案2】:

    听起来问题出在医疗设备上,它无法与已配对的设备重新建立连接(即重新验证)。 我不认为成为 1.2 应该很重要。这些程序旨在向后兼容,以便所有蓝牙版本相互兼容。 您可能需要联系bluetooth sniffer trace 来检查无线可能发生的情况,以验证问题是否出在医疗设备方面。

    另一个选项是检查 android 是否有任何方法可以打开更详细的蓝牙交互记录并启用它。 Android 消息的默认日志级别非常高,没有提供太多详细信息

    【讨论】:

    • 感谢您的好建议。我没有想到这样的程序。我可能已经在这个问题上徘徊了很长时间,并且在试图深入挖掘时失去了广阔的视野。我会尝试一下,看看我能从中得到什么,然后回来提供有关进度的更多信息。
    • 我无法获得嗅探器,但我已与制造商交谈,问题是设备在配对和使用 listenUsingRfcommWithServiceRecord 时保存了套接字,即通道,意味着“系统将分配一个未使用的 RFCOMM 频道来监听”。因此,我需要设置通道或关闭并创建一个新的服务器套接字,直到获得正确的 Rfcomm 通道。所以这是我的新问题。我在看this question,但我仍然希望有更好的解决方案?
    • 我没有找到这个所以我猜没有,但是.. 是否可以在标准 API 的帮助下检查 Rfcomm 通道的编号?
    • 看看这是否有帮助 - stackoverflow.com/questions/4887307/…
    • 谢谢,这实际上是我在上面的评论中发布的链接(几乎不可见):-D 无论如何,我不必向后移植到 Android 1.5。解决方案是使用反射来获取所需的私有变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多