Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# xamarin蓝牙数据接收延迟_C#_Android_Xamarin_Bluetooth - Fatal编程技术网

C# xamarin蓝牙数据接收延迟

C# xamarin蓝牙数据接收延迟,c#,android,xamarin,bluetooth,C#,Android,Xamarin,Bluetooth,我的xamarin应用程序运行在android上。它使用SPP通过蓝牙连接到自定义设备。应用程序发出命令,设备响应约260字节 我的问题是,在设备发送的数据和通过套接字提供给我的应用程序的数据之间似乎存在很大的延迟。这导致连接的吞吐量非常低 此处的范围图像: 在图像中,黄色跟踪是发送到设备的数据,蓝色跟踪是响应。如您所见,设备在发送命令后立即响应。我测量了从命令开始到响应结束的时间为12ms 在代码中,我测量了应用程序从接收响应的最后一个字节到发送下一个命令之间的时间。时间总是0或1ms。这不是

我的xamarin应用程序运行在android上。它使用SPP通过蓝牙连接到自定义设备。应用程序发出命令,设备响应约260字节

我的问题是,在设备发送的数据和通过套接字提供给我的应用程序的数据之间似乎存在很大的延迟。这导致连接的吞吐量非常低

此处的范围图像:

在图像中,黄色跟踪是发送到设备的数据,蓝色跟踪是响应。如您所见,设备在发送命令后立即响应。我测量了从命令开始到响应结束的时间为12ms

在代码中,我测量了应用程序从接收响应的最后一个字节到发送下一个命令之间的时间。时间总是0或1ms。这不是作用域告诉我的,在响应结束和下一个命令发送之间有一个明显的92ms周期

我还测量了从发送数据的代码行到接收到响应的第一个字节之间的时间,通常需要50到80ms。这就是问题所在

我已经检查了我的代码,没有延迟或计时器阻止命令发送。如果收到完整回复,它将立即发送数据请求

我有一个System.Threading.Thread,它循环处理数据的发送和接收。我对这个循环进行了计时,它总是需要不到3毫秒的时间来完成(大部分时间是0毫秒)。这表明在我的循环中没有延迟导致这种情况。我不希望有任何延迟,因为我们只讨论260字节的数据要读取和处理


Xamarin Android中是否存在可能导致通过蓝牙到达平板电脑的数据与我的应用程序可用的数据之间出现延迟的情况。也许有什么东西只是每100毫秒更新一次BluetoothSocket?我希望我的示波器上的空白消失。

一般来说,影响蓝牙传输的因素如下:连接间隔/每个连接事件发送的帧数/每个数据帧的长度,以及操作类型(目前未考虑)

根据Android协议支持的最佳值,您可以将连接间隔设置为7.5ms,每个帧的数据大小为20字节

如果需要发送260字节的数据,则计算所需的时间为97.5ms。有时,蓝牙连接的稳定性可能会出现波动,大约需要100ms

  • 为什么限制为20字节
  • 核心规范将ATT的默认MTU定义为23字节。删除ATT操作码的一个字节和ATT handle2个字节后,剩下的20个字节保留给GATT。 考虑到一些蓝牙智能设备较弱,不敢使用太多内存空间,核心规范要求每个设备必须支持23个MTU。 在两台设备连接开始时,每个人都像一个新朋友,我不知道对方的罚款,所以严格按照惯例,即一次最多发送20个字节,这是最保险的

  • 如何突破20
  • 由于ATT的最大长度为512字节,因此足以更改传输的ATT的MTU。在Android(API 21)上,更改ATT MTU的接口为:

    如果外围应用程序更改MTU并成功,则也将调用此回调

    之后,您可以愉快地发送supportedMTU数据的长度


    所以这实际上与xamarin无关,这只是Android强加的一个限制。

    就我个人而言,我非常怀疑xamarin。。。但我不知道你的代码和你在里面做什么。。。为了证明这是Xamarin的“问题”,请用本机Java/Kotlin编写一个测试项目,以进行怀疑检查。另外,使用不同的设备进行测试也是一个好主意。我在不同的android设备上进行了检查,延迟达到150到200毫秒。您的数据包大小适合std.L2CAP MTU,因此这不是问题所在。我首先怀疑的是您的代码,当然,在基于双线程发送/接收串行SPP例程中,您应该能够最大化带宽,总带宽当然很低,但延迟应该很低(默认MTU约为650字节)。我已经对代码进行了计时,没有发现任何问题。大部分代码是我自己的.net标准库。我让它通过串行电缆在winforms应用程序上运行,没有任何问题。该库包含并使用一个接口,因此连接的性质无关紧要,如蓝牙、串行等。。。重要的是你可以读取一个字节。此外,MTU问题也会出现在示波器上。发送数据所需的时间将增加。从图像中可以清楚地看到,260字节的传输在很好的时间内完成了。我不确定我是否理解。这将如何导致数据到达平板电脑和应用程序可用之间的延迟?建议您可以测试传递较少的数据(20字节)。如果希望传递较多的数据和较低的延迟,您需要修改编译自定义移动android系统的代码。
    public boolean requestMtu (int mtu)
    #Added in API level 21
    #Request an MTU size used for a given connection.
    #When performing a write request operation (write without response), the data sent is truncated to the MTU size. This function may be used to request a larger MTU size to be able to send more data at once.
    #A onMtuChanged(BluetoothGatt, int, int) callback will indicate whether this operation was successful.
    #Requires BLUETOOTH permission.
    #Returns true, if the new MTU value has been requested successfully
    
    @Override
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        super.onMtuChanged(gatt, mtu, status);
    
        if (status == BluetoothGatt.GATT_SUCCESS) {
            this.supportedMTU = mtu;//local var to record MTU size
        }
    }