3

我们正在开发一个将通过蓝牙使用 SPP(串行端口配置文件)的应用程序,开发人员正在讨论使用某种类型的协议和数据包传输,而不是仅在没有任何形式的 ACK、序列或大小信息的情况下流式传输数据。

蓝牙是否提供有保证的传输和数据完整性,以便我们不需要数据包协议设计的开销?我们能否仅依靠蓝牙来确保数据传输?

4

2 回答 2

4

交货有保证吗?

交货顺序得到保证。这是由于蓝牙协议低层内置的确认/序列编号方案。所以在较低层,一个数据包被重新传输,直到它被确认。请注意,这相当于停止并等待 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 将提供足以满足大多数应用程序的数据完整性。但是,如前所述,如果它真的很关键,那么您需要引入额外的应用程序级别的完整性检查。

于 2017-07-21T15:07:39.980 回答
3

本质上,BT 有自己的安全传输机制。但是,这同样重要 - 我命令您知道数据何时开始和结束,您应该使用数据包类型传输,例如 STX 和 ETX 来分隔每个数据包。有些加密狗坚持在传输过程中有时间间隔重复最后发送的字节的坏习惯,但是当遇到ETX或EOT时它们会停止。而且,为了您的系统安全,您还可以在数据包的末尾包含一个校验和。那你就很确定了。

于 2017-07-20T20:10:21.700 回答