// Minimum connection interval (units of 1.25ms, 6=7.5ms) #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 6 //最小連接間隔 // Maximum connection interval (units of 1.25ms, 100=125ms) #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 100 //最大連接間隔
// Slave latency to use parameter update
#define DEFAULT_DESIRED_SLAVE_LATENCY 0 //可忽略連接間隔的次數,默認是不忽略
// Supervision timeout value (units of 10ms, 100=1s)
#define DEFAULT_DESIRED_CONN_TIMEOUT 100 //連接超時時間,連接 IOS 時此參數必須小於 6S
1、連接間隔
DEFAULT_DESIRED_MIN_CONN_INTERVAL(最小連接間隔)和
DEFAULT_DESIRED_MAX_CONN_INTERVAL(最大連接間隔)
這個間隔 是指成功連接后 的周期性通訊時間,主機會根據使用情況 在 這個取值范圍內 選擇合適的 間隔時間,這個具體值是不可控的,所以需要划定一個范圍使得通訊響應在自己的可控范圍之內。這個具體值會影響到下一次通訊數據包的響應時間,需要根據自己的情況來調整這個范圍達到 既省電又匹配程序響應速度 的目的。
比如:
大數據傳遞時:通訊數據包是連續傳遞的,主機會選擇min值來進行通訊。
無數據傳遞時:通訊是空閑狀態,主機會選擇max值來定期詢問從機狀態,以保持連接不中斷。(在空閑時,由於使用max的值作為通訊周期,會影響到程序的下一個命令的發送時間)
( 連接間隔以1.25ms為單位;連接間隔的范圍是6~3200,即7.5ms~4s之間)
2.Slave Latency(從設備延遲或者從設備時延)
允許Slave(從設備)在沒有數據要發的情況下,跳過一定數目的連接事件,在這些連接事件中不必回復Master(主設備)的包,這樣就能更加省電(范圍可以是0~499)。
上圖,Slave Latency = OFF時,master發包,slave必須回復,如果不回復,Master就會認為slave那邊接收不正常。若Slave Latency = ON時, master 發包,slave允許有3個包不回復
注意:這個參數更重要的應用 :比如在距離遠或者干擾大的時候 無數據通信的時候。把這個值設大可以減少掉線概率。
比如防丟器:放在口袋里面假如這個參數設置為0 表示規定時間內必須響應從機,不然就以為是藍牙斷開了。假如設置為5。假如信號不好的時候,即使中間丟了4個,只接受了1個就表示連接了。因為他會跳過其中4個 ,保證了不掉線的概率
3.Supervision Timeout(超時時間或者監控超時)
這個參數設定了一個超時時間,如果BLE在這個時間內沒有發生通信的話,就會自動斷開(單位是10ms,范圍是10~3200即100ms~32s)。
連接間隔、從機時延以及超時時間這三者必須滿足如下公式:
Supervision Timeout >(1 +slaveLatency)*(connectionInterval)
注:slaveLatency不能算在 supervision Timeout的時間內,否則連接就會不正常斷開
這三個連接參數在不同情況下對通信速率和功耗的影響
1.Connection Interval縮短,Master和Slave通信更加頻繁,提高了數據吞吐速度,縮短了數據發送時間,但也提高了功耗。
2.Connection Interval加長,通信頻率降低,數據吞吐速度降低,數據發送等待的時間更長,但這種設置降低了功耗。
3.Slave Latency減少或者設置為0,那么每次連接事件中都需要回復Master的包,當然功耗會上升,但數據發送速度也會提高。
4.Slave Latency加長,功耗下降,數據發送速度降低。
參數協商 啟動協商任務
// Set timer for param update event tmos_start_task(Peripheral_TaskID, SBP_PARAM_UPDATE_EVT, SBP_PARAM_UPDATE_DELAY);
執行參數協商任務
if(events & SBP_PARAM_UPDATE_EVT) { // Send connect param update request GAPRole_PeripheralConnParamUpdateReq(peripheralConnList.connHandle, DEFAULT_DESIRED_MIN_CONN_INTERVAL, DEFAULT_DESIRED_MAX_CONN_INTERVAL, DEFAULT_DESIRED_SLAVE_LATENCY, DEFAULT_DESIRED_CONN_TIMEOUT, Peripheral_TaskID); return (events ^ SBP_PARAM_UPDATE_EVT); }
進回調函數,打印協調的參數結果
static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, uint16_t connSlaveLatency, uint16_t connTimeout) { if(connHandle == peripheralConnList.connHandle) { peripheralConnList.connInterval = connInterval; peripheralConnList.connSlaveLatency = connSlaveLatency; peripheralConnList.connTimeout = connTimeout; PRINT("Update %x - Int %x \n", connHandle, connInterval); } else { PRINT("ERR..\n"); } }