1. 程式人生 > 其它 >BLE廣播間隔和連線間隔(CH573)

BLE廣播間隔和連線間隔(CH573)

一、概念:

廣播間隔:BLE裝置每次廣播時,會在3個廣播通道上傳送相同的報文,這些報文被稱為一個廣播事件。兩個相鄰廣播事件之間的時間稱為廣播間隔。廣播間隔是針對從機裝置來說的,廣播間隔決定了從機裝置的廣播頻率。其實際廣播間隔時間為32~16448,單位是0.625ms,所以實際的連線間隔時間是32*0.625~16448*0.625ms。

連線間隔:BLE主機和BLE從機成功建立連線後,主機從機裝置之間的互動頻率(握手)。其實際連線間隔時間為6~3200,單位是1.25ms,所以實際的連線間隔時間是6*1.25~3200*1.25ms。

二、使用特點:

廣播間隔:減小廣播間隔可以使廣播頻率增高,建立連線的過程加快,同樣伴隨著功耗的上升;增大廣播間隔會是廣播頻率下降,建立連線的速度減慢,同時功耗下降。

連線間隔:長的時間間隔的優勢是顯著地節省功耗,因為裝置可以在連線事件之間有較長時間的休眠,壞處是當裝置有應用資料需要傳送時,必須要等到下一個連線事件;短的時間間隔優勢是兩裝置連線頻發,可以更快地收發資料,不利之處是裝置因連線事件的到來而被頻繁的喚醒,會有較多功耗。因此,在實際應用的時候,有時候需要傳送資料快一點,這個時候我們可以把連線間隔改小一點,這樣傳送資料快,但是功耗大,當把資料發完的時候,可把連線間隔改小一點,這樣可以降低功耗,達到一個均衡。

關於連線間隔還有一點需要注意:我們在處理BLE相關任務時,偶爾會遇到藍芽斷連的情況,有一個原因便是藍芽其本身的任務阻塞導致的斷連。藍芽在連線成功之後,其連線間隔是固定的,當有使用者程式的任務過來會導致其來不及處理自身的任務或是兩種任務發生衝突。這時候,可以適當的拉大連線間隔,給以使用者程式任務更多的處理時間,這樣便不會出現斷連的現象。針對上述情況,如果不想修改連線間隔,也可以將使用者任務進行拆分。總而言之,保證藍芽在固定時間內處理其自身任務不受影響即可。

三、相應程式碼:

廣播間隔:

// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)         
#define DEFAULT_ADVERTISING_INTERVAL         80
// Set advertising interval //設定廣播間隔 { uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; //
設定廣播間隔大小 GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt); //最小廣播間隔 GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt); //最大廣播間隔 }

連線間隔:

// 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
// Setup the GAP Peripheral Role Profile { uint8_t initial_advertising_enable = TRUE; //開啟廣播使能 uint16_t desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; //最小連線間隔 uint16_t desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; //最大連線間隔 // Set the GAP Role Parameters //設定GAP層引數 GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desired_min_interval); GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desired_max_interval); }

四、連線間隔協商(選讀)

主機和從機連線成功之後,絕大多數情況下,時間間隔是在我們所規定的範圍內。但是某些時候會出現實際連線間隔大於我們所規定的最大連線間隔,這是因為實際的連線間隔是主機和從機進行協商的一個結果,當某些主機不支援相應的速度,便會出現上述情況,這時候我們可以進行主動協商,通過程式碼實現主機和從機多次協商,以求達到我們所需要的連線間隔或是最小的連線間隔。

TMOS任務程式碼:

    if(events & START_PARAM_UPDATE_EVT)
    {
            // Send connect param update request
            printf("update=%x\n",GAPRole_PeripheralConnParamUpdateReq(hidEmuConnHandle,
                                                 DEFAULT_DESIRED_MIN_CONN_INTERVAL ,    //這裡的最小連線間隔和最大連線間隔可以設定為一樣的值
                                                 DEFAULT_DESIRED_MAX_CONN_INTERVAL,
                                                 DEFAULT_DESIRED_SLAVE_LATENCY,
                                                 DEFAULT_DESIRED_CONN_TIMEOUT,
                                                 hidEmuTaskId));
//            if(UpdateCBSuccess_flag  == 0){
//                tmos_start_task(hidEmuTaskId, START_PARAM_UPDATE_EVT, 800);
//                printf("start\n");
//            }else{
//                tmos_stop_task(hidEmuTaskId, START_PARAM_UPDATE_EVT);
//                printf("stop\n");
//            }
        return (events ^ START_PARAM_UPDATE_EVT);
    }

回撥函式程式碼:

static void hidDevParamUpdateCB(uint16_t connHandle, uint16_t connInterval,
                                uint16_t connSlaveLatency, uint16_t connTimeout)
{
    if(connInterval < 22)
    {
      UpdateCBSuccess_flag = 1;
      PRINT("Update hiddev.c %d - Int %d - Latency %d\n", connHandle, connInterval, connSlaveLatency);
      tmos_stop_task(hidEmuTaskId, START_PARAM_UPDATE_EVT);
    }
    else
    {
      UpdateCBSuccess_flag = 0;
      PRINT("Connute Update hiddev.c %d - Int %d - Latency %d\n", connHandle, connInterval, connSlaveLatency);
      tmos_start_task(hidEmuTaskId, START_PARAM_UPDATE_EVT, 1600);
    }
}

在進行協商時,相應的引數填寫儘量與第一次協商的值相接近。如,第一次連線間隔為159,那麼可以嘗試將最大間隔和最小設定為150、120、100等,慢慢進行嘗試,直到得出最終的協商值。

 

參考:https://baijiahao.baidu.com/s?id=1690204008664769649&wfr=spider&for=pc

http://www.wch.cn/bbs/thread-86278-1.html