蓝牙串行端口通信 (SPP)

标签 bluetooth spp

我们正在开发一款通过蓝牙使用 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/

相关文章:

android - 使用 BluetoothChat 与 ELM327 通信

java - Android 至 PC RFCOMM channel

android - 如何以编程方式将 Android 蓝牙波特率设置为 19200?

android - Android启动串口服务的方法

bluetooth - 属性在读/写之前需要身份验证

java - 如何在 Android 中以编程方式检查蓝牙网络共享状态

python - python中的蓝牙设备名称和对应的串口名称

android - 为android设置一个pc蓝牙服务器

android - 以编程方式从Android应用程序连接到蓝牙耳机

Android 蓝牙连接失败(错误 : no bt sock found, scn 1)