我自己编程了一些设备(他们的微控制器),我必须经常检查线路上的信号是否符合预期,发送并检查crcs。
不知怎的,我想在我的智能手机上做同样的事情,因为我用“readByte”访问我的流并逐字节读取,我总是想知道它是否真的可能 a)消息中的一个字节可能丢失 b)消息混合或“不按顺序”
我不知道底层硬件有多少功能。它是否使用crc检查每条消息,并在消息损坏时再次请求消息?或者它是否盲目地将每个字节传递给我的“readByte”方法?
如果设备发送消息a然后是b,接收器是否可能在a之前接收到b并在a之前传递我的代码b或者甚至混合像拉链这样的字节并给我一个[0]然后b [0 ]然后是[1]等等。
我应该对这些流有多少信任?一些澄清将不胜感激
答案 0 :(得分:4)
我认为你可以睡得好。基于分组交换网络的WiFi和蓝牙,每个数据包都带有crc,物理层内置拥塞和链路质量控制 - 因此,除了极为罕见的固件错误外,它实际上比有线串行连接更可靠。
换句话说 - 错误纠正发生在低于您使用的水平..
回答有关数据包到达顺序的问题:点对点协议不受此问题的影响。当数据包重新排序通过不同的路由传输时发生,因此没有其他路由时没有问题。
如果您在这些协议上使用面向字节的流,则会以相同的顺序获得相同的字节,因为它们的设计考虑了这一目标。另一方面,数据包访问不是,但Android并没有为您提供使用它的方法。
答案 1 :(得分:1)
我觉得如果你曾经了解过Computer Network OSI Model
,你就会理解我所说的更好。
首先,TCP/IP
与Bluetooth
没有任何共同之处。 TCP
是传输级协议,而Bluetooth
是较低级别的协议。因此,您可以在蓝牙上使用TCP或UDP,就像在以太网上使用TCP和UDP一样。
第二,当通过蓝牙设备传输数据时,将使用TCP
协议。 TCP
使用congestion recovery algorithms
确保数据准确传输。 TCP
的现代实现包括四种用于流量控制的交织算法:慢启动,拥塞避免,快速重新传输和快速恢复。因此,如果您想了解更多相关信息,可以搜索互联网。因为他们更倾向于理论而不是程序化。
答案 2 :(得分:0)
数据损坏,我没有任何好主意。 但是"像拉链一样混合字节然后给我一个[0]然后b [0]然后一个[1]"不应该发生。
我构建了从外部蓝牙gps解析nmea消息的应用程序。我不会检查任何内容以及我的应用程序如何稳定运行。