我正计划在Android设备和使用商用蓝牙模块的自定义传感器之间使用通信协议。我会使用SPP配置文件,据说“为用户提供简单可靠的数据流,类似于TCP。”
我对蓝牙技术并不熟悉,对设计这样的协议有一些疑问。
首先,我不清楚是否必须担心传输的数据是否被传输。底层协议栈是否可以保证我从InputStream
Android读取的字节与UART在传感器端接收的字节相同?我是否必须定义自己的使用CRC或其他东西保护的数据包,或者它是否有点过分?
我从Android蓝牙文档中不清楚,如果信号很弱并且丢失了一段时间,我的应用程序会发生什么。我是否立即获得IOException
或平台为我提供了一些隐藏的错误处理和恢复,这会使我看不到这么短暂的中断?
感谢您的任何建议。
答案 0 :(得分:11)
您无需担心SPP上的数据损坏,蓝牙提供2级CRC,一个在基带,然后一个在L2CAP级别, 两者都具有针对任何检测到的损坏的重传机制 - 因此应用程序将仅接收到良好的数据包。
关于第二个问题 - 是的,如果底层蓝牙连接断开连接,您连接的Socket流将收到IOExceptions,Android无法处理自动恢复 - 通常应用程序需要检测断开连接的原因并尝试重新连接适用的。 因此,如果您希望从上次成功接收/发送的点开始继续数据交换,那么您的应用程序应保留某种序列号和轻量协议以实现恢复。 另一种选择是从重新连接时的数据交换开始(这取决于你的用例)