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