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 の有効化が必要です。