android - 在 Android 的蓝牙中,BluetoothSocket.connect 是否调用 SDP 来获取新 channel

标签 android sockets bluetooth sdp

作为问题标题的延续,我通过从我配对的设备中选择一个 BluetoothDevice 设备并执行以下操作来获取 BluetoothSocket:

bSocket = device.createInsecureRfcommSocketToServiceRecord(myUUID);
bSocket.connect();

我的问题是:假设在配对时通过 UUID 进行通信的 channel 被记录为 channel 2,但在连接时另一台设备已将其监听器切换到 channel 3 并在 channel 上广播服务-3 对于相同的 myUUID。

当我执行连接时,它会尝试连接到 channel 2(在缓存中,引用我的另一个 question)还是会(.connect 命令)执行新的 SDP获取当前 channel ,即 3 并尝试连接到 channel 3(和 myUUID)。

是否可以通过connect 命令查看尝试了哪个 channel 。

谢谢。

最佳答案

Android 上有一些隐藏(模糊)的蓝牙功能可能会有所帮助。 它被称为 IBluetooth。 <强> Here 是如何使用它的说明。

一旦你开始运行,尝试 getRemoteServiceChannel 函数和 onRfcommChannelFound 回调 - 它将获得正确的 channel 并分别显示为你的 UUID 找到的 channel 。

通常,由于您的错误,我希望您在第一次连接时获得 channel 2,然后什么也得不到。这意味着 Android 是懒惰的,没有进行另一次 SDP 浏览。

如何让它们正确连接?也许如果你运气好,在 channel 2 连接后,调用这些隐藏函数会刷新它的 SDP 数据库?! 另一种方法是解除它们的绑定(bind)并以编程方式重新绑定(bind)它们 - 我怀疑这会让它进行另一次 SDP 浏览......

如果有用,别忘了投票

关于android - 在 Android 的蓝牙中,BluetoothSocket.connect 是否调用 SDP 来获取新 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219102/

相关文章:

android - .android 文件夹中的 Firebase 错误没有 debug.keystore

android - 有没有办法获取所有可用操作系统当前运行的前台应用程序(包)?

iphone - GameKit在设备屏幕关闭或处于后台时保持连接状态

Android可点击透明工具栏

android - @font-face 不适用于移动设备(特别是 Android)

C套接字编程: binding with getaddrinfo() and get device IP server is available

android - 为什么我的 Android 应用程序会耗尽电池电量?

c# - 将套接字传递给新的 AppDomain

c# - UWP SerialDevice.FromIdAsync 抛出 "Element not found"(HRESULT 异常 : 0x80070490) on Windows 10

java - Android - 关闭特定的蓝牙套接字