在Android中建立蓝牙微微网

时间:2011-02-15 15:01:26

标签: android bluetooth

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

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

以下代码段说明了我从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种不同uuids的数组。尝试连接到服务器的客户端也将拥有这些uuids,并将按顺序逐个尝试,因为他们不知道已连接到服务器的客户端数量。

答案 1 :(得分:1)

也许这会有所帮助:

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

当您收到连接时,您应该开始一个新线程,其中包含您要对该连接执行的操作,然后再次调用accept()