转自:http://blog.csdn.net/xgbing
Battery Service是有关电池特性方面的服务,如果需要它,在初始化时将它加入到蓝牙协议栈。
如果通过ble_bas_battery_level_update(),电池电量将会通知,Battery Service将发送事件到应用程序。
(1)Battery Service事件类型
- /**@brief Battery Service event type. */
- typedef enum
- {
- BLE_BAS_EVT_NOTIFICATION_ENABLED, /**< Battery value notification enabled event. */
- BLE_BAS_EVT_NOTIFICATION_DISABLED /**< Battery value notification disabled event. */
- } ble_bas_evt_type_t;
- /**@brief Battery Service event. */
- typedef struct
- {
- ble_bas_evt_type_t evt_type; /**< Type of event. */
- } ble_bas_evt_t;
(2)Battery Service事件处理函数
- // Forward declaration of the ble_bas_t type.
- typedef struct ble_bas_s ble_bas_t;
- /**@brief Battery Service event handler type. */
- typedef void (*ble_bas_evt_handler_t) (ble_bas_t * p_bas, ble_bas_evt_t * p_evt);
(3)ble_bas_init_t:初始化用到的结构体
- /**@brief Battery Service init structure. This contains all options and data needed for
- * initialization of the service.*/
- typedef struct
- {
- ble_bas_evt_handler_t evt_handler; /**< Event handler to be called for handling events in the Battery Service. */
- bool support_notification; /**< TRUE if notification of Battery Level measurement is supported. */
- ble_srv_report_ref_t * p_report_ref; /**< If not NULL, a Report Reference descriptor with the specified value will be added to the Battery Level characteristic */
- uint8_t initial_batt_level; /**< Initial battery level */
- ble_srv_cccd_security_mode_t battery_level_char_attr_md; /**< Initial security level for battery characteristics attribute */
- ble_gap_conn_sec_mode_t battery_level_report_read_perm; /**< Initial security level for battery report read attribute */
- } ble_bas_init_t;
(4)包含可变状态信息的结构体ble_bas_t:
- /**@brief Battery Service structure. This contains various status information for the service. */
- typedef struct ble_bas_s
- {
- ble_bas_evt_handler_t evt_handler; /**< Event handler to be called for handling events in the Battery Service. */
- uint16_t service_handle; /**< Handle of Battery Service (as provided by the BLE stack). */
- ble_gatts_char_handles_t battery_level_handles; /**< Handles related to the Battery Level characteristic. */
- uint16_t report_ref_handle; /**< Handle of the Report Reference descriptor. */
- uint8_t battery_level_last; /**< Last Battery Level measurement passed to the Battery Service. */
- uint16_t conn_handle; /**< Handle of the current connection (as provided by the BLE stack, is BLE_CONN_HANDLE_INVALID if not in a connection). */
- bool is_notification_supported; /**< TRUE if notification of Battery Level is supported. */
- } ble_bas_t;
(5)几个函数说明:
- uint32_t ble_bas_init (ble_bas_t *p_bas, const ble_bas_init_t *p_bas_init) //服务初始化
- void ble_bas_on_ble_evt (ble_bas_t *p_bas, ble_evt_t *p_ble_evt) //处理协议栈事件的回调函数
- uint32_t ble_bas_battery_level_update (ble_bas_t *p_bas, uint8_t battery_level) //更新电池电量时调用
(6)初始化操作
- // Here the sec level for the Battery Service can be changed/increased.
- BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_char_attr_md.cccd_write_perm);
- BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_char_attr_md.read_perm);
- BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&bas_init.battery_level_char_attr_md.write_perm);
- BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_report_read_perm);
- bas_init.evt_handler = NULL;
- bas_init.support_notification = true;
- bas_init.p_report_ref = NULL;
- bas_init.initial_batt_level = 100;
- err_code = ble_bas_init(&bas, &bas_init);
- APP_ERROR_CHECK(err_code);