Android 蓝牙或wifi流(spp)是否会丢失字节或有损坏的字节?

Android 蓝牙或wifi流(spp)是否会丢失字节或有损坏的字节?,android,bluetooth,wifi,spp,Android,Bluetooth,Wifi,Spp,有件事困扰了我好几年。 我使用了很多蓝牙和最近的wifi流(spp)。这些流总是连接到特定的设备,通过简单的字节命令进行通信 一些设备(它们的微控制器)我自己编程,在那里我必须始终检查电线上的信号是否符合我的预期,发送并检查CRC 不知何故,我想在我的智能手机上做同样的事情,因为我用“readByte”访问我的流,并逐字节读取,我总是想知道这是否真的可能 a) 消息中可能缺少一个字节 b) 消息到达时混杂或“无序” 我不知道底层硬件有多少功能。它是否使用crc检查每条消息,并在消息损坏时再次请求

有件事困扰了我好几年。 我使用了很多蓝牙和最近的wifi流(spp)。这些流总是连接到特定的设备,通过简单的字节命令进行通信

一些设备(它们的微控制器)我自己编程,在那里我必须始终检查电线上的信号是否符合我的预期,发送并检查CRC

不知何故,我想在我的智能手机上做同样的事情,因为我用“readByte”访问我的流,并逐字节读取,我总是想知道这是否真的可能 a) 消息中可能缺少一个字节 b) 消息到达时混杂或“无序”

我不知道底层硬件有多少功能。它是否使用crc检查每条消息,并在消息损坏时再次请求消息?还是盲目地将每个字节传递给我的“readByte”方法

如果设备先发送消息a,然后发送消息b,那么接收方是否可能在a之前接收b,并在a之前传递我的代码b,或者甚至像拉链一样混合字节,然后给我a[0],然后b[0],然后a[1],依此类推


我应该对这些溪流有多少信任?如果能澄清一下,我将不胜感激。

关于数据损坏,我没有什么好主意。 但是“像拉链一样把字节混在一起,然后给我一个[0],然后给我一个[0],然后给我一个[1]”不应该发生


我构建了一个应用程序,可以解析来自外部蓝牙gps的nmea消息。我不检查任何东西,也不检查我的应用程序如何稳定工作。

我想你可以睡个好觉。基于分组交换网络的WiFi和蓝牙,每个分组都带有crc,物理层具有内置的拥塞和链路质量控制——因此,除了极少数固件错误外,它实际上比有线串行连接更可靠

换句话说-错误更正发生在比您使用的级别更低的级别

关于数据包到达顺序问题的答案:点对点协议不受此问题的影响。当数据包通过不同的路由传输时,会发生数据包重新排序,因此在没有其他路由的情况下不会出现问题


如果您在这些协议上使用面向字节的流,那么您将以相同的顺序获得相同的字节,因为它们的设计考虑到了这个目标。另一方面,数据包访问并非如此,但Android并没有为您提供使用它的方法。

我觉得如果您了解了
计算机网络OSI模型,您就会更好地理解我所说的内容

首先
TCP/IP
蓝牙
没有任何共同之处
TCP
是一种传输级协议,而
Bluetooth
则是一种较低级别的协议。因此,您可以在蓝牙上使用TCP或UDP,就像在以太网上使用TCP和UDP一样

,当数据通过蓝牙设备传输时,将使用
TCP
协议。
TCP
使用
拥塞恢复算法
确保数据准确传输。
TCP
的现代实现包括四种相互交织的流量控制算法:慢启动拥塞避免快速重传快速恢复。所以,如果你想了解更多,你可以上网搜索。因为他们更倾向于理论性而非纲领性