在 Android 中建立蓝牙微微网

Posted

技术标签:

【中文标题】在 Android 中建立蓝牙微微网【英文标题】:Establishing a Bluetooth Piconet in Android 【发布时间】:2011-02-15 15:01:26 【问题描述】:

我正在测试平台中的多个设备之间建立蓝牙微微网。所有设备都知道此网络的拓扑结构。

测试平台中的设备是 Ubuntu 台式电脑和 android (Eclair) 设备。现在,我正在寻找一种以确定的方式在这些设备之间建立主从关系的方法。具体来说,我正在寻找一种方法来建立一个 android 设备作为主设备并打开与其他 7 个设备的多个连接。

我查看了使用 bluez 堆栈和 NDK 的本机实现,但我的设备(Samsung GT 15503)上的 bluez 堆栈实现不符合我猜想的标准,甚至像 hcitool、hciconfig 这样的普通应用程序也不起作用.

因此,我尝试使用官方 SDK,甚至成功地与我的笔记本电脑建立了 RFCOMM 套接字(使用蓝牙聊天示例应用程序作为参考)。但是我被困在尝试使用相同的 BluetoothServerSocket 连接两个或更多设备的地步。除非我关闭原始套接字,否则我似乎无法打开新连接。

非常感谢您提供这方面的任何建议。

【问题讨论】:

【参考方案1】:

我终于弄清楚我做错了什么。显然,每当您从 BluetoothServerSocket 调用 accept 方法并返回一个套接字时,您必须在再次调用 accept 之前关闭此套接字。

我通过创建 7 个不同的 UUID 并使用 BluetoothServerSocket 来侦听和接受这些 UUID 中的每个的连接,从而解决了这个问题以建立我想要的微微网。一旦获得特定 UUID 的连接,我将关闭相应的服务器套接字并为下一个 UUID 重新打开另一个。

下面的 sn-p 说明了我从BTClickLinkCompete 得到的想法。

for (int i = 0; i < 7; i++) 
                BluetoothServerSocket myServerSocket = mBtAdapter
                        .listenUsingRfcommWithServiceRecord(srcApp, mUuid.get(i));
                BluetoothSocket myBSock = myServerSocket.accept();
                myServerSocket.close(); // Close the socket now that the connection
                //has been made
                //Do stuff with the socket here, like callback to main thread

这里,mUuid 是一个数组,存储了 7 个不同的 uuid。尝试连接服务器的客户端也会拥有这些 uuid,并且会按顺序一一尝试,因为他们不知道已经连接到服务器的客户端数量。

【讨论】:

developer.android.com/reference/android/bluetooth/… 上的文档不是这样说的。这似乎是说您可以重用您的 BluetoothServerSocket 来接受后续传入的连接,而无需关闭并重新创建它,并且所有这些都在同一个 UUID 上。 @Rajkishan ,您可以连接多少个客户端?我无法将超过 4 个从机连接到主机。你能帮我解决这个问题可能是什么问题吗,我也遵循相同的代码。 @Rajkishan 您能否分享示例代码,这将是一个很大的帮助。我从 android 文档中了解到,android 无法进行多个连接,或者我可能没有得到任何示例。请分享您的代码【参考方案2】:

也许这会有所帮助:

您必须为每个连接调用方法accept()(来自BluetoothServerSocket)记住这一点。

当你收到一个连接时,你应该启动一个新线程,然后再调用accept()

【讨论】:

以上是关于在 Android 中建立蓝牙微微网的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式确定蓝牙主/从角色?

Android 蓝牙开发

Android 蓝牙开发

Android 蓝牙开发之搜索配对连接通信大全

如何在windows pc和android设备之间建立蓝牙连接

Android蓝牙开发—— 经典蓝牙连接方法