这个章节简单介绍了在nRF51822芯片上使用S110 SoftDevice协议栈构建一个最小的BLE应用的过程。
有一些初始化函数通常在执行一个BLE应用之前调用,下面的表格中列出了这些初始化调用函数,在后面将对它们进行详细的介绍。
大部分采用数据结构的形式作为输入参数,这些数据结构包含一系列的配置和选项信息,阅读代码中的注释能更好地理解它们。
在广播开始之后,你就进入了main函数中的for循环。
为了使用独特的射频特性,你必须使能S110 SoftDevice协议栈。见《S110 nRF51822 SoftDevice Specification》(S110 nRF51822 SoftDevice协议栈说明书)中对硬件资源的详细需求。
用于广播的数据结构如下:
ble_gap.h 中 ble_gap_conn_sec_mode_t
ble_advdata.h 中 ble_advdata_t
err_code = sd_ble_gap_device_name_set(&device_name_sec_mode, DEVICE_NAME strlen(DEVICE_NAME)); err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_UNKNOWN); err_code = ble_advdata_set(&advdata); |
注意:传递给sd_ble_gap_device_name_set()的安全模式仅适于设备本身的名字。
广播参数(ble_gap_adv_params_t)必须通过sd_ble_gap_adv_start()来传递:
err_code = sd_ble_gap_adv_start(&m_adv_params); |
SDK提供了一个名为ble_conn_params的模块用于管理连接参数更新,它通过SoftDevice API进行处理,包括请求的时间和第一次请求被拒绝再发送一个新的请求。
在初始化结构体ble_conn_params_init_t中,定义了更新过程的有关参数,例如,是否开始连接,什么开始写入一个特定的CCCD,是否使用连接参数,发送更新请求的延时等等。
在初始化函数ble_conn_params_init()中,使用封装了初始化连接参数(ble_gap_conn_params_t)的结构体ble_conn_params_init_t作为输入参数进行连接参数初始化。
err_code = ble_conn_params_init(&cp_init); |
ble_conn_params SDK模块确保与主机(集中器)的连接参数相适应,如果不适应,外围设备将要求更改连接参数,超过设定的更新次数都没有更新成功后,它就会断开连接或者根据设置返回一个事件到应用层。
服务可以通过sd_ble_gatts_service_add()进行添加,最好不要在应用层代码中建立服务,而是在一个单独的文件中建立服务。一个服务不是主服务就是次服务,但是在通常实际的应用中大部分使用主服务。变量service_uuid就是你想用于服务的UUID。变量service_handle是一个输出变量,当创建一个服务的时候将会返回一个唯一的句柄值,这个句柄可以在以后用于识别不同的服务。
err_code = sd_ble_gatts_service_add( BLE_GATTS_SVC_TYPE_PRIMARY, &p_lbs->service_uuid, &p_lbs->service_handle ); |
特性可以通过sd_ble_gatts_characteristic_add()函数进行添加,它有4个参数。为了代码清晰,这个函数应该只能出现在服务文件中,而不能出现在应用层中。
第1个参数是特性要加入的服务的句柄,第2个参数是特性的结构体,它是一个全局变量,它包含了特性可能用到的性质(读,写,通知等)。第3个参数是值属性的描述,它包含了它的UUID,长度和初始值。第4个参数是返回的特性和描述符的唯一句柄,这个句柄可以在以后用于识别不同的特性。例如,在写事件中用于识别哪一个特性被写入。
err_code = sd_ble_gatts_characteristic_add( p_lbs->service_handle, &char_md, &attr_char_value, &p_lbs->led_char_handles); |