是否可以将Android蓝牙聊天示例应用程序设置为一次连接多个人,并拥有一个迷你聊天室?这意味着什么?
tl;dr 版本:蓝牙很糟糕,不要使用它,而是使用 wifi,可能由网络后端支持。
多年来,为了一个社交网络研究项目,我一直在彻底调查这个问题。我的一般建议是:它不适用于超过两/三个人。 蓝牙在设计时并没有考虑到无线点对点网络。
一般来说,Android设备(尤其是HTC的设备,iirc)上包含的廉价蓝牙控制器似乎一次处理的连接不会超过两三个。 我不确定这是硬件还是固件问题,但我可以讲述一些基本的轶事。 大约在 2011 年初,我正在努力在 SDK 级别(即无需固件修改)实现这个想法,并且能够让对等方获得两个额外的连接(即三个设备,每个设备连接到另外两个)在连接突然死亡并且套接字变得不可用之前工作几分钟到一个小时, 需要重新连接。 不幸的是,20 分钟是一个上限,通常根本不可能可靠地连接到多个其他设备。
该项目的目标是支持多人在后台默默地相互交互,但这从未实现,相反,我们放弃了蓝牙,转而使用 wifi,效果要好得多。 抽象地说,我认为人们将蓝牙视为可靠的点对点通信的可能媒介,但它并不是真正设计的:它更像是一种用于小型设备(想想耳机)之间短距离通信的媒介。
请注意,如果要执行此操作,可以连接的最大设备数是固定的,因为根据蓝牙规范,微微网最多支持七个设备。(请参阅维基百科文章。
所需的更改很简单:为每个设备使用不同的 UUID。 这可以通过多种方式实现,使用带外交换机制或简单方案,其中您以递增的方式分配 UUID,并在连接到网络时连续尝试每种方式。
以下是一些相关的 Google 群组话题:
- 蓝牙点对点网络
- 安卓蓝牙上的多个连接
记得我发布了一个更详细的详细介绍如何做到这一点(使用代码),如果我能找到它,我也可以挖掘出来。 应该是从2010年底或2011年初开始。
所以答案是,抽象地说,是的,你可以尝试通过使用多个UUID(使用一个UUID之后,就是这样,你必须使用某种赋值协议尝试另一个UUID)。 但是,在实践中,经过大量的试验和错误,这并不适用于您可能想要使用它的目的,最好使用互联网后端。 顺便说一下,这也是另一个原因,大多数用户真的不喜欢打开蓝牙,因为害怕他们的电池耗尽。
把这个留在这里,以防它帮助别人。
我能够按照官方蓝牙教程制作我的自定义聊天室并对其进行一些修改。不幸的是,我无法提供我的大部分代码,但主要思想是:
每个设备都充当服务器和客户端。启动聊天时,设备会启动其服务器线程。服务器线程与官方线程相同,但在接受连接时不会结束。它只是继续倾听。
客户端线程与教程中的线程相同。
服务器和客户端线程管理连接相同。按照本教程,我创建了用于接受消息的单独线程和一个用于发送消息的线程。
private void manageConnectedSocket(BluetoothSocket socket) {
//create thread responsible for sending messages.
SendingThread w = new SendingThread(socket);
MainActivity.addSendingThread(w);
//Creates listener for messages to accept.
MainActivity.addListener(socket);
}
现在在主要活动中始终当用户单击发送按钮时,为每个工作线程(发送线程)发送消息到远程设备。侦听正在异步运行。
重要:
- 您需要在消息发送失败时处理异常,并在检测到设备断开连接时删除设备的发送和接收线程。就我而言,我使用了众所周知的UUID"00001101-0000-1000-8000-00805f9b34fb"。适用于每台设备。
- 您需要在两次尝试之间等待 3 秒钟才能以客户端身份连接,因为某些设备的蓝牙硬件较弱,并且拒绝以客户端身份连接。
Bt 连接最多支持 7 -10 个连接。因此,您将在该范围内受到限制。我认为它是为主设备的扩展而设计的,而不是为随机通信而设计的
来源:在谷歌上搜索"蓝牙编程"