2011-02-15 29 views
3

我正在试验台中的多个设备之间建立蓝牙微微网。该网络的拓扑结构对于所有设备都是已知的。在Android中建立蓝牙微微网

测试平台中的设备是Ubuntu Desktop PC和Android(Eclair)设备。现在,我正在寻找一种以确定性方式在这些设备之间建立主从关系的方式。具体来说,我正在寻找一种方法来建立一个android设备作为主设备,并与其他7个设备建立多个连接。我已经看过使用bluez堆栈和NDK的本地实现,但是我的设备(Samsung GT 15503)上的bluez堆栈实现不符合我的猜测标准,甚至像hcitool,hciconfig这样的常规应用也不会工作。

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

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

回答

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个不同uuid的数组。试图连接到服务器的客户端也将拥有这些uuids,并将按顺序依次尝试它们,因为它们不知道已连接到服务器的客户端的数量。

+0

这不是文档在http://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html#accept(int)中所说的内容。这似乎表明,您可以重新使用BluetoothServerSocket接受后续传入连接,而无需关闭并重新创建连接,并且全部位于相同的UUID中。 – Tom 2012-03-31 02:40:27

1

也许这会有所帮助:

你必须要求每个连接的方法accept()(从BluetoothServerSocket)记住这一点。

当您收到,你应该先从你想要做的是什么样的连接一个新线程,然后调用连接的accept()再次