以nrf52830详细描述一下其跟手机的配对过程,要有代码有注释
时间: 2024-02-19 08:57:14 浏览: 173
nrf52830是一款蓝牙低功耗芯片,可以用于与手机进行配对和通信。其与手机的配对过程一般包括以下步骤:
1. 初始化蓝牙协议栈和GAP服务,设置设备名称和广播数据。
```c
void ble_stack_init(void)
{
ret_code_t err_code;
err_code = nrf_sdh_enable_request();
APP_ERROR_CHECK(err_code);
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &cfg);
APP_ERROR_CHECK(err_code);
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
ble_gap_conn_sec_mode_t sec_mode;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_GENERIC_TAG);
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_advertising.adv_handle, TX_POWER_LEVEL);
APP_ERROR_CHECK(err_code);
advertising_init();
}
```
2. 开始广播,等待手机扫描并连接。
```c
static void advertising_start(bool erase_bonds)
{
if (erase_bonds == true)
{
delete_bonds();
// Advertising is started by PM_EVT_PEERS_DELETED_SUCEEDED event.
}
else
{
ret_code_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
}
}
```
3. 手机扫描到广播数据后,发送连接请求,设备接收到连接请求后,开始协商连接参数。
```c
static void on_connect(ble_gap_evt_t const *p_gap_evt)
{
ret_code_t err_code = NRF_SUCCESS;
if (p_gap_evt->params.connected.role == BLE_GAP_ROLE_CENTRAL)
{
NRF_LOG_INFO("Connected with central.");
}
else if (p_gap_evt->params.connected.role == BLE_GAP_ROLE_PERIPH)
{
NRF_LOG_INFO("Connected with peripheral.");
}
err_code = nrf_ble_gatt_init(&m_gatt, NULL);
APP_ERROR_CHECK(err_code);
err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);
m_conn_handle = p_gap_evt->conn_handle;
}
```
4. 协商完成后,开始进行服务发现和特征读写等操作。
```c
static void on_ble_evt(ble_evt_t const *p_ble_evt, void *p_context)
{
ret_code_t err_code;
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_DISCONNECTED:
NRF_LOG_INFO("Disconnected.");
m_conn_handle = BLE_CONN_HANDLE_INVALID;
break;
case BLE_GAP_EVT_CONNECTED:
on_connect(&p_ble_evt->evt.gap_evt);
break;
case BLE_GAP_EVT_TIMEOUT:
if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT)
{
NRF_LOG_INFO("Advertising timed out.");
advertising_start(false);
}
break;
case BLE_GAP_EVT_PASSKEY_DISPLAY:
{
char passkey[BLE_GAP_PASSKEY_LEN + 1];
memcpy(passkey, p_ble_evt->evt.gap_evt.params.passkey_display.passkey, BLE_GAP_PASSKEY_LEN);
passkey[BLE_GAP_PASSKEY_LEN] = '\0';
NRF_LOG_INFO("Passkey: %s", passkey);
break;
}
case BLE_GAP_EVT_AUTH_KEY_REQUEST:
{
ble_gap_auth_key_t auth_key;
auth_key = (ble_gap_auth_key_t)BLE_GAP_AUTH_KEY_TYPE_PASSKEY;
err_code = sd_ble_gap_auth_key_reply(p_ble_evt->evt.gap_evt.conn_handle, auth_key, (const uint8_t *)m_passkey);
APP_ERROR_CHECK(err_code);
break;
}
case BLE_GATTS_EVT_WRITE:
on_write(&p_ble_evt->evt.gatts_evt);
break;
case BLE_GATTS_EVT_SYS_ATTR_MISSING:
err_code = sd_ble_gatts_sys_attr_set(p_ble_evt->evt.gatts_evt.conn_handle, NULL, 0, 0);
APP_ERROR_CHECK(err_code);
break;
case BLE_EVT_USER_MEM_REQUEST:
err_code = sd_ble_user_mem_reply(p_ble_evt->evt.gattc_evt.conn_handle, NULL);
APP_ERROR_CHECK(err_code);
break;
case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
err_code = sd_ble_gatts_exchange_mtu_reply(p_ble_evt->evt.gatts_evt.conn_handle, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);
break;
default:
break;
}
}
```
以上就是nrf52830与手机配对的基本流程。
阅读全文