藍牙 BLE連接參數 連接間隔講解 connection interval Slave latency timeout CH573 CH582 CH579 peripheral通用外設例子講解四


// 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");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM