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

时间:2015-04-15 11:47:28

标签: android bluetooth wifi spp

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

我自己编程了一些设备(他们的微控制器),我必须经常检查线路上的信号是否符合预期,发送并检查crcs。

不知怎的,我想在我的智能手机上做同样的事情,因为我用“readByte”访问我的流并逐字节读取,我总是想知道它是否真的可能 a)消息中的一个字节可能丢失 b)消息混合或“不按顺序”

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

如果设备发送消息a然后是b,接收器是否可能在a之前接收到b并在a之前传递我的代码b或者甚至混合像拉链这样的字节并给我一个[0]然后b [0 ]然后是[1]等等。

我应该对这些流有多少信任?一些澄清将不胜感激

3 个答案:

答案 0 :(得分:4)

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

换句话说 - 错误纠正发生在低于您使用的水平..

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

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

答案 1 :(得分:1)

我觉得如果你曾经了解过Computer Network OSI Model,你就会理解我所说的更好。

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

第二,当通过蓝牙设备传输数据时,将使用TCP协议。 TCP使用congestion recovery algorithms确保数据准确传输。 TCP的现代实现包括四种用于流量控制的交织算法:慢启动拥塞避免快速重新传输快速恢复。因此,如果您想了解更多相关信息,可以搜索互联网。因为他们更倾向于理论而不是程序化。

答案 2 :(得分:0)

数据损坏,我没有任何好主意。 但是"像拉链一样混合字节然后给我一个[0]然后b [0]然后一个[1]"不应该发生。

我构建了从外部蓝牙gps解析nmea消息的应用程序。我不会检查任何内容以及我的应用程序如何稳定运行。