我必须在两个蓝牙设备之间交换数据,其中一个将是Android设备。为简单起见,您可以假设其他设备将是运行bluez的通用Linux设备,生成类似于健身跟踪器将生成的数据的数据。
该场景似乎是蓝牙低功耗的简单用例。我目前遇到的问题来自于通信必须可靠(TCP可靠的方式可靠)。这意味着:
虽然在链路层级别可以防止丢失,但在使用低能耗时(例如使用指示可能会达到此目的),似乎不会明确保留顺序。
没有用蓝牙做很多工作我目前对选项数量的压力很大,但同时没有任何选择似乎很适合这个法案。
是否存在在两个蓝牙设备之间建立可靠通信的“最佳实践”?蓝牙低功耗解决方案更可取,但不是强制性的。
答案 0 :(得分:3)
设置Bluetooth
连接后,它是可靠的。因此,您不必担心数据丢失或损坏。
因此,您可以轻松处理您所担心的事情。在为BroadcastReceiver
设置BluetoothAdapter
时,您将获得正确的连接和断开连接回调。
如果断开连接,您可能需要重新启动连接程序,一旦正确建立,您可以重新发送数据。
我还不知道你的目的,但我需要提到的一件事是,如果您长时间保持连接,我不建议Bluetooth
通信。如果没有连续传输,有些设备会在一段时间后自动断开连接。
答案 1 :(得分:1)
Android支持蓝牙,但它只允许从流中发送接收数据。 Google提供了一个非常好的示例项目:https://github.com/googlesamples/android-BluetoothChat。此示例的唯一缺点是它使用Handler来消除蓝牙事件。我稍微改了一下,所以它使用另一个Thread,并从它调用你设置的接口方法,看看项目:https://github.com/AlexShutov/LEDLights。这是普通的蓝牙,而不是BLE,希望它会有所帮助
答案 2 :(得分:1)
Android的BLE堆栈与链路层规范一样好。因此,您可以在一个方向上使用“无响应写入”,并在另一个方向上使用通知。只需确保您的外围设备端不会丢弃传入的写入。
答案 3 :(得分:0)
BLE使用24位CRC。对于使用BLE传输的数据量,CRC非常强大,并且损坏的可能性非常低(请注意,TCP CRC为16位,以太网CRC为32位,请参阅http://www.evanjones.ca/tcp-and-ethernet-checksums-fail.html)。
有线网络中的排序问题是通过不同路由将数据包路由到同一目的地的结果(请参阅If TCP is connection oriented why do packets follow different paths?)。这部分是由于使用了滑动窗口确认协议,它允许在被确认之前传输多个数据包。在BLE中没有路由,并且确认方案是停止和等待ARQ方案的变化(2位懒惰)确认),这意味着无法在未经确认的情况下发送新数据包。这两个因素使得无序传输的可能性极小。