广播数据动态更新

TF00 · 51次点击 · 7天前

在不调整app_adv.c 的情况下在外部增加状态来轮询检测当前adv state, 通过调用 appm_adv_start 和 appm_adv_stop 来实现广播更新。

广播状态迁移简略图

image.png

具体代码实现:

enum {
    APPM_ADV_UPDATE_STARTING = 1,
    APPM_ADV_UPDATE_UPDATING,
    APPM_ADV_UPDATE_FINISHED,
};

static uint32_t adv_update_state = APPM_ADV_UPDATE_FINISHED;
void appm_update_adv_pararm(uint8_t fast, uint32_t interval);

void adv_update_fsm(void)
{
    log_debug("adv state next: %u\n", adv_update_state);

    switch (adv_update_state)
    {
        case APPM_ADV_UPDATE_STARTING:
            /* 停止之前的广播并删除活动对象。 */
            appm_adv_stop(1);
            adv_update_state = APPM_ADV_UPDATE_UPDATING;
            log_debug("update stop adv\r\n");
            break;
        case APPM_ADV_UPDATE_UPDATING:
            /* 轮询等待广播停止 */
            if (appm_adv_get_state() == APP_ADV_STATE_IDLE) {
                /* 1. 更新广播需要调整的参数: 参考 appm_advertising_init 调整新的广播参数 */
                appm_update_adv_pararm(1, 0x200);
                /* 2. 重新启动广播 */
                appm_adv_start();
                adv_update_state = APPM_ADV_UPDATE_FINISHED;
                log_debug("update start adv\r\n");
            } else {
                log_debug("appm_adv_get_state: %u\r\n", appm_adv_get_state());
            }
            break;
        case APPM_ADV_UPDATE_FINISHED:
            break;
    }
}


被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站