要使S110 协议栈跑起来,首先要做的事就是协议栈使能,因为S110协议栈是基于事件触发的,所以在初始化的时候 要注册事件分发处理函数, 这个事件根发处理函数需要自己实现。具体的BLE初始化步骤如下:
2.gap_params_init();//GAP参数初始化
a.定义GAP连接参数,GAP连接安全模式参数
ble_gap_conn_params_t gap_conn_params;
ble_gap_conn_sec_mode_t sec_mode;
b.安全模式参数设置
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
c.设备名称设置
err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) DEVICE_NAME, strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
d.GAP连接参数设置
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);
3.services_init();//服务初始化
具体见《二、如何在nrf51822工程中添加一个service》
4.advertising_init();//广播初始化
a.定义广播参数变量,扫描响应变量;
ble_advdata_t advdata;
ble_advdata_t scanrsp;
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
b.定义并初始化一个广播uuid结构体变量;
ble_uuid_t adv_uuids[] = {0x5678, BLE_UUID_TYPE_BLE};
c.初始化设置广播参数;
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = true;
advdata.flags.size = sizeof(flags);
advdata.flags.p_data = &flags;
d.初始化设置扫描响应参数;
memset(&scanrsp, 0, sizeof(scanrsp));
scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
scanrsp.uuids_complete.p_uuids = adv_uuids;
e.广播参数设置
err_code = ble_advdata_set(&advdata, &scanrsp);
APP_ERROR_CHECK(err_code);
5.conn_params_init();//连接参数初始化
a.定义连接参数初始化结构体变量:
ble_conn_params_init_t cp_init;
b.初始化连接参数结构体变量:
memset(&cp_init, 0, sizeof(cp_init));
cp_init.p_conn_params = NULL;
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
cp_init.disconnect_on_fail = false;
cp_init.evt_handler = on_conn_params_evt;
cp_init.error_handler = conn_params_error_handler;
c.连接参数初始化设置:
err_code = ble_conn_params_init(&cp_init);
APP_ERROR_CHECK(err_code);
6.sec_params_init();//安全参数初始化
7.advertising_start();//启动广播
a.定义并初始化广播数据;
ble_gap_adv_params_t adv_params;
memset(&adv_params, 0, sizeof(adv_params));
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr = NULL;
adv_params.fp = BLE_GAP_ADV_FP_ANY;
adv_params.interval = APP_ADV_INTERVAL;
adv_params.timeout = APP_ADV_TIMEOUT_IN_SECONDS;
b.启动广播;
err_code = sd_ble_gap_adv_start(&adv_params);
APP_ERROR_CHECK(err_code);
8.实现 ble_evt_dispatch() 事件分发函数
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
ble_conn_params_on_ble_evt(p_ble_evt);
ble_nus_on_ble_evt(&m_nus, p_ble_evt);
on_ble_evt(p_ble_evt);
文章评论(0条评论)
登录后参与讨论