"); //-->
1. 问题引言:
想在gatt client上(一般是手机上)传输长一点的数据给gatt server(一般是一个Bluetooth smart设备,即只有BLE功能的设备),但通过
[java]
writeCharacteristic(BluetoothGattCharacteristic)
来写的时候发现最多只能写入20个byte的数据。
这篇文章会回答下面几个问题:
1)为什么会是20?
2)如何突破20?
3)如何更优雅的来实现?
2. 为什么为限制成20个字节?
core spec里面定义了ATT的默认MTU为23个bytes, 除去ATT的opcode一个字节以及ATT的handle 2个字节之后,剩下的20个字节便是留给GATT的了。
考虑到有些Bluetooth smart设备功能弱小,不敢太奢侈的使用内存空间,因此core spec规定每一个设备都必须支持MTU为23。
在两个设备连接初期,大家都像新交的朋友一样,不知对方底细,因此严格的按照套路来走,即最多一次发20个字节,是最保险的。
由于ATT的最大长度为512byte,
因此一般认为MTU的最大长度为512个byte就够了,再大也没什么意义,你不可能发一个超过512的ATT的数据。
所以ATT的MTU的最大长度可视为512个bytes。
3. 如何突破20?
很简单嘛,改变传输的ATT的MTU就行了,大家经过友好的协商,得到双方都想要的结果,是最好的。在Android上(API 21),改变ATT MTU的接口为:
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
大声的说出来你想要一下子传多少,调用上面的接口就可以了,然后在下面的函数中看最终结果(当然了,如果你的peripheral申请改变MTU并且成功的话,那这个回调也会被调用):
@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
}
}
之后你就可以快乐的发送supported MTU-3的长度的数据了。
4. 如何优雅的来实现?
万一对方设备不同意你的请求怎么办?
对于app来说,一般是知道自己要最****送多少数据的,例如一次要发100个bytes,那么就首先试试申请一下103,失败的话,则申请一下53,即二分法,剩下的只能自己分段拆着发了。
一般来讲,app的开发者和对端设备的开发者都是同一伙儿人,这是好事,他们可以根据自己设备的硬件情况,来商量MTU应该是多少。
蓝牙BLE MTU规则与约定-zhenhuaqin-ChinaUnix博客
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
相关推荐
Achieving best-in-class RF performance in next gen Industrial and Medical connected applications
BlueTooth Power 评估板线图
意法半导体推出单片天线匹配IC,配合Bluetooth LE SoC和STM32无线MCU,让射频设计变得更轻松、快捷
Silicon Labs宣布推出具有先进硬件和软件的全新 Bluetooth®定位服务
高性价比无线MCU如何帮您将低功耗蓝牙应用到更多产品中
硕士学位论文 在蓝芽环境中传送H.263 视讯资料
用Bluetooth Developer Studio缩短70%蓝牙开发时间
开发智慧驾驶无限可能,驶向未来新科技
CEVA Bluetooth 5.4 IP获得蓝牙技术联盟(SIG)认证包含新功能以满足快速增长的电子货架标签(ESL)市场需求
意法半导体推出STM32WB1MMC Bluetooth LE 认证模块
Microchip推出新型PIC单片机系列产品,以更简便方式添加Bluetooth低功耗连接功能
BM70蓝牙解决方案
Bluetooth 有用過Bluetooth模組的嗎?介紹幾個廠家給我
可穿戴下的危机与Bluetooth LE芯片浅析
WIDCOMM Bluetooth Software1.4.1 Build 6
Nordic助力双模模块简化Bluetooth Classic Audio和LE Audio产品开发
蓝牙无线通讯协议V1.1
最新蓝牙耳机系统电路设计方案
MSP430,and,Bluetooth MSP430 and Bluetooth
Bluetooth 蓝牙 规范 10.1版
Bluetooth的过去与未来
请推荐带有bluetooth的接口芯片,谢谢!
利用Bluetooth®低功耗技术进行定位跟踪
Bluetooth readies spec for 2, 10-Mbit/s data rate
利用Bluetooth 低功耗技术进行定位跟踪方案解析
蓝牙技术及其协议栈
利用创新的Bluetooth核心规范v5.1中的到达角(AoA)增强室内定位服务