Как правило, факторы, влияющие на передачу по Bluetooth, следующие: Интервал соединения / количество кадров, отправляемых за одно событие соединения / длина каждого кадра данных и тип операции (в настоящее время не рассматривается).
В соответствии с оптимальным значением, поддерживаемым протоколом Android, вы можете установить Интервал подключения на 7,5 мс , а размер данных каждого кадра составляет 20 байт .
Если вам нужно отправить 260 байт данных, товремя, необходимое для расчета, составляет 97,5 мс .Иногда это может привести к колебаниям стабильности соединения Bluetooth, что занимает около 100 мс .
- почему оно ограничено 20 байтами?
Базовая спецификация определяет MTU по умолчанию ATT равным 23 байта.После удаления одного байта кода операции ATT и байта ручки ATT2 оставшиеся 20 байтов зарезервированы для GATT.Учитывая, что некоторые интеллектуальные устройства Bluetooth являются слабыми и не осмеливаются использовать слишком много места в памяти, спецификация ядра требует, чтобы каждое устройство поддерживало MTU 23. В начале соединения между двумя устройствами все как новыедруг, я не знаю, в порядке ли собеседник, так что строго следуйте за порядком, то есть отправляйте до 20 байтов за раз, что является самой большой страховкой.
Как пробить 20?
Поскольку максимальная длина ATT составляет 512 байт, достаточно изменить MTU передаваемого ATT.В Android (API 21) интерфейс для изменения MTU ATT:
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
Если ваше периферийное приложение меняет 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
}
}
После этого вы можете с радостью отправить длину поддерживаемых данных MTU.
Так что это на самом деле не связано с xamarin, это всего лишь ограничение, наложенное Android.