Bluetooth LE接続間隔の調整方法(NCS環境)

Bluetooth Low Energy(BLE)デバイス間で確立された接続において、「接続イベント」が発生する周期を「接続間隔(Connection Interval)」と呼びます。この値は、通信の遅延・消費電力・スループットに直接影響します。

接続イベントとは、主従デバイスが同期してデータ交換(または空パケット送信)を行う瞬間です。それ以外の時間は両端末が低消費電力モードに入ります。間隔が短いほど反応性が向上しますが、消費電力も増加します。逆に長いと省電力になりますが、遅延や再送待ち時間が長くなります。

接続間隔は1.25ms単位で指定され、例として値24は30ms(24 × 1.25)を意味します。また、監視タイムアウト(Supervision Timeout)は、応答がないまま接続を維持する最大時間です。潜伏許容数(Latency)は、スレーブ側が連続してイベントをスキップできる回数で、無通信時に消費電力を抑える仕組みです。

静的設定による接続間隔変更

prj.conf で以下の設定を追加することで、起動時の初期接続パラメータを固定できます:

CONFIG_BT_PERIPHERAL_PREF_MIN_INT=800
CONFIG_BT_PERIPHERAL_PREF_MAX_INT=800
CONFIG_BT_PERIPHERAL_PREF_LATENCY=0
CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400
CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=y

上記では、接続間隔を1000ms(800×1.25)、監視タイムアウトを4秒に設定しています。パラメータ更新要求のタイムアウトは CONFIG_BT_CONN_PARAM_UPDATE_TIMEOUT で調整可能です(デフォルト5秒)。

動的APIによる実行時変更

接続中にパラメータを変更するには、bt_conn_le_param_update() を使用します。以下は現在の接続情報を取得し、更新後にログ出力する例です:

static void log_current_params(struct bt_conn *conn) {
    struct bt_conn_info info;
    int err = bt_conn_get_info(conn, &info);
    if (err) {
        printk("Failed to get connection info: %d\n", err);
        return;
    }

    float interval_ms = info.le.interval * 1.25f;
    uint16_t timeout_ms = info.le.timeout * 10;
    printk("Current params: interval=%.2fms, latency=%u, timeout=%ums\n",
           interval_ms, info.le.latency, timeout_ms);
}

パラメータ更新後、コールバックで結果を受け取るには次のように定義します:

static void on_conn_params_updated(struct bt_conn *conn, uint16_t interval,
                                   uint16_t latency, uint16_t timeout) {
    float new_interval = interval * 1.25f;
    uint16_t new_timeout = timeout * 10;
    printk("Updated: interval=%.2fms, latency=%u, timeout=%ums\n",
           new_interval, latency, new_timeout);
}

BT_CONN_CB_DEFINE(conn_cbs) = {
    .le_param_updated = on_conn_params_updated,
};

static int request_new_params(struct bt_conn *active_conn) {
    struct bt_le_conn_param *new_params = BT_LE_CONN_PARAM(800, 800, 0, 400);
    int result = bt_conn_le_param_update(active_conn, new_params);
    if (result) {
        printk("Update failed: %d\n", result);
        return result;
    }
    printk("Parameter update requested.\n");
    return 0;
}

浮動小数点ログ出力には CONFIG_FPU=y の有効化が必要です。

タグ: nRF-Connect-SDK bluetooth-le ble-connection-parameters

7月8日 21:11 投稿