蓝牙Android RFCOMM/SPP错误处理建议

蓝牙Android RFCOMM/SPP错误处理建议,android,bluetooth,rfcomm,spp,Android,Bluetooth,Rfcomm,Spp,我计划在Android设备和使用商用蓝牙模块的定制传感器之间使用通信协议。我将使用SPP配置文件,该配置文件被称为“向用户提供简单可靠的数据流,类似于TCP。” 我不太熟悉蓝牙技术,对设计这样的协议有一些疑问 首先,我不清楚我是否必须担心被破坏的数据是否被传输。底层protocoll堆栈能否保证我从Android提供的InputStream读取的字节与UART在传感器端接收的字节相同?我是否必须定义我自己的数据包,用CRC或其他东西进行保护,或者这会是一种过度杀伤力 从Android Bluet

我计划在Android设备和使用商用蓝牙模块的定制传感器之间使用通信协议。我将使用SPP配置文件,该配置文件被称为“向用户提供简单可靠的数据流,类似于TCP。”

我不太熟悉蓝牙技术,对设计这样的协议有一些疑问

首先,我不清楚我是否必须担心被破坏的数据是否被传输。底层protocoll堆栈能否保证我从Android提供的
InputStream
读取的字节与UART在传感器端接收的字节相同?我是否必须定义我自己的数据包,用CRC或其他东西进行保护,或者这会是一种过度杀伤力

从Android Bluetooth文档中,我不清楚如果信号弱且丢失一段时间,我的应用程序会发生什么。我是立即获得
IOException
,还是平台为我提供了一些隐藏的错误处理和恢复,让我看不到这些短暂的中断


感谢您的建议。

您不必担心SPP上的数据损坏,蓝牙提供了两个级别的CRC,一个在基带,另一个在L2CAP级别, 两者都有针对任何检测到的损坏的重传机制-因此应用程序将只接收良好的数据包

关于第二个问题-是的,在您连接的套接字流上,如果基础蓝牙连接断开,您将收到IOExceptions,Android无法处理自动恢复-通常应用程序需要检测断开的原因,并在适用时尝试重新连接。 因此,如果您想从上次成功接收/发送数据的时间点开始继续数据交换,那么您的应用程序应该维护某种序列号和轻协议,以实现恢复。
另一种选择是在重新连接时从数据交换开始(因此这取决于您的用例)

非常感谢,这个答案非常清楚,涵盖了我想知道的所有内容。