3

是否可以将 Android 蓝牙聊天示例应用程序设置为一次连接多个人,并拥有一个迷你聊天室?那会带来什么?

4

3 回答 3

8

tl; dr版本:蓝牙很烂,不要使用它,改用wifi,可能由网络后端支持。

多年来,为了一个社交无线网络研究项目,我已经彻底调查了这个问题。我的一般建议是:它不适用于超过两/三个人。蓝牙在设计时并未考虑到无线对等网络。

一般而言,Android 设备(尤其是HTC 的设备 iirc)中包含的廉价蓝牙控制器似乎一次只能处理两个或三个连接。我不确定这是硬件还是固件问题,但我可以讲述一些基本的轶事。大约在 2011 年初,我正在努力在 SDK 级别(即无需修改固件)实现这个想法,并且能够让对等点获得两个额外的连接(即三个设备,每个连接到另外两个)工作几分钟到一个小时,然后连接会突然断开,套接字将变得不可用,需要重新连接。不幸的是,20 分钟是一个上限,通常不可能连接到多个其他设备完全可靠。

该项目的目标是支持多人在后台静默交互,但这从未实现,相反,我们放弃了蓝牙,转而使用 wifi,效果要好得多。抽象地说,我认为人们将蓝牙视为可靠的点对点通信的可能媒介,但它并没有真正设计成那样:它更多地是用于小型设备(想想耳机)之间的短距离通信的媒介。

请注意,如果您想这样做,您可以连接的最大设备数量是固定的,因为根据蓝牙规范,一个微微网最多支持七个设备。(参见维基百科文章。)

所需的更改很简单:您为每个设备使用不同的 UUID。这可以通过多种方式实现,使用带外交换机制,或简单的方案,您以递增的方式分配 UUID,并在连接到网络时,依次尝试每种方式。

以下是一些相关的 Google 群组主题:

我记得发布了一篇更详细的文章,详细说明了如何执行此操作(使用代码),如果我能找到它,我也可能会挖掘出来。它应该是从 2010 年底或 2011 年初开始的。

所以答案是,抽象地说,是的,你可以尝试通过使用多个 UUID 来做到这一点(在你使用一个之后,就是这样,你必须使用一些分配协议尝试另一个)。然而,在实践中,经过大量的试验和错误,这并不能真正适用于您可能想要使用它的用途,而是使用互联网后端要好得多顺便说一句,这也有另一个原因,大多数用户不太喜欢打开蓝牙,因为担心电池电量耗尽。

于 2012-06-09T19:11:23.100 回答
4

把这个留在这里,以防它帮助别人。

我能够按照官方蓝牙教程制作我的自定义聊天室并对其进行一些修改。不幸的是,我无法提供大部分代码,但主要思想是:

每个设备都充当服务器和客户端。当 Chat 启动时,设备启动其服务器线程。服务器线程与官方相同,但在接受连接时不会结束。它只是继续听。

客户端线程与教程中的相同。

服务器和客户端线程都管理相同的连接。我按照本教程创建了用于接受消息的单独线程,并创建了一个用于发送消息的线程。

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);
}    

现在,当用户单击发送按钮时,始终在主活动中,每个工作人员(发送线程)将消息发送到远程设备。监听是异步运行的。

重要的:

  1. 您需要在消息发送失败时处理异常,并在检测到设备断开连接时删除设备的发送和接收线程。就我而言,我使用了众所周知的 UUID“00001101-0000-1000-8000-00805f9b34fb”。适用于每台设备。
  2. 您需要在尝试以客户端身份连接之间等待 3 秒,因为某些设备的蓝牙硬件较弱并且它拒绝以客户端身份连接。
于 2015-04-01T10:32:28.843 回答
0

Bt 连接最多支持 7 个 -10 连接。因此,您将被限制在该范围内。我认为它是为扩展主设备而不是随机通信而设计的

来源:在google上搜索“蓝牙编程”

于 2014-12-18T12:33:50.557 回答