#bluetooth #bluez #bluetooth-gatt
#bluetooth #bluez #bluetooth-gatt
Вопрос:
При написании приложения для работы в качестве сервера Gatt с использованием API DBus Bluez MTU, заданный вызовами команд ReadValue
и AcquireNotify
, сообщает MTU как 517.
Максимальный размер полезной нагрузки канала передачи данных 251 байт (27 без увеличения длины данных). Из-за 4-байтового заголовка L2CAP максимальное значение MTU составляет 247.
Не зависит ли значение ATT_MTU от ограничения длины данных канального уровня? Фрагментированы ли данные на более низком уровне, и если да, то каков максимальный ATT_MTU?
Ответ №1:
ATT_MTU — это 16-разрядное число, и, следовательно, оно может быть не более 65535. Однако ATT_MTU согласовывается между двумя устройствами и будет установлен на минимум максимального значения ATT_MTU для обоих устройств.
Но характеристика может составлять только 512 байт, поэтому обычно такой большой mtu, как 65535, не используется. Вам пришлось бы использовать «чтение нескольких характеристик» или что-то подобное, чтобы использовать такой большой mtu.
Значение ATT_MTU полностью не зависит от длины данных канального уровня и автоматически фрагментируется hci и канальным уровнем. Хост L2CAP — это тот, который обычно повторно собирает пакеты.
Ответ №2:
Да, значение ATT_MTU не зависит от ограничения длины данных канального уровня. Как следует из названия, ATT_MTU относится к максимальному объему данных, которые могут быть переданы на уровне ATT, тогда как обычная длина пакета относится к максимальному объему данных, которые могут быть отправлены на физическом уровне.
Как вы предположили, это означает, что если ATT_MTU превышает максимальную физическую длину пакета, данные фрагментируются на нижнем (физическом) уровне. Например, если максимальное значение ATT_MTU равно 517, а максимальный размер блока BLE равен 251, это означает, что передаваемые данные будут разделены на блоки по 251 байту. Вот почему идеальной комбинацией ATT_MTU / длины пакета обычно является значение ATT_MTU 247 и длина пакета 251.
Что касается максимального значения ATT_MTU, я считаю, что оно не указано в спецификации Bluetooth и поэтому должно зависеть от чипа. В спецификации Bluetooth упоминается, что максимальная длина атрибута должна быть 512 (спецификация Bluetooth Core 5.2, том 3, часть F, раздел 3.2.9 Длинные значения атрибута):-
Максимальная длина значения атрибута должна составлять 512 октетов.
Следовательно, значение ATT_MTU, равное 515 или более, безусловно, сможет передавать наибольший атрибут, разрешенный спецификацией Bluetooth.
Вы также можете взглянуть на ссылки ниже для получения дополнительной информации:-