芯片: NRF52832
Nordic SDK 8.16.0 ,蓝牙协议栈: s132
代码参考 青风电子 蓝牙LED读写服务。
这里采用的是观察者模式的一个形式,既我们应用端所操作的每一件事情,协议栈都会上抛一个事件,每一个观察者都会接受到这样的一个事件,在决定是否需要执行相应的操作,以蓝牙点灯为例。
通过 ble_lbs_init()
和 led_char_add(p_lbs,p_lbs_init)
两个函数来完成这整一个LED灯服务的添加。
在ble_lbs_init()
中调用 sd_ble_gatts_service_add()
函数来添加主服务,所添加的服务可以在手机 APP Nordic Connect 中看到。
在led_char_add(p_lbs,p_lbs_init)
中调用 sd_ble_gatts_characteristic_add()
来添加一个灯的读写特性。然后在上面的ble_lbs_init()
中在进行调用。在 手机 APP Nordic Connect 中为主服务的 下拉选项。
一个服务可以包含几个特性。
在主函数中,通过BLE_LBS_DEF(_name)
声明一个观察者。具体的定义是在 ble_lbs.h 中完成。
#define BLE_LBS_DEF(_name)
static ble_lbs_t name; \
NRF_SDH_BLE_OBSERVER(_name ## obs, BLE_LBS_BLE_OBSERVER_PRIO, \
ble_lbs_on_ble_evt, &_name)
由此也就是调用了 NRF_SDH_BLE_OBSERVER()
来完成了这整一个操作。其中ble_lbs_on_ble_evt
也是事件派发函数。
在蓝牙点灯中,会通过 BLE_LBS_DEF(m_bls)
来声明一个 m_lbs的观察者,当LED的特性被写入时,会产生一个GATT写事件。这时候就会回调上面 的事件派发函数 ble_lbs_on_ble_evt
()
。
ble_lbs_on_ble_evt(ble_evt_t const *p_ble_evt, void *p_context )