我们正在开发一款通过蓝牙使用 SPP(串行端口配置文件)的应用程序,开发人员正在讨论使用某种类型的协议(protocol)和数据包传输,还是仅在没有任何形式的 ACK、序列或大小信息的情况下流式传输数据.
蓝牙是否提供有保证的传输和数据完整性,以便我们不需要数据包协议(protocol)设计的开销?我们可以仅依靠蓝牙来确保数据传输吗?
最佳答案
交货有保证吗?,
保证交货顺序。这是由于蓝牙协议(protocol)底层内置的确认/序列编号方案所致。因此,在较低层,数据包将被重新传输,直到被确认为止。请注意,这相当于停止并等待 ARQ 方案。如果超过超时时间,则认为连接丢失(通常为 30 秒)
数据完整性得到保证吗?
蓝牙 4.2 引入了 BT 安全连接。这包括对每个传输的数据包进行消息完整性检查 (MIC),接收端的 MIC 不匹配将触发重新传输,并且多个 MIC 不匹配可能会断开连接。
因此,如果您不使用安全连接功能,则无法保证完整性。有一个 16 位 CRC 方案用于保护数据,但众所周知,在很长一段时间内,将会出现 CRC 逃逸(位翻转,从而使 CRC 保持正确)。但这种情况比较少见,而且发生在嘈杂的环境中。如果您的应用程序需要非常高的数据完整性,那么可以使用 SecureConnection 或引入应用程序级完整性检查。
请注意,SPP Profile 本身没有任何错误/序列检查,RFCOMM 有一个 8 位 FCS(帧检查序列),用于检查 header 损坏。 L2CAP 流/重传模式有一个可选的 16 位 FCS,涵盖 L2CAP header 和数据,请注意,基本 L2CAP 模式根本没有 FCS。
如果您有启用 L2CAP FCS 的选项,则较低级别的 16 位 CRC + L2CAP 层的 16 位 FCS + RFCOMM 层的 8 位 FCS 将提供足以满足大多数应用程序的数据完整性。然而,正如前面提到的,如果它确实很关键,那么您需要引入额外的应用程序级别完整性检查。
关于蓝牙串行端口通信 (SPP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397802/