同城可以做别人一样的门户网站吗什么是跨境电商主要做什么
2026/4/18 7:28:35 网站建设 项目流程
同城可以做别人一样的门户网站吗,什么是跨境电商主要做什么,企业数字展厅设成都企业展厅设计公司,外包加工网是不是骗人的ESP32-S3添加修改蓝牙名称和获取蓝牙连接状态的AT命令 以下是基于现有代码添加 ATBLENAME、ATBLECONNPARAM、ATBLECONNCONNET? 三个AT命令的完整实现#xff0c;包含命令解析、参数验证、NVS持久化、蓝牙参数更新等核心逻辑#xff1a; 一、新增全局变量#xff08;添加到原…ESP32-S3添加修改蓝牙名称和获取蓝牙连接状态的AT命令以下是基于现有代码添加ATBLENAME、ATBLECONNPARAM、ATBLECONNCONNET?三个AT命令的完整实现包含命令解析、参数验证、NVS持久化、蓝牙参数更新等核心逻辑一、新增全局变量添加到原有全局变量区域// 全局变量 2026-1-13 staticconstchar*TAGTD-MIOT-STD-BLE_CONN_PARAM;// BLE 连接状态0断开1已连接uint8_tconn_connected0;// BLE 连接参数结构体存储当前连接参数typedefstruct{uint8_tconn_index;// 连接索引conn_iduint16_tmin_interval;// 最小连接间隔单位1.25msuint16_tmax_interval;// 最大连接间隔单位1.25msuint16_tcur_interval;// 当前连接间隔单位1.25msuint16_tlatency;// 从机延迟uint16_ttimeout;// 超时时间单位10ms}ble_conn_param_t;ble_conn_param_tg_ble_conn_param{0};// 新增蓝牙设备名称默认ESP-AT最大32字节staticcharble_device_name[33]ESP-AT;// 新增SYSSTORE状态1保存配置到NVS0不保存staticuint8_tsys_store_flag0;// 新增保存远端蓝牙地址用于更新连接参数staticesp_bd_addr_tg_remote_bda{0};// End of 2026-1-13 二、AT命令解析核心函数/** * brief AT命令解析函数 * param at_cmd 接收到的AT命令字符串 */staticvoidat_command_parse(char*at_cmd){char*cmdat_cmd;// 去除首尾空格、换行符、回车符while(*cmd ||*cmd\t||*cmd\r||*cmd\n)cmd;char*endcmdstrlen(cmd)-1;while(endcmd(*end ||*end\t||*end\r||*end\n))end--;*(end1)\0;// 1. 处理 ATBLENAME查询/设置蓝牙名称if(strncmp(cmd,ATBLENAME,10)0){// 查询命令ATBLENAME?if(strstr(cmd,?)!NULL){printf(BLENAME:%s\r\nOK\r\n,ble_device_name);}// 设置命令ATBLENAMEdevice_nameelseif(strstr(cmd,)!NULL){char*paramstrchr(cmd,)1;// 校验设备名长度最大32字节if(strlen(param)32){printf(ERROR\r\n);return;}// 复制新设备名strncpy(ble_device_name,param,32);ble_device_name[32]\0;// 若ATSYSSTORE1保存到NVSif(sys_store_flag){nvs_handle_tnvs_handle;esp_err_tretnvs_open(ble_config,NVS_READWRITE,nvs_handle);if(retESP_OK){retnvs_set_str(nvs_handle,ble_device_name,ble_device_name);if(ret!ESP_OK){ESP_LOGE(TAG,NVS save ble name failed: %s,esp_err_to_name(ret));}nvs_commit(nvs_handle);nvs_close(nvs_handle);}else{ESP_LOGE(TAG,NVS open failed: %s,esp_err_to_name(ret));}}// 更新广播数据中的设备名adv_data.include_nametrue;esp_ble_gap_config_adv_data(adv_data);printf(OK\r\n);}return;}// 2. 处理 ATBLECONNPARAM查询/更新连接参数if(strncmp(cmd,ATBLECONNPARAM,14)0){// 查询命令ATBLECONNPARAM?if(strstr(cmd,?)!NULL){printf(BLECONNPARAM:%d,%d,%d,%d,%d,%d,%d\r\nOK\r\n,g_ble_conn_param.conn_index,g_ble_conn_param.min_interval,g_ble_conn_param.max_interval,g_ble_conn_param.cur_interval,g_ble_conn_param.latency,g_ble_conn_param.timeout,conn_connected);}// 设置命令ATBLECONNPARAMconn_index,min_int,max_int,latency,timeout,conn_connectedelseif(strstr(cmd,)!NULL){char*paramstrchr(cmd,)1;// 解析参数uint8_tconn_index;uint16_tmin_interval,max_interval,latency,timeout;uint8_tconn_connected_set;intparsedsscanf(param,%hhu,%hu,%hu,%hu,%hu,%hhu,conn_index,min_interval,max_interval,latency,timeout,conn_connected_set);// 校验参数解析结果if(parsed!6){printf(BLECONNPARAM: %d,-1\r\n,conn_index);return;}// 校验参数范围if(conn_index2||// conn_index: [0,2]min_interval0x0006||min_interval0x0C80||// min_int: [7.5ms, 4000ms]max_interval0x0006||max_interval0x0C80||// max_int: [7.5ms, 4000ms]min_intervalmax_interval||// min ≤ maxlatency0x01F3||// latency: [0, 500]timeout0x000A||timeout0x0C80||// timeout: [100ms, 32000ms](conn_connected_set!0conn_connected_set!1)){// conn_connected: [0,1]printf(BLECONNPARAM: %d,-1\r\n,conn_index);return;}// 更新全局参数g_ble_conn_param.conn_indexconn_index;g_ble_conn_param.min_intervalmin_interval;g_ble_conn_param.max_intervalmax_interval;g_ble_conn_param.latencylatency;g_ble_conn_param.timeouttimeout;conn_connectedconn_connected_set;// 仅更新状态变量实际连接状态由蓝牙栈控制// 调用ESP32 API更新连接参数esp_ble_conn_update_params_tconn_params{0};memcpy(conn_params.bda,g_remote_bda,sizeof(esp_bd_addr_t));// 使用已保存的远端BD_ADDRconn_params.latencylatency;conn_params.max_intmax_interval;conn_params.min_intmin_interval;conn_params.timeouttimeout;esp_err_tretesp_ble_gap_update_conn_params(conn_params);if(ret!ESP_OK){printf(BLECONNPARAM: %d,-1\r\n,conn_index);ESP_LOGE(TAG,Update conn params failed: %s,esp_err_to_name(ret));return;}printf(OK\r\n);}return;}// 3. 处理 ATBLECONNCONNET?查询连接状态if(strcmp(cmd,ATBLECONNCONNET?)0){printf(BLECONNCONNET:%d\r\nOK\r\n,conn_connected);return;}// 4. 处理 ATSYSSTORE控制是否保存配置到NVSif(strncmp(cmd,ATSYSSTORE,10)0){if(strstr(cmd,)!NULL){char*paramstrchr(cmd,)1;sys_store_flagatoi(param);printf(OK\r\n);}return;}// 未知命令printf(ERROR\r\n);}/** * brief AT命令接收任务UART读取解析 * param param 任务参数UART端口号 */staticvoidat_cmd_task(void*param){constintuart_numECHO_UART_PORT_NUM;uint8_t*data(uint8_t*)malloc(256);// 足够容纳AT命令while(1){// 读取UART数据超时100ms避免阻塞intlenuart_read_bytes(uart_num,data,255,100/portTICK_PERIOD_MS);if(len0){data[len]\0;ESP_LOGI(TAG,AT Cmd received: %s,data);at_command_parse((char*)data);}vTaskDelay(10/portTICK_PERIOD_MS);// 降低CPU占用}free(data);vTaskDelete(NULL);}三、完善蓝牙连接事件保存远端BD_ADDR修改heart_gatts_profile_event_handler中的ESP_GATTS_CONNECT_EVT事件保存远端蓝牙地址caseESP_GATTS_CONNECT_EVT: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[HEART_PROFILE_APP_ID].conn_idparam-connect.conn_id;// 新增保存远端BD_ADDR用于后续更新连接参数memcpy(g_remote_bda,param-connect.remote_bda,sizeof(esp_bd_addr_t));// 更新连接状态和参数conn_connected1;g_ble_conn_param.conn_indexparam-connect.conn_id;break;四、完善连接参数更新回调修改gap_event_handler中的ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT事件更新当前连接参数caseESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:ESP_LOGI(GATTS_TAG,Connection params update, status %d, conn_int %d, latency %d, timeout %d,param-update_conn_params.status,param-update_conn_params.conn_int,param-update_conn_params.latency,param-update_conn_params.timeout);// 新增更新全局当前连接参数if(param-update_conn_params.statusESP_BT_STATUS_SUCCESS){g_ble_conn_param.cur_intervalparam-update_conn_params.conn_int;g_ble_conn_param.latencyparam-update_conn_params.latency;g_ble_conn_param.timeoutparam-update_conn_params.timeout;}break;五、初始化NVS和AT任务修改app_main函数voidapp_main(void){esp_err_tret;// 1. 初始化NVS用于保存蓝牙名称retnvs_flash_init();if(retESP_ERR_NVS_NO_FREE_PAGES||retESP_ERR_NVS_NEW_VERSION_FOUND){ESP_ERROR_CHECK(nvs_flash_erase());retnvs_flash_init();}ESP_ERROR_CHECK(ret);// 2. 从NVS加载蓝牙设备名称nvs_handle_tnvs_handle;retnvs_open(ble_config,NVS_READWRITE,nvs_handle);if(retESP_OK){size_tname_lensizeof(ble_device_name);retnvs_get_str(nvs_handle,ble_device_name,ble_device_name,name_len);if(ret!ESP_OK){strcpy(ble_device_name,ESP-AT);// 默认名称}nvs_close(nvs_handle);}else{ESP_LOGE(TAG,NVS open failed, use default device name);}// 3. 初始化蓝牙控制器ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));esp_bt_controller_config_tbt_cfgBT_CONTROLLER_INIT_CONFIG_DEFAULT();retesp_bt_controller_init(bt_cfg);if(ret){ESP_LOGE(TAG,Bluetooth controller init failed: %s,esp_err_to_name(ret));return;}retesp_bt_controller_enable(ESP_BT_MODE_BLE);if(ret){ESP_LOGE(TAG,Bluetooth controller enable failed: %s,esp_err_to_name(ret));return;}// 4. 初始化Bluedroid协议栈retesp_bluedroid_init();if(ret){ESP_LOGE(TAG,Bluedroid init failed: %s,esp_err_to_name(ret));return;}retesp_bluedroid_enable();if(ret){ESP_LOGE(TAG,Bluedroid enable failed: %s,esp_err_to_name(ret));return;}// 5. 注册GAP/GATTS回调ESP_ERROR_CHECK(esp_ble_gap_register_callback(gap_event_handler));ESP_ERROR_CHECK(esp_ble_gatts_register_callback(gatts_event_handler));// 6. 注册GATTS应用for(inti0;iPROFILE_NUM;i){ESP_ERROR_CHECK(esp_ble_gatts_app_register(i));}// 7. 初始化UARTAT命令透传uart_config_tuart_config{.baud_rateECHO_UART_BAUD_RATE,.data_bitsUART_DATA_8_BITS,.parityUART_PARITY_DISABLE,.stop_bitsUART_STOP_BITS_1,.flow_ctrlUART_HW_FLOWCTRL_DISABLE,.source_clkUART_SCLK_DEFAULT,};uart_init(uart_config);// 8. 创建AT命令处理任务xTaskCreate(at_cmd_task,at_cmd_task,4096,NULL,5,NULL);// 9. 创建心率任务xTaskCreate(heart_rate_task,heart_rate_task,4096,NULL,5,NULL);// 10. 初始化LEDled_init();ESP_LOGI(TAG,BLE AT command demo started, device name: %s,ble_device_name);}六、测试示例命令响应示例说明ATBLENAME?BLENAME:ESP-ATOK查询当前蓝牙名称ATBLENAMEMY_ESP_BLEOK设置蓝牙名称为MY_ESP_BLEATBLECONNPARAM?BLECONNPARAM:0,12,14,13,0,400,1OK查询连接参数已连接ATBLECONNPARAM0,12,14,1,500,1OK更新连接参数ATBLECONNCONNET?BLECONNCONNET:1OK查询连接状态已连接ATSYSSTORE1OK开启配置持久化到NVS关键注意事项远端BD_ADDR更新连接参数时必须传入远端蓝牙地址代码中已在连接事件中保存确保参数更新生效。NVS持久化需确保NVS初始化成功ble_config命名空间用于保存蓝牙名称。参数校验严格校验参数范围避免非法值导致蓝牙栈异常。UART冲突当前UART同时用于AT命令和BLE透传可通过添加「AT模式切换逻辑」如发送进入AT模式优化。广播更新设置蓝牙名称后重新配置广播数据使新名称生效。以上代码可直接整合到原有main.c中替换对应函数/变量区域即可实现所有AT命令需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询