簡介
使用 BLE GATT 進行數據發(fā)送、接收時,ATT_MTU 這個參數值決定了用戶一次可以發(fā)送、接收的數據包的長度。通訊的雙方在連接成功后會發(fā)起 ATT_MTU 協(xié)商流程。流程結束后,ATT_MTU 的大小由雙方的較小值決定。
當 ATT_MTU 是一個較大的值、無法使用一個鏈路層數據包承載時,協(xié)議棧便會對其進行拆包發(fā)送處理。在實際應用中,由于通訊設備內存資源、時間資源的限制,ATT_MTU 的值會受到一定的限制,無法任意修改。
對于 BlueNRG-LP 來說,協(xié)議棧需要為較大的 ATT_MTU 預留足夠的 RAM 空間以緩存應用層的數據包,因此,ATT_MTU 的最大值被限定為 1024 字節(jié)左右(BLE_STACK_MAX_ATT_MTU)。而對于手機來說,較大的 ATT_MTU 可能會造成線程阻塞時間過長,因此也會對其最大值做一定的限制(未找到具體的規(guī)范文件)。
本文指導用戶如何在 BlueNRG SDK 上修改 ATT_MTU,以及如何考慮、評估修改ATT_MTU 后可能帶來的影響。
快速實踐
本章節(jié)快速進行一次修改 ATT_MTU 的實驗,并對實驗過程中遇到的問題做初步的講解。
小結
BlueNRG SDK 需要在編譯階段確定其需要的 RAM 空間。用戶改動 ATT_MTU 后,協(xié)議棧占用的 RAM 空間也將隨之改變。因此,在 RAM 空間足夠的情況下,我們可以給定ATT_MTU 一個較大值,這個值由以下宏確定:
#define MAX_ATT_MTU_CONF在和手機連接的大多數情況下,用戶只需要改變以上宏,即可成功修改 BLE 外設端的ATT_MTU。若不成功,則可從以下幾個方面進行逐一排查:
- 定義并實現以下接口,以便查看最終的 ATT_MTU 值:void aci_att_exchange_mtu_resp_event
- 若無以上接口的回調,則在連接成功后使用以下接口發(fā)起 ATT_MTU 交換流程:aci_gatt_clt_exchange_config
- 若 ATT_MTU 無法達到預期的、一個較大的值,比如 200,則使能 DLE 特性以擴展單個 LL 包的承載能力??赏ㄟ^配置以下宏使能 DLE 特性:# define CONTROLLER_DATA_LENGTH_EXTENSION_ENABLED