随着应用增加越来越多,功能越来越复杂,经常开蓝牙、关蓝牙的操作,会出现没有广播的异常情况,针对此情况,可以使用复位协议栈的方式,这里介绍复位协议栈的方式。 1)app.c文件函数做修改 void appm_reg_svc_itf(void) { static bool registered = false; if(registered) //只调用1次 return; struct prf_itf_pair itf_pair[] = { #if BLE_APP_SIMPLE_SERVER { TASK_ID_SIMPLE_SERVER, simple_server_prf_itf_get() }, #endif #if BLE_APP_WECHAT { TASK_ID_WECHAT, wechat_prf_itf_get() }, #endif // BLE_APP_WECHAT #if (BLE_APP_DIS) { TASK_ID_DISS, diss_prf_itf_get() }, #endif //(BLE_APP_DIS) #if (BLE_APP_BATT) { TASK_ID_BASS, bass_prf_itf_get() }, #endif //(BLE_APP_BATT) #if (BLE_APP_HID) { TASK_ID_HOGPD, hogpd_prf_itf_get() }, #endif //(BLE_APP_HID) #if (BLE_TSPP_SERVER) { TASK_ID_TSPPS, tspp_server_prf_itf_get() }, #endif //(BLE_TSPP_SERVER) #if (BLE_APP_ANCSC) { TASK_ID_ANCSC, ancsc_prf_itf_get() }, #endif //(BLE_APP_ANCSC) #if (BLE_APP_NORDIC_DFU) { TASK_ID_NORDIC_DFU, nordic_dfu_prf_itf_get() }, #endif //(BLE_APP_NORDIC_DFU) { TASK_ID_ONMICRO_DFU, onmicro_dfu_prf_itf_get() }, }; prf_itf_register(itf_pair, sizeof(itf_pair)/sizeof(itf_pair[0])); registered = true; } 2)定时测试复位协议栈 static void simple_timer_handler(co_timer_t *timer, void *param) { //sysdump(); appm_init(); log_debug("ble reset complete\n"); } 3)如果是增加了dfu的功能,在app_onmicro_dfu.c修改如下: void app_onmicro_dfu_add_service(void) { // struct onmicro_dfu_db_cfg* db_cfg; // struct prf_itf_pair itf_pair = { // TASK_ID_ONMICRO_DFU, onmicro_dfu_prf_itf_get(), // }; // prf_itf_register(&itf_pair, 1); // Allocate the CREATE_DB_REQ struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(GAPM_PROFILE_TASK_ADD_CMD, TASK_GAPM, TASK_APP, gapm_profile_task_add_cmd, 0); // Fill message req->operation = GAPM_PROFILE_TASK_ADD; req->sec_lvl = PERM(SVC_AUTH, NO_AUTH); req->prf_task_id = TASK_ID_ONMICRO_DFU; req->app_task = TASK_APP; req->start_hdl = 0; // Send the message ke_msg_send(req); } 按照此方式,可以让协议栈复位,蓝牙状态恢复到广播状态 |