Bluetooth MTU

来源:互联网 发布:mysql 自带记录行号 编辑:程序博客网 时间:2024/05/22 16:42

转自 http://blog.csdn.net/stevenliyong/article/details/3720850

//Call requires API level 22 (current min is 21): android.bluetooth.BluetoothGattServerCallback#onMtuChanged@Overridepublic void onMtuChanged(BluetoothDevice device, int mtu) {    super.onMtuChanged(device, mtu);}在编写Android Ble服务端中的监听器BluetoothGattServerCallback时遇到该错误,然后就百度了下Mtu的定义,于是就找到了这篇文章。

最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

在网络上如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。

蓝牙也一样,如果蓝牙发送方设备的MTU 值比接受端设备的MTU大, 大的数据包就会被拆开来传送,蓝牙传输速度就会降低. 蓝牙的MTU 值是在L2CAP(逻辑链路控制层)中定义的.

蓝牙官方推荐的值是最小48字节,默认672字节.

但是实际情况与是一些蓝牙设备特别是PC设备将MTU的默认值设的很高,

这样如果蓝牙设备接受端还是使用672字节的默认值,则PC类发送方设备数据传送到接受端速度就会显得很慢.

为了获得高的传输速度,接受端不得不牺牲内存为代价,将默认的MTU值也改大.

经过测试:

从VAIO笔记本传送1MB的文件到PXA板子上.

如果板子端 MTU值是 672
我们只能得到20KB(1MB/50s)的速度

而将板子端MTU值改为 60000
我们就可以得到75KB(1MB/13s)的速度了

相差还是很大的! 付出的代价是蓝牙数据接受端每个L2CAP连接的内存消耗增加了!

0 0