在不调整app_adv.c 的情况下在外部增加状态来轮询检测当前adv state, 通过调用 appm_adv_start 和 appm_adv_stop 来实现广播更新。 具体代码实现: 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; } } |