蓝牙或 wifi 流 (spp) 是否会丢失字节或损坏字节?
Can a bluetooth or wifi stream (spp) ever miss bytes or have corrupted ones?
有件事困扰了我多年。
我使用很多蓝牙和最近的 wifi 流 (spp)。这些流总是连接到特定的设备,并且通过简单的字节命令进行通信。
有些设备(它们的微控制器)是我自己编程的,我必须经常检查线路上的信号是否符合我的预期,发送并检查 crc。
不知怎么的,我想在我的智能手机上做同样的事情,因为我使用 "readByte" 访问我的流并逐字节读取,我一直想知道是否真的有可能
a) 消息中的一个字节可能丢失
b) 消息混合到达或 "out of sequence"
我不知道底层硬件有多少功能。它是否使用 crc 检查每条消息并在消息损坏时再次请求该消息?还是它会盲目地将每个字节传递给我的 "readByte" 方法?
如果设备先发送消息a再发送b,有没有可能接收方在a之前接收到b,然后在a之前传递我的代码b,或者甚至像拉链一样混淆字节,然后给我a[0]然后b [0] 然后是 a[1] 等等。
我应该对这些流有多大的信任?一些澄清将不胜感激
关于数据损坏,我没有任何好主意。
但是 "mix up the bytes like a zipper and give me a[0] then b[0] then a[1] " 不应该发生。
我构建了从外部蓝牙 gps 解析 nmea 消息的应用程序。我不检查任何东西,也不检查我的应用程序如何稳定运行。
我觉得你可以睡个好觉。基于数据包交换网络的 WiFi 和蓝牙,每个数据包都带有 crc,物理层具有内置的拥塞和 link 质量控制 - 因此,除了极其罕见的固件错误外,它实际上比有线串行连接更可靠.
换句话说 - 纠错发生在比您使用的级别更低的级别..
关于数据包到达顺序的问题的答案:点对点协议不受此问题的影响。当他们走不同的路线时会发生数据包重新排序,因此在没有其他路线时没有问题。
如果您在这些协议上使用面向字节的流,您将以相同的顺序获得相同的字节,因为它们在设计时就考虑到了这个目标。另一方面,数据包访问不是,但是 Android 不提供您使用它的方法。
我觉得如果你了解过Computer Network OSI Model
,你会更好地理解我在说什么。
首先,TCP/IP
与Bluetooth
毫无共同之处。 TCP
是传输层协议,而 Bluetooth
是低层协议。因此,您可以在蓝牙之上使用 TCP 或 UDP,就像在以太网之上使用 TCP 和 UDP 一样。
其次,当通过蓝牙设备传输数据时,将使用TCP
协议。 TCP
使用 congestion recovery algorithms
来确保数据准确传输。 TCP
的现代实现包括四种相互交织的流量控制算法:慢启动、拥塞避免、快速重传,以及快速恢复。所以,如果你想了解更多这方面的信息,你可以上网搜索。因为他们宁愿更理论化而不是程序化。
有件事困扰了我多年。 我使用很多蓝牙和最近的 wifi 流 (spp)。这些流总是连接到特定的设备,并且通过简单的字节命令进行通信。
有些设备(它们的微控制器)是我自己编程的,我必须经常检查线路上的信号是否符合我的预期,发送并检查 crc。
不知怎么的,我想在我的智能手机上做同样的事情,因为我使用 "readByte" 访问我的流并逐字节读取,我一直想知道是否真的有可能 a) 消息中的一个字节可能丢失 b) 消息混合到达或 "out of sequence"
我不知道底层硬件有多少功能。它是否使用 crc 检查每条消息并在消息损坏时再次请求该消息?还是它会盲目地将每个字节传递给我的 "readByte" 方法?
如果设备先发送消息a再发送b,有没有可能接收方在a之前接收到b,然后在a之前传递我的代码b,或者甚至像拉链一样混淆字节,然后给我a[0]然后b [0] 然后是 a[1] 等等。
我应该对这些流有多大的信任?一些澄清将不胜感激
关于数据损坏,我没有任何好主意。 但是 "mix up the bytes like a zipper and give me a[0] then b[0] then a[1] " 不应该发生。
我构建了从外部蓝牙 gps 解析 nmea 消息的应用程序。我不检查任何东西,也不检查我的应用程序如何稳定运行。
我觉得你可以睡个好觉。基于数据包交换网络的 WiFi 和蓝牙,每个数据包都带有 crc,物理层具有内置的拥塞和 link 质量控制 - 因此,除了极其罕见的固件错误外,它实际上比有线串行连接更可靠.
换句话说 - 纠错发生在比您使用的级别更低的级别..
关于数据包到达顺序的问题的答案:点对点协议不受此问题的影响。当他们走不同的路线时会发生数据包重新排序,因此在没有其他路线时没有问题。
如果您在这些协议上使用面向字节的流,您将以相同的顺序获得相同的字节,因为它们在设计时就考虑到了这个目标。另一方面,数据包访问不是,但是 Android 不提供您使用它的方法。
我觉得如果你了解过Computer Network OSI Model
,你会更好地理解我在说什么。
首先,TCP/IP
与Bluetooth
毫无共同之处。 TCP
是传输层协议,而 Bluetooth
是低层协议。因此,您可以在蓝牙之上使用 TCP 或 UDP,就像在以太网之上使用 TCP 和 UDP 一样。
其次,当通过蓝牙设备传输数据时,将使用TCP
协议。 TCP
使用 congestion recovery algorithms
来确保数据准确传输。 TCP
的现代实现包括四种相互交织的流量控制算法:慢启动、拥塞避免、快速重传,以及快速恢复。所以,如果你想了解更多这方面的信息,你可以上网搜索。因为他们宁愿更理论化而不是程序化。