Nordic 常用的藍(lán)牙芯片有nRF52840,nRF52832。對(duì)應(yīng)芯片,廠家也提供了相關(guān)SDK
1. BLE Peripheral Init API
int main()
{
timers_init(); // app timer初始化,并創(chuàng)建timer
ble_stack_init(); // 使能協(xié)議棧
gap_params_init();
gatt_init();
advertising_init();
services_init();
conn_params_init();
peer_manager_init();
application_timers_start();
advertising_start(erase_bonds);
}
timers_init()
app_timer 初始化,并根據(jù)需求創(chuàng)建timer?!綬TC1】
ble_stack_Init()
使能藍(lán)牙協(xié)議棧
/**@brief Function for initializing the BLE stack.
*
* @details Initializes the SoftDevice and the BLE event interrupt.
*/
static void ble_stack_init(void)
{
ret_code_t err_code;
err_code = nrf_sdh_enable_request();
APP_ERROR_CHECK(err_code);
// Configure the BLE stack using the default settings.
// Fetch the start address of the application RAM.
uint32_t ram_start = 0;
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
APP_ERROR_CHECK(err_code);
// Enable BLE stack.
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
// Register a handler for BLE events.
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}
gap_params_init()
此為gap層初始化。gap層負(fù)責(zé)藍(lán)牙設(shè)備連接功能。
設(shè)置設(shè)備外觀(廣播數(shù)據(jù))、設(shè)置設(shè)備名稱(chēng)(廣播數(shù)據(jù))、設(shè)置連接參數(shù)。
/**@brief Function for the GAP initialization.
*
* @details This function sets up all the necessary GAP (Generic Access Profile) parameters of the
* device including the device name, appearance, and the preferred connection parameters.
*/
static void gap_params_init(void)
{
ret_code_t err_code;
ble_gap_conn_params_t gap_conn_params;
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_HEART_RATE_SENSOR_HEART_RATE_BELT);
APP_ERROR_CHECK(err_code);
memset(&gap_conn_params, 0, sizeof(gap_conn_params));
gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
gap_conn_params.slave_latency = SLAVE_LATENCY;
gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;
err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
APP_ERROR_CHECK(err_code);
}
gatt_init()
初始化 GATT。
/**@brief Function for initializing the GATT module. */
static void gatt_init(void)
{
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
APP_ERROR_CHECK(err_code);
}
advertising_init()
設(shè)置廣播間隔,廣播時(shí)間。
/**@brief Function for initializing the Advertising functionality.
*/
static void advertising_init(void)
{
ret_code_t err_code;
ble_advertising_init_t init;
memset(&init, 0, sizeof(init));
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
init.advdata.include_appearance = true;
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
init.advdata.uuids_complete.p_uuids = m_adv_uuids;
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
init.evt_handler = on_adv_evt;
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
services_init()
藍(lán)牙服務(wù)列表初始化。
conn_params_init()
peer_manager_init()
application_timers_start()
advertising_start()
2. 常見(jiàn)操作
2.1 修改設(shè)備名稱(chēng)
一般藍(lán)牙設(shè)備的名稱(chēng)是按照 “固定名稱(chēng) + 部分MAC地址” 的形式。
在SDK中,設(shè)備固定名稱(chēng)定義為宏DEVICE_NAME,后面加部分MAC地址,在gap_params_init()函數(shù)中實(shí)現(xiàn)。
2.2 廣播間隔
廣播間隔在SDK中,定義為APP_ADV_INTERVAL宏。廣播間隔值為:APP_ADV_INTERVAL * 0.625 ms。
The advertising interval (in units of 0.625 ms. 300 corresponds to 187.5 ms).
2.3 廣播時(shí)間
同廣播間隔一樣,廣播時(shí)間同樣定義了APP_ADV_DURATION宏。廣播時(shí)間值為:APP_ADV_DURATION * 10 ms。
The advertising duration 18000 (180 seconds) in units of 10 milliseconds.
2.4 連接間隔
連接間隔,可在代碼的宏定義中找到:MIN_CONN_INTERVAL、MAX_CONN_INTERVAL。
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(400, UNIT_1_25_MS) /**< Minimum acceptable connection interval (0.4 seconds). */
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(650, UNIT_1_25_MS) /**< Maximum acceptable connection interval (0.65 second). */
2.5 MTU設(shè)置
MTU的設(shè)置,可修改sdk_config.h文件中的 NRF_SDH_BLE_GATT_MAX_MTU_SIZE 宏的值來(lái)實(shí)現(xiàn)。Demo中MTU缺省值為247。應(yīng)用中的推薦設(shè)置:MTU為158,連接間隔為50ms。
2.6 增加服務(wù)
服務(wù)UUID設(shè)置?character UUID設(shè)置?characteristic 屬性設(shè)置?屬性實(shí)現(xiàn)?