c# - 我们是否必须在应用程序级别处理蓝牙 LE 通信中的 MTU?

标签 c# uwp bluetooth bluetooth-lowenergy

我正在用 C# 构建一个低功耗蓝牙测试应用程序,以使两个 Windows 10 应用程序进行通信(中央应用程序使用商业 .NET Framework SDK,外围应用程序使用商业 .NET Framework SDK一个使用 UWP),我正在尝试了解 MTU(最大传输单元)在应用程序级别的影响。到目前为止我的理解是这样的:

在蓝牙堆栈的L2CAP层中,“大”数据包会发生一些碎片和重组。因此,如果数据超过 MTU,它将以 block 的形式发送。 在 UWP 中,我们使用 GattLocalCharacteristic.WriteRequested 回调来处理接收到的数据。在我正在处理的示例中,当发送 2-3K 数据时,每 block 522 字节都会调用它(可能是协商的 MTU?),所以看来我必须在应用程序级别处理重组,尽管它应该在 L2CAP 级别完成(如果我理解正确的话)。这意味着我必须检测数据何时完整(使用某种长度字段、“EOF”或任何机制),这给协议(protocol)增加了一些负担,并且对我来说感觉非常低级。我本以为 WriteRequested 事件只会触发一次,其中包含所有数据。

最重要的是,UWP SDK(Windows.Devices.Bluetooth 命名空间)似乎没有提供了解实际 MTU 的方法(例如 requestMtu在 Android 上),所以在这里我必须再次制作一些自定义管道。

所以我想问题是:我是否必须检测协商的 MTU(在 UWP 中如何?)并自己分段和重新组合数据包?

最佳答案

您不必在 Windows 10 上协商 MTU。

它仅取决于所使用的蓝牙版本。
BLE4.0/4.1 的最大 MTU 为 23 字节,BLE4.2 的最大 MTU 为 251 字节。
对于 Windows 10 上的其他版本,我不知道最大值。
MTU 由 L2CAP 定义,可以是 23 到无穷大之间的任意值。蓝牙堆栈的实现是确定客户端和外设上的 MTU 的关键因素。
Windows 10 设备将始终尝试协商最大 MTU。

关于c# - 我们是否必须在应用程序级别处理蓝牙 LE 通信中的 MTU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57660713/

相关文章:

Android 版本不会更新 apk。有没有办法以编程方式防止缓存?

c# - 带有更新 excel 单元格的 OLEDB

c# - 媒体元素显示 H264 比特流 [UWP]

android - ios和android之间的蓝牙连接

java - JSR82 和蓝牙适配器

c# - 从 Windows Universal App 中的 ListView 获取选定的 ListViewItem 容器

c# - 在c#中关闭winform应用程序之前执行一些操作

c# - 获得文件或文件夹的所有权

c# - 在 C# 中将 HTML 电子邮件签名附加到纯文本电子邮件正文

c# - 命名空间 "MvxWindowsPage"中不存在名称 "using:Cirrious.MvvmCross.WindowsUWP.Views"