请给出conn_params_negotiation的使用实例
时间: 2024-02-12 15:05:23 浏览: 139
以下是使用 `conn_params_negotiation` 函数进行连接参数协商的示例代码:
```c
#include <stdint.h>
#include "nrf_ble_gatt.h"
#include "nrf_ble_qwr.h"
#include "app_util.h"
#include "app_error.h"
#include "ble_conn_params.h"
#include "ble_conn_state.h"
#include "ble_hci.h"
#include "ble_advdata.h"
#include "ble_advertising.h"
static ble_gap_conn_params_t m_conn_params; // 连接参数
// 事件处理程序,处理连接参数协商期间发生的事件
static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
{
if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
{
// 连接参数协商失败,重试
uint32_t err_code = sd_ble_gap_conn_param_update(p_evt->conn_handle, &m_conn_params);
APP_ERROR_CHECK(err_code);
}
else if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED)
{
// 连接参数协商成功,可以继续后续操作
// TODO: 连接参数已更新,可以进行后续操作
}
}
// 初始化连接参数并启动连接参数协商过程
static void conn_params_init(void)
{
memset(&m_conn_params, 0, sizeof(m_conn_params));
m_conn_params.min_conn_interval = MSEC_TO_UNITS(100, UNIT_1_25_MS);
m_conn_params.max_conn_interval = MSEC_TO_UNITS(200, UNIT_1_25_MS);
m_conn_params.slave_latency = 0;
m_conn_params.conn_sup_timeout = MSEC_TO_UNITS(4000, UNIT_10_MS);
uint32_t err_code = ble_conn_params_init(&m_conn_params);
APP_ERROR_CHECK(err_code);
err_code = ble_conn_params_change_conn_params(&m_conn_params);
APP_ERROR_CHECK(err_code);
}
// 发起连接参数协商请求
static void conn_params_negotiation_start(uint16_t conn_handle)
{
uint32_t err_code = ble_conn_params_change_conn_params(conn_handle, &m_conn_params);
APP_ERROR_CHECK(err_code);
}
// 例程主函数
int main(void)
{
// 初始化 BLE 栈
ble_stack_init();
// 初始化连接参数
conn_params_init();
// 注册连接参数事件处理程序
ble_conn_params_init_t cp_init = {0};
cp_init.p_conn_params = &m_conn_params;
cp_init.first_conn_params_update_delay = APP_TIMER_TICKS(5000);
cp_init.next_conn_params_update_delay = APP_TIMER_TICKS(30000);
cp_init.max_conn_params_update_count = 3;
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
cp_init.disconnect_on_fail = true;
cp_init.evt_handler = on_conn_params_evt;
uint32_t err_code = ble_conn_params_init(&cp_init);
APP_ERROR_CHECK(err_code);
// 启动广告
advertising_start();
// 进入主循环
while (true)
{
// 处理 BLE 事件
idle_state_handle();
}
}
```
在上述示例代码中,`conn_params_init` 函数用于初始化连接参数,并在 `ble_conn_params_init` 函数中启用连接参数协商。`conn_params_negotiation_start` 函数用于发起连接参数协商请求。`on_conn_params_evt` 函数是连接参数事件处理程序,用于处理连接参数协商期间发生的事件。在主函数中,先初始化 BLE 栈,然后初始化连接参数和连接参数事件处理程序,最后启动广告并进入主循环。在主循环中,处理 BLE 事件。
阅读全文