android ble 传输数据,安卓如何提高ble传输速度

关于安卓传输最大只能传输20个byte的数据问题

前面这个问题答案是从网上取来,具体链接忘记了,如有冒犯,敬请原谅,这只是用来提醒自己以防忘记,链接http://blog.csdn.net/sinat_19...。

做安卓开发的时候经常会遇到下面一个问题:

想在gatt client上(一般是手机上)传输长一点的数据给gatt server(一般是一个Bluetooth smart设备,即只有BLE功能的设备),但通过writeCharacteristic(BluetoothGattCharacteristic) 来写的时候发现最多只能写入20个byte的数据。

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

为什么会是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的接口为:

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

}

}

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

如何更优雅的来实现?

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

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

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

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

另外,cc2540/1 是属于蓝牙4.0规范的,所以不支持修改mtu,但是cc2640以后的ble 4.1规范就可以修改这个特性了,所以2640以后的传输速度是一个飞跃的提升

硬件使用2540的情况下安卓如何提升速度呢?

鉴于2540现在价格比较低,市场上大多数产品都是用这样的4.0协议的芯片的,所以这种情况下开发安卓应用,你总不能和客户说安卓发送接收比较慢,苹果的比较快,请你去买苹果手机吧!这样客户不请你吃拳头才怪。

所以我们可以使用下面的代码修改一下下,还是以simpleBLEPeripheral工程为例子:

// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled

#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 16//80

// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled

#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 16//800

simpleBLEPeripheral.c下面宏定义有以上2条信息,是定义最小和最大连接间隔的,我们要定义到最小值16,让安卓设备和BLE设备保持连接,这样传输就能好好地了;实测如果进行OAD的话,不修改要30-60min,如果修改后就变成8min了,对比苹果还是有距离,但是已经缩小很多了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在 Android 平台上使用 Bluetooth Low Energy(BLE)API 进行收发数据的示例代码: 首先,您需要在应用程序中获取 BluetoothAdapter 和 BluetoothGatt 对象。然后,您需要扫描并连接到 BLE 设备,获取其 BluetoothGatt 对象。一旦连接成功,您可以使用 BluetoothGatt 对象进行数据传输。 发送数据: ```java // 获取要发送的数据 byte[] data = "hello world".getBytes(); // 获取要发送数据的特征值对象 BluetoothGattCharacteristic characteristic = bluetoothGatt.getService(serviceUuid) .getCharacteristic(characteristicUuid); // 设置数据到特征值中 characteristic.setValue(data); // 发送数据 bluetoothGatt.writeCharacteristic(characteristic); ``` 在上面的示例代码中,`serviceUuid` 和 `characteristicUuid` 是您要发送数据的特征值的 UUID。 一旦您调用 `writeCharacteristic` 方法,BLE 设备将接收到发送的数据。如果发送成功,将会触发 `onCharacteristicWrite` 回调。 接收数据: 要接收 BLE 设备发送的数据,您需要在 BluetoothGatt 对象上注册接收数据的回调。 ```java // 注册接收数据的回调 bluetoothGatt.setCharacteristicNotification(characteristic, true); // 获取数据的描述符 BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid); // 启用数据的通知 descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); bluetoothGatt.writeDescriptor(descriptor); ``` 在上面的示例代码中,`characteristic` 是您要接收数据的特征值对象,`descriptorUuid` 是通知数据的描述符的 UUID。 一旦您调用 `setCharacteristicNotification` 和 `writeDescriptor` 方法,BLE 设备将开始将数据发送到 Android 设备。当数据到达时,将触发 `onCharacteristicChanged` 回调。在此回调中,您可以从特征值对象中获取数据并进行处理。 ```java @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { // 处理接收到的数据 byte[] data = characteristic.getValue(); // ... } ``` 请注意,BLE 通信是异步的,因此您需要在适当的回调中处理数据。如果您需要连续接收多个特征值的数据,请考虑使用 BluetoothGatt 的 `setCharacteristicNotification` 方法注册通知,以便连续接收数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值