ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-添加 conn_connected 连接状态参数
以下是为代码添加conn_connected连接状态参数的完整修改方案,包含变量定义、状态更新和日志调试:
核心修改点
- 定义全局变量
conn_connected表示BLE连接状态(0=未连接/断开,1=已连接) - 在所有BLE连接事件中设置
conn_connected = 1 - 在所有BLE断开事件中设置
conn_connected = 0 - 增加日志输出,方便调试状态变化
修改后的代码(关键部分标注)
break;caseESP_GATTS_CONNECT_EVT:esp_ble_conn_update_params_tconn_params={0};memcpy(conn_params.bda,param->connect.remote_bda,sizeof(esp_bd_addr_t));conn_params.latency=0;conn_params.max_int=0x20;conn_params.min_int=0x10;conn_params.timeout=400;ESP_LOGI(GATTS_TAG,"Connected, conn_id %u, remote "ESP_BD_ADDR_STR"",param->connect.conn_id,ESP_BD_ADDR_HEX(param->connect.remote_bda));gl_profile_tab[AUTO_IO_PROFILE_APP_ID].conn_id=param->connect.conn_id;conn_connected=1;// 新增:标记BLE已连接ESP_LOGI(GATTS_TAG,"conn_connected updated to 1 (connected)");// 调试日志esp_ble_gap_update_conn_params(&conn_params);break;caseESP_GATTS_DISCONNECT_EVT:ESP_LOGI(GATTS_TAG,"Disconnected, remote "ESP_BD_ADDR_STR", reason 0x%02x",ESP_BD_ADDR_HEX(param->disconnect.remote_bda),param->disconnect.reason);conn_connected=0;// 新增:标记BLE断开连接ESP_LOGI(GATTS_TAG,"conn_connected updated to 0 (disconnected)");// 调试日志break;caseESP_GATTS_CONF_EVT:ESP_LOGI(GATTS_TAG,"Confirm receive, status %d, attr_handle %d",param->conf.status,param->conf.handle);if(param->conf.status!=ESP_GATT_OK){ESP_LOG_BUFFER_HEX(GATTS_TAG,param->conf.value,param->conf.len);}break;default:break;}}// ... 其他代码不变 ...// 主动启用 UART_RX 特征的通知(向 CCCD 写入 0x0001)// esp_ble_gatts_set_attr_value(param->add_char_descr.attr_handle, 2, (uint8_t *)&cccd_val);uint16_tg_uart_rx_descr_handle=0;uint8_tconn_connected=0;// 新增:全局BLE连接状态(0=未连接/断开,1=已连接)voidenable_uart_rx_notify(){// ... 函数内容不变 ...}// UART服务事件处理(核心修改部分)staticvoiduart_gatts_profile_event_handler(esp_gatts_cb_event_tevent,esp_gatt_if_tgatts_if,esp_ble_gatts_cb_param_t*param){esp_err_tret;staticbool is_uart_tx_char_added=false;// 标记TX特征是否已添加switch(event){// ... 其他事件处理不变 ...caseESP_GATTS_CONNECT_EVT:ESP_LOGI(GATTS_TAG,"UART BLE profile connected, conn_id: %d",param->connect.conn_id);gl_profile_tab[UART_PROFILE_APP_ID].conn_id=param->connect.conn_id;conn_connected=1;// 新增:标记BLE已连接(UART profile连接事件)ESP_LOGI(GATTS_TAG,"conn_connected updated to 1 (UART profile connected)");// 调试日志break;caseESP_GATTS_DISCONNECT_EVT:ESP_LOGI(GATTS_TAG,"UART BLE profile disconnected");gl_profile_tab[UART_PROFILE_APP_ID].conn_id=0;uart_notify_enabled=false;// 断开连接后禁用通知conn_connected=0;// 新增:标记BLE断开连接(UART profile断开事件)ESP_LOGI(GATTS_TAG,"conn_connected updated to 0 (UART profile disconnected)");// 调试日志// 重启广播esp_ble_gap_start_advertising(&adv_params);break;// ... 其他事件处理不变 ...}}// ... 剩余代码不变 ...关键说明
- 变量作用域:
conn_connected定义为全局变量,可在整个main.c中访问(如需在其他文件使用,可添加extern uint8_t conn_connected;声明)。 - 状态同步:
- 同时处理了
AUTO_IO_PROFILE和UART_PROFILE两个profile的连接/断开事件,确保无论哪个profile触发连接/断开,状态都能正确更新。 - 连接事件(
ESP_GATTS_CONNECT_EVT)触发时设为1,断开事件(ESP_GATTS_DISCONNECT_EVT)触发时设为0。
- 同时处理了
- 调试日志:新增的日志可在串口输出中清晰看到状态变化,调试完成后可根据需要删除。
- 初始值:默认值为
0,表示上电后未连接状态,符合业务逻辑。
使用示例
可在任意位置读取该状态,例如:
// 示例:检查BLE连接状态并执行对应逻辑voidcheck_ble_connection_status(){if(conn_connected==1){ESP_LOGI(GATTS_TAG,"当前BLE已连接,可发送数据");// 执行已连接时的逻辑(如发送通知、透传数据等)}else{ESP_LOGI(GATTS_TAG,"当前BLE未连接,暂停数据发送");// 执行未连接时的逻辑(如缓存数据、等待连接等)}}该修改确保conn_connected能实时反映BLE的实际连接状态,且兼容现有代码逻辑。