Android Ble MTU

最近要做BLE数据传输,其中一个问题就是->MTU大小到底是多少,找了很多博客资料来看,答案是20,为什么是20,谁定义的20,官方资料如何解释的,,,等等问题,没看到能够说明白的,,当然,,你可以看看接下来的介绍,就像记住1+1=2一样,记住它。

想在gatt client上(一般是手机上)传输长一点的数据给gatt server(一般是一个Bluetooth smart设备,即只有BLE功能的设备),但通过

[java]  view plain  copy
  1. writeCharacteristic(BluetoothGattCharacteristic)  
来写的时候发现最多只能写入20个byte的数据。

这篇文章会回答下面几个问题:

1)为什么会是20?

2)如何突破20?

3)如何更优雅的来实现?


第一个问题,为什么为限制成20个字节?

core spec里面定义了ATT的默认MTU为23个bytes,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。


考虑到有些Bluetooth smart设备功能弱小,不敢太奢侈的使用内存空间,因此core spec规定每一个设备都必须支持MTU为23。

在两个设备连接初期,大家都像新交的朋友一样,不知对方底细,因此严格的按照套路来走,即最多一次发20个字节,是最保险的。


由于ATT的最大长度为512byte,


因此一般认为MTU的最大长度为512个byte就够了,再大也没什么意义,你不可能发一个超过512的ATT的数据,就像是孙猴子跑不过五行山一样。

所以ATT的MTU的最大长度可视为512个bytes。


第二个问题,如何突破20?

很简单嘛,改变传输的ATT的MTU就行了,大家经过友好的协商,得到双方都想要的结果,是最好的。在Android上(API 21),改变ATT MTU的接口为:

[java]  view plain  copy
  1. public boolean requestMtu (int mtu)  
  2.   
  3. Added in API level 21  
  4. Request an MTU size used for a given connection.  
  5.   
  6. 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.  
  7.   
  8. A onMtuChanged(BluetoothGatt, intint) callback will indicate whether this operation was successful.  
  9.   
  10. Requires BLUETOOTH permission.  
  11.   
  12. Returns  
  13. trueif the new MTU value has been requested successfully  

大声的说出来你想要一下子传多少,调用上面的接口就可以了,然后在下面的函数中看最终结果(当然了,如果你的peripheral申请改变MTU并且成功的话,那这个回调也会被调用):

[java]  view plain  copy
  1. @Override  
  2. public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {  
  3.     super.onMtuChanged(gatt, mtu, status);  
  4.   
  5.     if (status == BluetoothGatt.GATT_SUCCESS) {  
  6.         this.supportedMTU = mtu;//local var to record MTU size  
  7.     }  
  8. }  

之后你就可以快乐的发送supportedMTU-3的长度的数据了。


第三个问题,如何优雅的来实现?

俗话说得好,郎有情就怕妾无意。万一对方设备不同意你的请求怎么办?

对于app来说,一般是知道自己要最大发送多少数据的,例如一次要发100个bytes,那么就首先试试申请一下103,失败的话,则申请一下53,即二分法,剩下的只能自己分段拆着发了。

一般来讲,app的开发者和对端设备的开发者都是同一伙儿人,这是好事儿,他们可以根据自己设备的硬件情况,来商量MTU应该是多少。

总之,把事儿摆到桌面上,提前做好,会使得你的程序更加professional。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值