我们正在开发一款通过蓝牙使用 SPP(串行端口配置文件)的应用程序,开发人员正在讨论使用某种类型的协议和数据包传输,而不是仅在没有任何形式的 ACK、序列或大小信息的情况下流式传输数据。
蓝牙是否提供有保证的传输和数据完整性,以便我们不需要数据包协议设计的开销?我们可以仅依靠蓝牙来确保数据传输吗?
交货有保障吗?
保证发货顺序。
这是由于蓝牙协议底层内置的确认/序列编号方案所致。因此,在较低层,数据包会被重新传输,直到被确认为止。
注意,这相当于停止并等待ARQ方案。如果超过超时时间,则认为连接丢失(一般为 30 秒)。
数据完整性是否得到保证?
蓝牙4.2引入了BT安全连接。这包括对每个传输的数据包进行消息完整性检查 (MIC),接收端的 MIC 不匹配将触发重新传输,并且大量 MIC 不匹配可能会断开连接。
因此,如果您不使用安全连接功能,则无法保证完整性。
有一个 16 位 CRC 方案用于保护数据,但众所周知,在很长一段时间内,将会出现 CRC 逃逸(位翻转以使 CRC 保持正确)。但这种情况比较少见,而且发生在嘈杂的环境中。如果您的应用程序需要非常高的数据完整性,则可以使用 SecureConnection 或引入应用程序级完整性检查。
请注意,SPP Profile 本身没有任何错误/序列检查,RFCOMM 有一个 8 位 FCS(帧检查序列),用于检查标头损坏。 L2CAP 流/重传模式有一个可选的 16 位 FCS,涵盖 L2CAP 标头和数据。请注意,基本 L2CAP 模式根本没有 FCS。
如果您可以选择启用 L2CAP FCS,那么您将拥有较低级别的 16 位 CRC + L2CAP 层的 16 位 FCS + RFCOMM 层的 8 位 FCS 将提供足以满足大多数应用程序的数据完整性。然而,正如前面提到的,如果它确实很关键,那么您需要引入额外的应用程序级别完整性检查。
本质上BT有自己的传输安全机制。然而,这同样重要 - 我为了让您知道数据何时开始和结束,您应该使用数据包类型传输,例如 STX 和 ETX 来分隔每个数据包。有些加密狗坚持如果传输中出现时间间隔则重复最后发送的字节的坏习惯,但当遇到 ETX 或 EOT 时它们会停止。 而且,为了系统安全,您还可以在数据包末尾添加校验和。那你就很确定了。