我正在努力在测试平台中的多个设备之间建立蓝牙Piconet。所有设备都知道该网络的拓扑结构。
测试平台中的设备是Ubuntu台式电脑和Android(Eclair)设备。现在,我正在研究一种以确定的方式在这些设备之间建立主从关系的方法。具体来说,我正在寻找一种方法来建立一个Android设备作为主设备,并与其他7个设备打开多个连接。
我已经查看了使用bluez堆栈和NDK的本机实现,但是我的设备上的bluez堆栈实现(Samsung GT 15503)不符合我的标准,甚至像hcitool,hciconfig这样的普通应用程序都不起作用
因此,我尝试使用官方SDK,甚至成功地用我的笔记本电脑建立了一个RFCOMM插座(使用蓝牙聊天示例应用程序作为参考)。但我一直在尝试使用相同的BluetoothServerSocket连接两个或更多设备。除非我关闭原来的套接字,否则我似乎无法打开新的连接。
非常感谢这方面的任何建议。
答案 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()