【发布时间】:2018-12-11 14:56:11
【问题描述】:
我的 xamarin 应用程序在 android 上运行。它使用 SPP 通过蓝牙连接到自定义设备。 App 发出命令,设备以大约 260 字节响应。
我的问题是设备发送的数据与通过套接字对我的应用程序可用的数据之间似乎存在很大延迟。这会导致连接的吞吐量非常低。
此处的范围图片:https://imgur.com/a/gBPaWHJ
在图像中,黄色迹线是发送到设备的数据,蓝色是响应。如您所见,设备在命令发送后立即响应。我测量了从命令开始到响应结束的周期为 12 毫秒。
在代码中,我测量了应用程序接收到响应的最后一个字节到发送下一个命令之间的时间。时间总是 0 或 1ms。这不是示波器告诉我的,在响应结束和发送下一个命令之间有一个明确的 92 毫秒时间段。
我还测量了从发送数据的代码行到收到响应的第一个字节之间的时间,通常需要 50 到 80 毫秒。这就是问题所在。
我已经完成了我的代码,并且没有延迟或计时器阻止发送命令。如果收到完整的响应,它将立即发送数据请求。
我有一个 System.Threading.Thread 循环处理数据的发送和接收。我已经为这个循环计时,它总是需要不到 3 毫秒才能完成(大部分是 0 毫秒)。这表明我的循环没有延迟导致这种情况。我不希望有任何延迟,因为我们只谈论要读取和处理 260 字节的数据。
Xamarin Android 中是否存在可能导致数据通过蓝牙到达平板电脑与我的应用程序可用数据之间的延迟。也许有些东西只是每 100 毫秒更新一次蓝牙套接字?我希望我的示波器上的那些空白消失。
【问题讨论】:
-
就我个人而言,我非常怀疑这对 Xamarin 有什么影响...但我不知道您的代码以及您在其中做什么...要证明它是 Xamarin“问题”,请写一个在本机 Java/Kotlin 中测试项目以进行怀疑检查。使用不同的设备进行测试也是一个好主意。
-
我在不同的安卓设备上检查,延迟上升到 150 到 200 毫秒。
-
您的数据包大小符合标准。 L2CAP MTU,所以这不是问题。我首先要怀疑的是您的代码,当然,在双线程发送/接收基于串行的 SPP 例程中,您应该能够最大限度地利用带宽,总带宽当然很低,但延迟应该很低(默认 MTU 约为 650 字节)
-
我已经对代码进行了计时,没有发现问题。大部分代码是我自己的 .net 标准库。我已经通过串行电缆在 winforms 应用程序上运行它,没有问题。该库包含并使用一个接口,因此连接的性质无关紧要,蓝牙,串行等......重要的是您可以读取单个字节。此外,MTU 问题会在示波器上看到。发送数据所需的时间会增加。从图中可以看出,260bytes的传输已经及时完成了。
标签: c# android xamarin bluetooth