有没有办法通过蓝牙可靠地通信?

Is there a way to communicate reliably via Bluetooth?

我必须在两个蓝牙设备之间交换数据,其中一个是 Android 设备。为简单起见,您可以假设其他设备将是通用 linux 设备 运行 bluez 生成的数据类似于健身追踪器生成的数据。

该场景似乎是低功耗蓝牙的一个简单用例。我目前 运行 遇到的问题来自于通信必须可靠(以 TCP 的方式可靠)这一事实。这意味着:

虽然在 link 层级别防止了丢失,但在使用低能量时似乎没有明确保留例如顺序(使用指示可能会实现这一点)。

我没有用蓝牙做很多工作,目前我对大量的选项感到不知所措,同时似乎没有一个选项能很好地满足要求。

是否有 "best-practice" 用于在两个蓝牙设备之间建立可靠通信?蓝牙低功耗解决方案会更可取,但不是强制性的。

Android 支持蓝牙,但它只允许从流中发送或接收数据。 Google 中有一个非常好的示例项目:https://github.com/googlesamples/android-BluetoothChat . The only drawback of this sample is that it use Handler to nitify about Bluetooth events. I changed it a bit so it use another Thread and from it calls methods of interface you set, take a look at project: https://github.com/AlexShutov/LEDLights。这是普通蓝牙,不是BLE,希望对你有帮助

Android 的 BLE 堆栈与 link 层规范一样好。因此,您可以在一个方向上使用 "write without response",在另一个方向上使用通知。只要确保您的外围设备端不会丢弃传入的写入即可。

一旦您的 Bluetooth 连接设置可靠。所以您不必担心数据丢失或损坏。

所以你担心的事情在你身边可以轻松解决。在为您的 BluetoothAdapter 设置 BroadcastReceiver 时,您将获得正确的连接和断开回调。

如果出现任何断开连接,您可能需要重新启动连接程序,一旦正确建立,您可以重新发送数据。

我还不知道你的目的,但我需要在这里提一件事,如果你长时间保持连接,我不建议Bluetooth通信。如果没有连续传输,某些设备会在一段时间后自动断开连接。

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?)。这部分是由于使用了滑动 window 确认协议,它允许在 acknowledged.In BLE 之前传输许多数据包,没有路由,确认方案是停止等待 ARQ 的变体scheme(2-bit lazy acknowledgement),这意味着不可能在没有被确认的情况下发送新的数据包。这两个因素使得发生乱序传输的可能性极小。