以下是电池服务的示例。 电池服务是通知客户电池更换。 因此,该服务具有具有可读性和通知属性的电池电量特性。 客户端可以编写客户端特征配置描述符(CCCD)以启用通知。 然后电池服务将通知电池电量。
enum
{
BAS_IDX_SVC,
BAS_IDX_BATT_LVL_CHAR,
BAS_IDX_BATT_LVL_VAL,
BAS_IDX_BATT_LVL_NTF_CFG,
BAS_IDX_NB,
};
typedef enum
{
BASS_STATE_IDLE,
BASS_STATE_READY,
BASS_STATE_BUSY,
} ble_bass_state_t;
const struct attm_desc bas_att_db[BAS_IDX_NB] =
{
};
typedef struct
{
ble_bass_callback callback;
uint8_t state;
uint8_t cccd_enable;
uint8_t bas_lvl;
} ble_bass_env_t;
static ble_bass_env_t g_bass_env_t;
static ble_bass_env_t *ble_bass_get_env(void)
{
return &g_bass_env_t;
}
static uint8_t *ble_bass_get_cbk(uint8_t conn_idx, uint8_t idx, uint16_t *
len)
{
ble_bass_env_t *env = ble_bass_get_env();
switch (idx)
{
case BAS_IDX_BATT_LVL_VAL:
{
if (env->callback)
env->bas_lvl = env->callback(conn_idx, BLE_BASS_GET_BATTERY_LVL);
rt_kprintf("battery lvl %d", env->bas_lvl);
return &env->bas_lvl;
break;
}
default:
break;
}
return NULL;
}
{
ble_bass_env_t *env = ble_bass_get_env();
{
case BAS_IDX_BATT_LVL_NTF_CFG:
{
rt_kprintf(
"bas enable %d", *(para->
value));
env->cccd_enable = *(para->
value);
break;
}
default:
break;
}
return 0;
}
int8_t ble_bass_notify_battery_lvl(uint8_t conn_idx, uint8_t lvl)
{
ble_bass_env_t *env = ble_bass_get_env();
uint8_t ret = -1;
if (env->state == BASS_STATE_READY)
{
if (env->bas_lvl != lvl)
{
env->bas_lvl = lvl;
value.
idx = BAS_IDX_BATT_LVL_VAL;
value.
len =
sizeof(uint8_t);
value.
value = &env->bas_lvl;
ret = 0;
}
ret = -2;
}
return ret;
}
void ble_bass_init(ble_bass_callback callback, uint8_t battery_lvl)
{
ble_bass_env_t *env = ble_bass_get_env();
if (env->state == BASS_STATE_IDLE)
{
if (env->handle)
env->state = BASS_STATE_READY;
}
env->bas_lvl = battery_lvl;
env->callback = callback;
}