/* 用户自定义服务的类型 */ typedef enum { BLE_MODE_TYPE_SLAVE = 0, /* 从机模式 */ BLE_MODE_TYPE_MULTI = 1 /* 主从一体模式 */ } E_BLE_MODE_TYPE; /* 连接参数档位枚举 */ typedef enum { BLE_CONN_SPEED_SLOW = 0, /* 慢速模式 */ BLE_CONN_SPEED_MEDIUM, /* 中速模式 */ BLE_CONN_SPEED_FAST /* 快速模式 */ } E_BLE_CONN_SPEED_MODE; /* 用户自定义服务的类型 */ typedef enum { BLE_UUID_TYPE_16BIT = 1, /* 16-bit UUID */ BLE_UUID_TYPE_128BIT = 2 /* 128-bit UUID */ } E_BLE_UUID_TYPE; /*蓝牙管理配置数据结构定义*/ typedef struct { int SeqNumber; /* 序号:[1,65535]:从1开始:::true:false:*/ E_BLE_MODE_TYPE master_slave_select; /*蓝牙工作模式选择::::BLE_MODE_TYPE_SLAVE:false:true*/ bool_t device_info_uuid_enable; /*设备信息服务使能::::false:true:true*/ bool_t ut_spp_uuid_enable; /*对端设备是否带有公司spp服务::::false:true:true*/ s8 power; /*设备发射功率:[-20,7]::dbm:BLE_TX_POWER_MAX:false:true*/发射功率参考上述枚举模板定义一个枚举为高中低

时间: 2025-07-04 10:03:59 AIGC 浏览: 20
为了定义蓝牙设备的发射功率为高中低三个档位,我们可以创建一个枚举类型 `E_BLE_TX_POWER_LEVEL`。该枚举将代表不同的功率级别,并且可以映射到实际的发射功率值(例如:低功率为 -20 dBm,中功率为 0 dBm,高功率为 +7 dBm)。 ### 定义枚举 ```c /* 发射功率级别枚举 */ typedef enum { BLE_TX_POWER_LOW = -20, /* 低功率: -20 dBm */ BLE_TX_POWER_MEDIUM = 0, /* 中功率: 0 dBm */ BLE_TX_POWER_HIGH = 7 /* 高功率: +7 dBm */ } E_BLE_TX_POWER_LEVEL; ``` ### 在结构体中使用该枚举 接下来我们更新你的蓝牙管理配置结构体,在其中使用这个新定义的枚举: ```c /*蓝牙管理配置数据结构定义*/ typedef struct { int SeqNumber; /* 序号:[1,65535]:从1开始:::true:false:*/ E_BLE_MODE_TYPE master_slave_select; /*蓝牙工作模式选择::::BLE_MODE_TYPE_SLAVE:false:true*/ bool_t device_info_uuid_enable; /*设备信息服务使能::::false:true:true*/ bool_t ut_spp_uuid_enable; /*对端设备是否带有公司spp服务::::false:true:true*/ E_BLE_TX_POWER_LEVEL tx_power_level; /* 设备发射功率级别::::BLE_TX_POWER_MEDIUM:false:true */ } S_BLE_CONFIG; ``` ### 使用示例 下面是一个使用示例,展示如何设置和使用这个结构体: ```c #include <stdio.h> #include <stdbool.h> typedef enum { BLE_MODE_TYPE_SLAVE = 0, /* 从机模式 */ BLE_MODE_TYPE_MULTI = 1 /* 主从一体模式 */ } E_BLE_MODE_TYPE; typedef enum { BLE_TX_POWER_LOW = -20, /* 低功率: -20 dBm */ BLE_TX_POWER_MEDIUM = 0, /* 中功率: 0 dBm */ BLE_TX_POWER_HIGH = 7 /* 高功率: +7 dBm */ } E_BLE_TX_POWER_LEVEL; typedef int bool_t; #define TRUE 1 #define FALSE 0 /*蓝牙管理配置数据结构定义*/ typedef struct { int SeqNumber; /* 序号:[1,65535]:从1开始:::true:false:*/ E_BLE_MODE_TYPE master_slave_select; /*蓝牙工作模式选择::::BLE_MODE_TYPE_SLAVE:false:true*/ bool_t device_info_uuid_enable; /*设备信息服务使能::::false:true:true*/ bool_t ut_spp_uuid_enable; /*对端设备是否带有公司spp服务::::false:true:true*/ E_BLE_TX_POWER_LEVEL tx_power_level; /* 设备发射功率级别::::BLE_TX_POWER_MEDIUM:false:true */ } S_BLE_CONFIG; int main() { S_BLE_CONFIG ble_config = { .SeqNumber = 123, .master_slave_select = BLE_MODE_TYPE_SLAVE, .device_info_uuid_enable = TRUE, .ut_spp_uuid_enable = FALSE, .tx_power_level = BLE_TX_POWER_HIGH }; printf("Sequence Number: %d\n", ble_config.SeqNumber); printf("Mode: %s\n", (ble_config.master_slave_select == BLE_MODE_TYPE_SLAVE) ? "Slave" : "Multi"); printf("Device Info UUID Enabled: %s\n", ble_config.device_info_uuid_enable ? "Yes" : "No"); printf("SPP UUID Enabled: %s\n", ble_config.ut_spp_uuid_enable ? "Yes" : "No"); printf("Transmit Power Level: %d dBm\n", ble_config.tx_power_level); return 0; } ``` ### 解释 - **E_BLE_TX_POWER_LEVEL** 是一个枚举类型,用于表示蓝牙设备的发射功率级别。 - 枚举中的每个值对应一个具体的发射功率(dBm),分别是 `-20`、`0` 和 `+7`。 - 在结构体 `S_BLE_CONFIG` 中添加了 `tx_power_level` 字段,使得配置信息更加清晰直观。 - 示例程序演示了如何初始化结构体并访问其成员变量,包括打印当前配置。 ---
阅读全文

相关推荐

/*! \file main.c \brief Implementation of ble datatrans server demo. \version 2023-07-20, V1.0.0, firmware for GD32VW55x */ /* Copyright (c) 2023, GigaDevice Semiconductor Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdint.h> #include "dbg_print.h" #include "gd32vw55x_platform.h" #include "wrapper_os.h" #include "ble_adapter.h" #include "ble_adv.h" #include "ble_conn.h" #include "ble_utils.h" #include "ble_export.h" #include "ble_sec.h" #include "ble_datatrans_srv.h" #include "app_uart.h" /* Device name */ #define DEV_NAME "GD-BLE-DEV" /* Device name length*/ #define DEV_NAME_LEN strlen(dev_name) /* Advertising parameters */ typedef struct { uint8_t adv_idx; /*!< Advertising id. use to stop advertising */ ble_adv_state_t adv_state; /*!< Advertising state */ } app_adv_param_t; /* Definitions of the different task priorities */ enum { BLE_STACK_TASK_PRIORITY = OS_TASK_PRIORITY(2), /*!< Priority of the BLE stack task */ BLE_APP_TASK_PRIORITY = OS_TASK_PRIORITY(1), /*!< Priority of the BLE APP task */ }; /* Definitions of the different BLE task stack size requirements */ enum { BLE_STACK_TASK_STACK_SIZE = 768, /*!< BLE stack task stack size */ BLE_APP_TASK_STACK_SIZE = 512, /*!< BLE APP task stack size */ }; /* Device name array*/ char dev_name[] = {DEV_NAME}; /* advertising env*/ app_adv_param_t app_adv_env = {0}; /* connection index */ uint8_t conn_idx = 0; /*! \brief Start advertising \param[in] p_adv: pointer to BLE advertising set \param[out] none \retval none */ static ble_status_t app_adv_start(void) { ble_data_t adv_data = {0}; ble_data_t adv_scanrsp_data = {0}; ble_adv_data_set_t adv = {0}; ble_adv_data_set_t scan_rsp = {0}; uint8_t data[BLE_GAP_LEGACY_ADV_MAX_LEN] = {0}; uint8_t idx = 0; data[idx++] = 2; data[idx++] = BLE_AD_TYPE_FLAGS; data[idx++] = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED | BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE; data[idx++] = DEV_NAME_LEN + 1; data[idx++] = 0x09; memcpy(&data[idx], dev_name, DEV_NAME_LEN); idx += DEV_NAME_LEN; adv_data.len = idx; adv_data.p_data = data; adv_scanrsp_data.len = idx - 3; adv_scanrsp_data.p_data = &data[3]; adv.data_force = true; adv.data.p_data_force = &adv_data; scan_rsp.data_force = true; scan_rsp.data.p_data_force = &adv_scanrsp_data; return ble_adv_start(app_adv_env.adv_idx, &adv, &scan_rsp, NULL); } /*! \brief Callback function to handle BLE advertising events \param[in] adv_evt: BLE advertising event type \param[in] p_data: pointer to BLE advertising event data \param[in] p_context: context data used when create advertising \param[out] none \retval none */ static void app_adv_mgr_evt_hdlr(ble_adv_evt_t adv_evt, void *p_data, void *p_context) { if (adv_evt == BLE_ADV_EVT_STATE_CHG) { ble_adv_state_chg_t *p_chg = (ble_adv_state_chg_t *)p_data; ble_adv_state_t old_state = app_adv_env.adv_state; app_print("%s state change 0x%x ==> 0x%x, reason 0x%x\r\n", __func__, old_state, p_chg->state, p_chg->reason); app_adv_env.adv_state = p_chg->state; if ((p_chg->state == BLE_ADV_STATE_CREATE) && (old_state == BLE_ADV_STATE_CREATING)) { app_adv_env.adv_idx = p_chg->adv_idx; app_adv_start(); } } } /*! \brief Create an advertising \param[in] p_param: pointer to advertising parameters \param[out] none \retval ble_status_t: BLE_ERR_NO_ERROR on success, otherwise an error code */ static ble_status_t app_adv_create(void) { ble_adv_param_t adv_param = {0}; adv_param.param.disc_mode = BLE_GAP_ADV_MODE_GEN_DISC; adv_param.param.own_addr_type = BLE_GAP_LOCAL_ADDR_STATIC; adv_param.param.type = BLE_GAP_ADV_TYPE_LEGACY; adv_param.param.prop = BLE_GAP_ADV_PROP_UNDIR_CONN; adv_param.param.filter_pol = BLE_GAP_ADV_ALLOW_SCAN_ANY_CON_ANY; adv_param.param.ch_map = 0x07; adv_param.param.primary_phy = BLE_GAP_PHY_1MBPS; adv_param.param.adv_intv_min = 160; adv_param.param.adv_intv_max = 160; adv_param.restart_after_disconn = true; return ble_adv_create(&adv_param, app_adv_mgr_evt_hdlr, NULL); } /*! \brief Function to execute app code after stack ready \param[in] none \param[out] none \retval none */ void ble_task_ready(void) { app_adv_create(); } /*! \brief Callback function to handle BLE adapter events \param[in] event: BLE adapter event type \param[in] p_data: pointer to BLE adapter event data \param[out] none \retval none */ static void app_adp_evt_handler(ble_adp_evt_t event, ble_adp_data_u *p_data) { uint8_t i = 0; if (event == BLE_ADP_EVT_ENABLE_CMPL_INFO) { if (p_data->adapter_info.status == BLE_ERR_NO_ERROR) { app_print("=== Adapter enable success ===\r\n"); app_print("hci_ver 0x%x, hci_subver 0x%x, lmp_ver 0x%x, lmp_subver 0x%x, manuf_name 0x%x\r\n", p_data->adapter_info.version.hci_ver, p_data->adapter_info.version.hci_subver, p_data->adapter_info.version.lmp_ver, p_data->adapter_info.version.lmp_subver, p_data->adapter_info.version.manuf_name); app_print("adv_set_num %u, min_tx_pwr %d, max_tx_pwr %d, max_adv_data_len %d \r\n", p_data->adapter_info.adv_set_num, p_data->adapter_info.tx_pwr_range.min_tx_pwr, p_data->adapter_info.tx_pwr_range.max_tx_pwr, p_data->adapter_info.max_adv_data_len); app_print("sugg_max_tx_octets %u, sugg_max_tx_time %u \r\n", p_data->adapter_info.sugg_dft_data.sugg_max_tx_octets, p_data->adapter_info.sugg_dft_data.sugg_max_tx_time); app_print("loc irk:"); for (i = 0; i < BLE_GAP_KEY_LEN; i++) { app_print(" %02x", p_data->adapter_info.loc_irk_info.irk[i]); } app_print("\r\n"); app_print("identity addr %02X:%02X:%02X:%02X:%02X:%02X \r\n ", p_data->adapter_info.loc_irk_info.identity.addr[5], p_data->adapter_info.loc_irk_info.identity.addr[4], p_data->adapter_info.loc_irk_info.identity.addr[3], p_data->adapter_info.loc_irk_info.identity.addr[2], p_data->adapter_info.loc_irk_info.identity.addr[1], p_data->adapter_info.loc_irk_info.identity.addr[0]); app_print("=== BLE Adapter enable complete ===\r\n"); ble_task_ready(); } else { app_print("=== BLE Adapter enable fail ===\r\n"); } } } /*! \brief Init adapter application module \param[in] none \param[out] none \retval none */ void app_adapter_init(void) { ble_adp_callback_register(app_adp_evt_handler); } /*! \brief Send security request \param[in] conidx: connection index \param[out] none \retval none */ void app_sec_send_security_req(uint8_t conidx) { uint8_t auth = BLE_GAP_AUTH_REQ_NO_MITM_NO_BOND; if (ble_sec_security_req(conidx, auth) != BLE_ERR_NO_ERROR) { app_print("app_sec_send_security_req fail! \r\n"); } } /*! \brief Callback function to handle BLE connection event \param[in] event: BLE connection event type \param[in] p_data: pointer to BLE connection event data \param[out] none \retval none */ static void app_conn_evt_handler(ble_conn_evt_t event, ble_conn_data_u *p_data) { switch (event) { case BLE_CONN_EVT_STATE_CHG: { if (p_data->conn_state.state == BLE_CONN_STATE_DISCONNECTD) { app_print("disconnected. conn idx: %u, conn_hdl: 0x%x reason 0x%x\r\n", p_data->conn_state.info.discon_info.conn_idx, p_data->conn_state.info.discon_info.conn_hdl, p_data->conn_state.info.discon_info.reason); } else if (p_data->conn_state.state == BLE_CONN_STATE_CONNECTED) { app_print("connect success. conn idx:%u, conn_hdl:0x%x \r\n", p_data->conn_state.info.conn_info.conn_idx, p_data->conn_state.info.conn_info.conn_hdl); if (p_data->conn_state.info.conn_info.role == BLE_SLAVE) { app_sec_send_security_req(p_data->conn_state.info.conn_info.conn_idx); } conn_idx = p_data->conn_state.info.conn_info.conn_idx; } } break; case BLE_CONN_EVT_PARAM_UPDATE_IND: { app_print("conn idx %u, intv_min 0x%x, intv_max 0x%x, latency %u, supv_tout %u\r\n", p_data->conn_param_req_ind.conn_idx, p_data->conn_param_req_ind.intv_min, p_data->conn_param_req_ind.intv_max, p_data->conn_param_req_ind.latency, p_data->conn_param_req_ind.supv_tout); ble_conn_param_update_cfm(p_data->conn_param_req_ind.conn_idx, true, 2, 4); } break; case BLE_CONN_EVT_PARAM_UPDATE_RSP: { app_print("conn idx %u, param update result status: 0x%x\r\n", p_data->conn_param_rsp.conn_idx, p_data->conn_param_rsp.status); } break; case BLE_CONN_EVT_PARAM_UPDATE_INFO: { app_print("conn idx %u, param update ind: interval %d, latency %d, sup to %d\r\n", p_data->conn_params.conn_idx, p_data->conn_params.interval, p_data->conn_params.latency, p_data->conn_params.supv_tout); } break; case BLE_CONN_EVT_PKT_SIZE_SET_RSP: { app_print("conn idx %u, packet size set status 0x%x\r\n", p_data->pkt_size_set_rsp.conn_idx, p_data->pkt_size_set_rsp.status); } break; case BLE_CONN_EVT_PKT_SIZE_INFO: { app_print("le pkt size info: conn idx %u, tx oct %d, tx time %d, rx oct %d, rx time %d\r\n", p_data->pkt_size_info.conn_idx, p_data->pkt_size_info.max_tx_octets, p_data->pkt_size_info.max_tx_time, p_data->pkt_size_info.max_rx_octets, p_data->pkt_size_info.max_rx_time); } break; case BLE_CONN_EVT_NAME_GET_IND: { ble_conn_name_get_cfm(p_data->name_get_ind.conn_idx, 0, p_data->name_get_ind.token, DEV_NAME_LEN, (uint8_t *)dev_name, DEV_NAME_LEN); } break; case BLE_CONN_EVT_APPEARANCE_GET_IND: { ble_conn_appearance_get_cfm(p_data->appearance_get_ind.conn_idx, 0, p_data->appearance_get_ind.token, 0); } break; default: break; } } /*! \brief Callback function to handle @ref BLE_SEC_EVT_PAIRING_REQ_IND event \param[in] p_ind: pointer to the pairing request indication data \param[out] none \retval none */ static void app_pairing_req_hdlr(ble_gap_pairing_req_ind_t *p_ind) { ble_gap_pairing_param_t param = {0}; param.auth = BLE_GAP_AUTH_MASK_NONE; param.iocap = BLE_GAP_IO_CAP_NO_IO; param.key_size = 16; param.ikey_dist = BLE_GAP_KDIST_IDKEY | BLE_GAP_KDIST_SIGNKEY | BLE_GAP_KDIST_ENCKEY; param.rkey_dist = BLE_GAP_KDIST_IDKEY | BLE_GAP_KDIST_SIGNKEY | BLE_GAP_KDIST_ENCKEY; ble_sec_pairing_req_cfm(p_ind->conn_idx, true, ¶m, BLE_GAP_NO_SEC); } /*! \brief Callback function to handle @ref BLE_SEC_EVT_PAIRING_FAIL_INFO event \param[in] p_info: pointer to the pairing fail information data \param[out] none \retval none */ static void app_pairing_fail_hdlr(ble_sec_pairing_fail_t *p_info) { app_print("pairing fail reason 0x%x\r\n", p_info->param.reason); } /*! \brief Callback function to handle @ref BLE_SEC_EVT_PAIRING_SUCCESS_INFO event \param[in] p_info: pointer to the pairing success information data \param[out] none \retval none */ static void app_pairing_success_hdlr(ble_sec_pairing_success_t *p_info) { app_print("conn_idx %u pairing success, level 0x%x ltk_present %d sc %d\r\n", p_info->conidx, p_info->bond_info.pairing_lvl, p_info->bond_info.enc_key_present, p_info->sc); } /*! \brief Callback function to handle BLE security events \param[in] event: BLE security event type \param[in] p_data: pointer to the BLE security event data \param[out] none \retval none */ static void app_sec_evt_handler(ble_sec_evt_t event, ble_sec_data_u *p_data) { switch (event) { case BLE_SEC_EVT_PAIRING_REQ_IND: app_pairing_req_hdlr((ble_gap_pairing_req_ind_t *)p_data); break; case BLE_SEC_EVT_PAIRING_SUCCESS_INFO: app_pairing_success_hdlr((ble_sec_pairing_success_t *)p_data); break; case BLE_SEC_EVT_PAIRING_FAIL_INFO: app_pairing_fail_hdlr((ble_sec_pairing_fail_t *)p_data); break; default: break; } } /*! \brief Callback function to handle data received by datatrans server service \param[in] data_len: received data length \param[in] p_data: pointer to received data \param[out] none \retval none */ void app_datatrans_srv_rx_callback(uint16_t data_len, uint8_t *p_data) { uint8_t *p_str = sys_malloc(data_len + 1); if (p_str) { app_print("datatrans srv receive data: \r\n"); memset(p_str, 0, data_len + 1); memcpy(p_str, p_data, data_len); app_print("%s\r\n", p_str); sys_mfree(p_str); } } /*! \brief Init application security module \param[in] none \param[out] none \retval none */ void app_sec_mgr_init(void) { ble_sec_callback_register(app_sec_evt_handler); } /*! \brief Init APP connection manager module \param[in] none \param[out] none \retval none */ void app_conn_mgr_init(void) { ble_conn_callback_register(app_conn_evt_handler); } /*! \brief Init BLE component modules needed \param[in] none \param[out] none \retval none */ void ble_init(void) { ble_init_param_t param = {0}; ble_os_api_t os_interface = { .os_malloc = sys_malloc, .os_calloc = sys_calloc, .os_mfree = sys_mfree, .os_memset = sys_memset, .os_memcpy = sys_memcpy, .os_memcmp = sys_memcmp, .os_task_create = sys_task_create, .os_task_init_notification = sys_task_init_notification, .os_task_wait_notification = sys_task_wait_notification, .os_task_notify = sys_task_notify, .os_task_delete = sys_task_delete, .os_ms_sleep = sys_ms_sleep, .os_current_task_handle_get = sys_current_task_handle_get, .os_queue_init = sys_queue_init, .os_queue_free = sys_queue_free, .os_queue_write = sys_queue_write, .os_queue_read = sys_queue_read, .os_random_bytes_get = sys_random_bytes_get, }; ble_power_on(); param.role = BLE_GAP_ROLE_PERIPHERAL; param.keys_user_mgr = false; param.pairing_mode = BLE_GAP_PAIRING_SECURE_CONNECTION | BLE_GAP_PAIRING_LEGACY; param.privacy_cfg = BLE_GAP_PRIV_CFG_PRIV_EN_BIT; param.ble_task_stack_size = BLE_STACK_TASK_STACK_SIZE; param.ble_task_priority = BLE_STACK_TASK_PRIORITY; param.ble_app_task_stack_size = BLE_APP_TASK_STACK_SIZE; param.ble_app_task_priority = BLE_APP_TASK_PRIORITY; param.name_perm = BLE_GAP_WRITE_NOT_ENC; param.appearance_perm = BLE_GAP_WRITE_NOT_ENC; param.en_cfg = 0; param.p_os_api = &os_interface; ble_sw_init(¶m); app_adapter_init(); app_conn_mgr_init(); app_sec_mgr_init(); ble_datatrans_srv_init(); ble_datatrans_srv_rx_cb_reg(app_datatrans_srv_rx_callback); /* The BLE interrupt must be enabled after ble_sw_init. */ ble_irq_enable(); } /*! \brief Main entry point This function is called right after the booting process has completed. \param[in] none \param[out] none \retval none */ int main(void) { sys_os_init(); platform_init(); app_uart_init(); ble_init(); sys_os_start(); for ( ; ; ); } /*! \file app_uart.c \brief APP UART for GD32VW55x SDK. \version 2023-07-20, V1.0.0, firmware for GD32VW55x */ /* Copyright (c) 2023, GigaDevice Semiconductor Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <ctype.h> #include "gd32vw55x.h" #include <stdio.h> #include "app_uart.h" #include "wrapper_os.h" #include "dbg_print.h" #include "wakelock.h" #include "log_uart.h" #include "ble_datatrans_srv.h" /* Priority of the uart task */ #define UART_TASK_PRIORITY OS_TASK_PRIORITY(4) /* Uart queque size */ #define UART_QUEUE_SIZE 3 /* Message format */ struct uart_msg { uint16_t len; /*!< Length, in bytes, of the message */ void *data; /*!< Pointer to the message */ }; extern uint8_t conn_idx; /* Uart queque */ static os_queue_t uart_queue; /* Uart cyclic buffer */ static cyclic_buf_t uart_cyc_buf; /* Uart RX buffer */ char uart_rx_buf[UART_BUFFER_SIZE]; /* Uart RX buffer index*/ uint32_t uart_index = 0; /*! \brief app uart rx handle \param[in] uart_cyc_buf: uart cyclic buffer \param[out] buf: data buf \param[in] len: data length \retval none */ static void app_uart_rx_handle_done(cyclic_buf_t *uart_cyc_buf, uint8_t *buf, uint16_t *len) { if (*len > cyclic_buf_count(uart_cyc_buf)) { *len = cyclic_buf_count(uart_cyc_buf); } if (buf == NULL) { cyclic_buf_drop(uart_cyc_buf, *len); } else { cyclic_buf_read(uart_cyc_buf, buf, *len); } } /*! \brief uart message precess \param[in] msg: uart message \retval none */ static void app_uart_msg_process(struct uart_msg *msg) { cyclic_buf_t *p_cyclic_buf = (cyclic_buf_t *)msg->data; char *command; command = sys_malloc(msg->len + 1); if (command == NULL) { app_print("No buffer alloc for uart msg !\r\n"); return; } app_uart_rx_handle_done((cyclic_buf_t *)msg->data, (uint8_t *)command, &msg->len); command[msg->len] = '\0'; if (ble_datatrans_srv_tx(conn_idx, (uint8_t *)command, msg->len) == BLE_ERR_NO_ERROR) { app_print("datatrans srv send data: \r\n"); app_print("%s\r\n", command); } sys_mfree(command); return; } /*! \brief uart task \param[in] param: \retval none */ static void app_uart_task(void *param) { struct uart_msg msg; for (;;) { sys_queue_read(&uart_queue, &msg, -1, false); app_uart_msg_process(&msg); } } /*! \brief uart message send \param[in] msg_data: message data \param[in] len: message length \retval success 0 */ int app_uart_send(void *msg_data, uint16_t len) { struct uart_msg msg; msg.len = len; msg.data = msg_data; return sys_queue_write(&uart_queue, &msg, 0, true); } /*! \brief uart rx data handler \param[in] none \retval none */ static void rx_handler(void) { // uart_index - 2 to remove 0x0d and 0x0a when using Husky if (uart_index > 2) { if (app_uart_send((void *)(&uart_cyc_buf), uart_index - 2) == 0) { if (cyclic_buf_write(&uart_cyc_buf, (uint8_t *)uart_rx_buf, uart_index - 2) == false) { dbg_print(ERR, "uart cyclic buffer full\r\n"); } } else { /* queue was full */ dbg_print(ERR, "queue full\r\n"); /* TODO: report 'message ignored' status */ } } uart_index = 0; } /*! \brief app uart rx irq handler \param[in] uart_port: uart port \retval none */ static void app_uart_rx_irq_hdl(uint32_t uart_port) { usart_interrupt_disable(uart_port, USART_INT_RBNE); while (1) { // We should have chance to check overflow error // Otherwise it may cause dead loop handle rx interrupt if (RESET != usart_flag_get(uart_port, USART_FLAG_ORERR)) { usart_flag_clear(uart_port, USART_FLAG_ORERR); } if ((RESET != usart_flag_get(uart_port, USART_FLAG_RBNE))) { uart_rx_buf[uart_index++] = (char)usart_data_receive(uart_port); if (uart_index >= UART_BUFFER_SIZE) { uart_index = 0; } } else { break; } } if (RESET != usart_flag_get(uart_port, USART_FLAG_IDLE)) { usart_flag_clear(UART2, USART_FLAG_IDLE); if (uart_index > 0) rx_handler(); } sys_wakelock_release(LOCK_ID_USART); usart_interrupt_enable(uart_port, USART_INT_RBNE); } /*! \brief app uart config \param[in] none \retval none */ void app_uart_config(void) { rcu_periph_clock_disable(RCU_GPIOA); rcu_periph_clock_disable(RCU_GPIOB); rcu_periph_clock_disable(RCU_UART2); rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_UART2); gpio_af_set(UART2_TX_GPIO, UART2_TX_AF_NUM, UART2_TX_PIN); gpio_af_set(UART2_RX_GPIO, UART2_RX_AF_NUM, UART2_RX_PIN); gpio_mode_set(UART2_TX_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, UART2_TX_PIN); gpio_output_options_set(UART2_TX_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, UART2_TX_PIN); gpio_mode_set(UART2_RX_GPIO, GPIO_MODE_AF, GPIO_PUPD_NONE, UART2_RX_PIN); gpio_output_options_set(UART2_RX_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, UART2_RX_PIN); /* close printf buffer */ setvbuf(stdout, NULL, _IONBF, 0); usart_deinit(UART2); usart_word_length_set(UART2, USART_WL_8BIT); usart_stop_bit_set(UART2, USART_STB_1BIT); usart_parity_config(UART2, USART_PM_NONE); usart_baudrate_set(UART2, 115200U); usart_receive_config(UART2, USART_RECEIVE_ENABLE); usart_transmit_config(UART2, USART_TRANSMIT_ENABLE); usart_interrupt_enable(UART2, USART_INT_RBNE); usart_receive_fifo_enable(UART2); usart_enable(UART2); /*wait IDLEF set and clear it*/ while(RESET == usart_flag_get(UART2, USART_FLAG_IDLE)) { } usart_flag_clear(UART2, USART_FLAG_IDLE); usart_interrupt_enable(UART2, USART_INT_IDLE); } /*! \brief app uart initialize \retval success 0 */ int app_uart_init(void) { if (sys_task_create_dynamic((const uint8_t *)"UART task", 512, UART_TASK_PRIORITY, app_uart_task, NULL) == NULL) { return -1; } if (sys_queue_init(&uart_queue, UART_QUEUE_SIZE, sizeof(struct uart_msg))) { return -2; } app_uart_config(); memset(uart_rx_buf, 0, UART_BUFFER_SIZE); uart_index = 0; cyclic_buf_init(&uart_cyc_buf, 4 * UART_BUFFER_SIZE); uart_irq_callback_register(UART2, app_uart_rx_irq_hdl); return 0; } 详细介绍代码

#include "Dri_BT.h" // 定义蓝牙状态 static bool bt_initialized = false; /* 定义esp32收到手机数据时的回调弱函数 */ void __attribute__((weak)) App_Communication_DealBtData(uint8_t *data, uint16_t dataLen) { } // 设置蓝牙名称 static char example_device_name[ESP_BLE_ADV_NAME_LEN_MAX] = "Zkevin_SmartHumidifier"; static uint8_t adv_config_done = 0; static uint16_t heart_rate_handle_table[HRS_IDX_NB]; static uint8_t test_manufacturer[3] = {'E', 'S', 'P'}; static uint8_t sec_service_uuid[16] = { /* LSB <--------------------------------------------------------------------------------> MSB */ // first uuid, 16bit, [12],[13] is the value 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x18, 0x0D, 0x00, 0x00, }; // config adv data static esp_ble_adv_data_t heart_rate_adv_config = { .set_scan_rsp = false, .include_txpower = true, .min_interval = 0x0006, // slave connection min interval, Time = min_interval * 1.25 msec .max_interval = 0x0010, // slave connection max interval, Time = max_interval * 1.25 msec .appearance = 0x00, .manufacturer_len = 0, // TEST_MANUFACTURER_DATA_LEN, .p_manufacturer_data = NULL, //&test_manufacturer[0], .service_data_len = 0, .p_service_data = NULL, .service_uuid_len = sizeof(sec_service_uuid), .p_service_uuid = sec_service_uuid, .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), }; // config scan response data static esp_ble_adv_data_t heart_rate_scan_rsp_config = { .set_scan_rsp = true, .include_name = true, .manufacturer_len = sizeof(test_manufacturer), .p_manufacturer_data = test_manufacturer, }; static esp_ble_adv_params_t heart_rate_adv_params = { .adv_int_min = 0x100, .adv_int_max = 0x100, .adv_type = ADV_TYPE_IND, .own_addr_type = BLE_ADDR_TYPE_RPA_PUBLIC, .channel_map = ADV_CHNL_ALL, .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, }; struct gatts_profile_inst { esp_gatts_cb_t gatts_cb; uint16_t gatts_if; uint16_t app_id; uint16_t conn_id; uint16_t service_handle; esp_gatt_srvc_id_t service_id; uint16_t char_handle; esp_bt_uuid_t char_uuid; esp_gatt_perm_t perm; esp_gatt_char_prop_t property; uint16_t descr_handle; esp_bt_uuid_t descr_uuid; }; static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); /* One gatt-based profile one app_id and one gatts_if, this array will store the gatts_if returned by ESP_GATTS_REG_EVT */ static struct gatts_profile_inst heart_rate_profile_tab[HEART_PROFILE_NUM] = { [HEART_PROFILE_APP_IDX] = { .gatts_cb = gatts_profile_event_handler, .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */ }, }; /* * Heart Rate PROFILE ATTRIBUTES **************************************************************************************** */ /// Heart Rate Sensor Service static const uint16_t heart_rate_svc = ESP_GATT_UUID_HEART_RATE_SVC; #define CHAR_DECLARATION_SIZE (sizeof(uint8_t)) static const uint16_t primary_service_uuid = ESP_GATT_UUID_PRI_SERVICE; static const uint16_t character_declaration_uuid = ESP_GATT_UUID_CHAR_DECLARE; static const uint16_t character_client_config_uuid = ESP_GATT_UUID_CHAR_CLIENT_CONFIG; static const uint8_t char_prop_notify = ESP_GATT_CHAR_PROP_BIT_NOTIFY; static const uint8_t char_prop_read = ESP_GATT_CHAR_PROP_BIT_READ; static const uint8_t char_prop_read_write = ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_READ; /// Heart Rate Sensor Service - Heart Rate Measurement Characteristic, notify static const uint16_t heart_rate_meas_uuid = ESP_GATT_HEART_RATE_MEAS; static const uint8_t heart_measurement_ccc[2] = {0x00, 0x00}; /// Heart Rate Sensor Service -Body Sensor Location characteristic, read static const uint16_t body_sensor_location_uuid = ESP_GATT_BODY_SENSOR_LOCATION; static const uint8_t body_sensor_loc_val[1] = {0x00}; /// Heart Rate Sensor Service - Heart Rate Control Point characteristic, write&read static const uint16_t heart_rate_ctrl_point = ESP_GATT_HEART_RATE_CNTL_POINT; static const uint8_t heart_ctrl_point[1] = {0x00}; /// Full HRS Database Description - Used to add attributes into the database static const esp_gatts_attr_db_t heart_rate_gatt_db[HRS_IDX_NB] = { // Heart Rate Service Declaration [HRS_IDX_SVC] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, sizeof(uint16_t), sizeof(heart_rate_svc), (uint8_t *)&heart_rate_svc}}, // Heart Rate Measurement Characteristic Declaration [HRS_IDX_HR_MEAS_CHAR] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_notify}}, // Heart Rate Measurement Characteristic Value [HRS_IDX_HR_MEAS_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&heart_rate_meas_uuid, ESP_GATT_PERM_READ, HRPS_HT_MEAS_MAX_LEN, 0, NULL}}, // Heart Rate Measurement Characteristic - Client Characteristic Configuration Descriptor [HRS_IDX_HR_MEAS_NTF_CFG] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, sizeof(uint16_t), sizeof(heart_measurement_ccc), (uint8_t *)heart_measurement_ccc}}, // Body Sensor Location Characteristic Declaration [HRS_IDX_BOBY_SENSOR_LOC_CHAR] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read}}, // Body Sensor Location Characteristic Value [HRS_IDX_BOBY_SENSOR_LOC_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&body_sensor_location_uuid, ESP_GATT_PERM_READ_ENCRYPTED, sizeof(uint8_t), sizeof(body_sensor_loc_val), (uint8_t *)body_sensor_loc_val}}, // Heart Rate Control Point Characteristic Declaration [HRS_IDX_HR_CTNL_PT_CHAR] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, // Heart Rate Control Point Characteristic Value [HRS_IDX_HR_CTNL_PT_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&heart_rate_ctrl_point, ESP_GATT_PERM_WRITE_ENCRYPTED | ESP_GATT_PERM_READ_ENCRYPTED, sizeof(uint8_t), sizeof(heart_ctrl_point), (uint8_t *)heart_ctrl_point}}, }; static char *esp_key_type_to_str(esp_ble_key_type_t key_type) { char *key_str = NULL; switch (key_type) { case ESP_LE_KEY_NONE: key_str = "ESP_LE_KEY_NONE"; break; case ESP_LE_KEY_PENC: key_str = "ESP_LE_KEY_PENC"; break; case ESP_LE_KEY_PID: key_str = "ESP_LE_KEY_PID"; break; case ESP_LE_KEY_PCSRK: key_str = "ESP_LE_KEY_PCSRK"; break; case ESP_LE_KEY_PLK: key_str = "ESP_LE_KEY_PLK"; break; case ESP_LE_KEY_LLK: key_str = "ESP_LE_KEY_LLK"; break; case ESP_LE_KEY_LENC: key_str = "ESP_LE_KEY_LENC"; break; case ESP_LE_KEY_LID: key_str = "ESP_LE_KEY_LID"; break; case ESP_LE_KEY_LCSRK: key_str = "ESP_LE_KEY_LCSRK"; break; default: key_str = "INVALID BLE KEY TYPE"; break; } return key_str; } static char *esp_auth_req_to_str(esp_ble_auth_req_t auth_req) { char *auth_str = NULL; switch (auth_req) { case ESP_LE_AUTH_NO_BOND: auth_str = "ESP_LE_AUTH_NO_BOND"; break; case ESP_LE_AUTH_BOND: auth_str = "ESP_LE_AUTH_BOND"; break; case ESP_LE_AUTH_REQ_MITM: auth_str = "ESP_LE_AUTH_REQ_MITM"; break; case ESP_LE_AUTH_REQ_BOND_MITM: auth_str = "ESP_LE_AUTH_REQ_BOND_MITM"; break; case ESP_LE_AUTH_REQ_SC_ONLY: auth_str = "ESP_LE_AUTH_REQ_SC_ONLY"; break; case ESP_LE_AUTH_REQ_SC_BOND: auth_str = "ESP_LE_AUTH_REQ_SC_BOND"; break; case ESP_LE_AUTH_REQ_SC_MITM: auth_str = "ESP_LE_AUTH_REQ_SC_MITM"; break; case ESP_LE_AUTH_REQ_SC_MITM_BOND: auth_str = "ESP_LE_AUTH_REQ_SC_MITM_BOND"; break; default: auth_str = "INVALID BLE AUTH REQ"; break; } return auth_str; } static void show_bonded_devices(void) { int dev_num = esp_ble_get_bond_device_num(); if (dev_num == 0) { ESP_LOGI(GATTS_TABLE_TAG, "Bonded devices number zero\n"); return; } esp_ble_bond_dev_t *dev_list = (esp_ble_bond_dev_t *)malloc(sizeof(esp_ble_bond_dev_t) * dev_num); if (!dev_list) { ESP_LOGI(GATTS_TABLE_TAG, "malloc failed, return\n"); return; } esp_ble_get_bond_device_list(&dev_num, dev_list); ESP_LOGI(GATTS_TABLE_TAG, "Bonded devices number %d", dev_num); for (int i = 0; i < dev_num; i++) { ESP_LOGI(GATTS_TABLE_TAG, "[%u] addr_type %u, addr " ESP_BD_ADDR_STR "", i, dev_list[i].bd_addr_type, ESP_BD_ADDR_HEX(dev_list[i].bd_addr)); } free(dev_list); } static void __attribute__((unused)) remove_all_bonded_devices(void) { int dev_num = esp_ble_get_bond_device_num(); if (dev_num == 0) { ESP_LOGI(GATTS_TABLE_TAG, "Bonded devices number zero\n"); return; } esp_ble_bond_dev_t *dev_list = (esp_ble_bond_dev_t *)malloc(sizeof(esp_ble_bond_dev_t) * dev_num); if (!dev_list) { ESP_LOGI(GATTS_TABLE_TAG, "malloc failed, return\n"); return; } esp_ble_get_bond_device_list(&dev_num, dev_list); for (int i = 0; i < dev_num; i++) { esp_ble_remove_bond_device(dev_list[i].bd_addr); } free(dev_list); } static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { ESP_LOGV(GATTS_TABLE_TAG, "GAP_EVT, event %d", event); switch (event) { case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: adv_config_done &= (~SCAN_RSP_CONFIG_FLAG); if (adv_config_done == 0) { esp_ble_gap_start_advertising(&heart_rate_adv_params); } break; case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: adv_config_done &= (~ADV_CONFIG_FLAG); if (adv_config_done == 0) { esp_ble_gap_start_advertising(&heart_rate_adv_params); } break; case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: // advertising start complete event to indicate advertising start successfully or failed if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { ESP_LOGE(GATTS_TABLE_TAG, "Advertising start failed, status %x", param->adv_start_cmpl.status); break; } ESP_LOGI(GATTS_TABLE_TAG, "Advertising start successfully"); break; case ESP_GAP_BLE_PASSKEY_REQ_EVT: /* passkey request event */ ESP_LOGI(GATTS_TABLE_TAG, "Passkey request"); /* Call the following function to input the passkey which is displayed on the remote device */ // esp_ble_passkey_reply(heart_rate_profile_tab[HEART_PROFILE_APP_IDX].remote_bda, true, 0x00); break; case ESP_GAP_BLE_OOB_REQ_EVT: { ESP_LOGI(GATTS_TABLE_TAG, "OOB request"); uint8_t tk[16] = {1}; // If you paired with OOB, both devices need to use the same tk esp_ble_oob_req_reply(param->ble_security.ble_req.bd_addr, tk, sizeof(tk)); break; } case ESP_GAP_BLE_LOCAL_IR_EVT: /* BLE local IR event */ ESP_LOGI(GATTS_TABLE_TAG, "Local identity root"); break; case ESP_GAP_BLE_LOCAL_ER_EVT: /* BLE local ER event */ ESP_LOGI(GATTS_TABLE_TAG, "Local encryption root"); break; case ESP_GAP_BLE_NC_REQ_EVT: /* The app will receive this evt when the IO has DisplayYesNO capability and the peer device IO also has DisplayYesNo capability. show the passkey number to the user to confirm it with the number displayed by peer device. */ esp_ble_confirm_reply(param->ble_security.ble_req.bd_addr, true); ESP_LOGI(GATTS_TABLE_TAG, "Numeric Comparison request, passkey %" PRIu32, param->ble_security.key_notif.passkey); break; case ESP_GAP_BLE_SEC_REQ_EVT: /* send the positive(true) security response to the peer device to accept the security request. If not accept the security request, should send the security response with negative(false) accept value*/ esp_ble_gap_security_rsp(param->ble_security.ble_req.bd_addr, true); break; case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: /// the app will receive this evt when the IO has Output capability and the peer device IO has Input capability. /// show the passkey number to the user to input it in the peer device. ESP_LOGI(GATTS_TABLE_TAG, "Passkey notify, passkey %06" PRIu32, param->ble_security.key_notif.passkey); break; case ESP_GAP_BLE_KEY_EVT: // shows the ble key info share with peer device to the user. ESP_LOGI(GATTS_TABLE_TAG, "Key exchanged, key_type %s", esp_key_type_to_str(param->ble_security.ble_key.key_type)); break; case ESP_GAP_BLE_AUTH_CMPL_EVT: { esp_bd_addr_t bd_addr; memcpy(bd_addr, param->ble_security.auth_cmpl.bd_addr, sizeof(esp_bd_addr_t)); ESP_LOGI(GATTS_TABLE_TAG, "Authentication complete, addr_type %u, addr " ESP_BD_ADDR_STR "", param->ble_security.auth_cmpl.addr_type, ESP_BD_ADDR_HEX(bd_addr)); if (!param->ble_security.auth_cmpl.success) { ESP_LOGI(GATTS_TABLE_TAG, "Pairing failed, reason 0x%x", param->ble_security.auth_cmpl.fail_reason); } else { ESP_LOGI(GATTS_TABLE_TAG, "Pairing successfully, auth_mode %s", esp_auth_req_to_str(param->ble_security.auth_cmpl.auth_mode)); } show_bonded_devices(); break; } case ESP_GAP_BLE_REMOVE_BOND_DEV_COMPLETE_EVT: { ESP_LOGD(GATTS_TABLE_TAG, "Bond device remove, status %d, device " ESP_BD_ADDR_STR "", param->remove_bond_dev_cmpl.status, ESP_BD_ADDR_HEX(param->remove_bond_dev_cmpl.bd_addr)); break; } case ESP_GAP_BLE_SET_LOCAL_PRIVACY_COMPLETE_EVT: if (param->local_privacy_cmpl.status != ESP_BT_STATUS_SUCCESS) { ESP_LOGE(GATTS_TABLE_TAG, "Local privacy config failed, status %x", param->local_privacy_cmpl.status); break; } ESP_LOGI(GATTS_TABLE_TAG, "Local privacy config successfully"); esp_err_t ret = esp_ble_gap_config_adv_data(&heart_rate_adv_config); if (ret) { ESP_LOGE(GATTS_TABLE_TAG, "config adv data failed, error code = %x", ret); } else { adv_config_done |= ADV_CONFIG_FLAG; } ret = esp_ble_gap_config_adv_data(&heart_rate_scan_rsp_config); if (ret) { ESP_LOGE(GATTS_TABLE_TAG, "config adv data failed, error code = %x", ret); } else { adv_config_done |= SCAN_RSP_CONFIG_FLAG; } break; default: break; } } static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { ESP_LOGV(GATTS_TABLE_TAG, "event = %x", event); switch (event) { case ESP_GATTS_REG_EVT: ESP_LOGI(GATTS_TABLE_TAG, "GATT server register, status %d, app_id %d, gatts_if %d", param->reg.status, param->reg.app_id, gatts_if); esp_ble_gap_set_device_name(example_device_name); // generate a resolvable random address esp_ble_gap_config_local_privacy(true); esp_ble_gatts_create_attr_tab(heart_rate_gatt_db, gatts_if, HRS_IDX_NB, HEART_RATE_SVC_INST_ID); break; case ESP_GATTS_READ_EVT: break; case ESP_GATTS_WRITE_EVT: ESP_LOGI(GATTS_TABLE_TAG, "Characteristic write, value "); ESP_LOG_BUFFER_HEX(GATTS_TABLE_TAG, param->write.value, param->write.len); App_Communication_DealBtData(param->write.value, param->write.len); break; case ESP_GATTS_EXEC_WRITE_EVT: break; case ESP_GATTS_MTU_EVT: break; case ESP_GATTS_CONF_EVT: break; case ESP_GATTS_UNREG_EVT: break; case ESP_GATTS_DELETE_EVT: break; case ESP_GATTS_START_EVT: break; case ESP_GATTS_STOP_EVT: break; case ESP_GATTS_CONNECT_EVT: ESP_LOGI(GATTS_TABLE_TAG, "Connected, conn_id %u, remote " ESP_BD_ADDR_STR "", param->connect.conn_id, ESP_BD_ADDR_HEX(param->connect.remote_bda)); /* start security connect with peer device when receive the connect event sent by the master */ esp_ble_set_encryption(param->connect.remote_bda, ESP_BLE_SEC_ENCRYPT_MITM); break; case ESP_GATTS_DISCONNECT_EVT: ESP_LOGI(GATTS_TABLE_TAG, "Disconnected, remote " ESP_BD_ADDR_STR ", reason 0x%x", ESP_BD_ADDR_HEX(param->disconnect.remote_bda), param->disconnect.reason); /* start advertising again when missing the connect */ esp_ble_gap_start_advertising(&heart_rate_adv_params); break; case ESP_GATTS_OPEN_EVT: break; case ESP_GATTS_CANCEL_OPEN_EVT: break; case ESP_GATTS_CLOSE_EVT: break; case ESP_GATTS_LISTEN_EVT: break; case ESP_GATTS_CONGEST_EVT: break; case ESP_GATTS_CREAT_ATTR_TAB_EVT: { if (param->create.status == ESP_GATT_OK) { if (param->add_attr_tab.num_handle == HRS_IDX_NB) { ESP_LOGI(GATTS_TABLE_TAG, "Attribute table create successfully, num_handle %x", param->add_attr_tab.num_handle); memcpy(heart_rate_handle_table, param->add_attr_tab.handles, sizeof(heart_rate_handle_table)); esp_ble_gatts_start_service(heart_rate_handle_table[HRS_IDX_SVC]); } else { ESP_LOGE(GATTS_TABLE_TAG, "Attribute table create abnormally, num_handle (%d) doesn't equal to HRS_IDX_NB(%d)", param->add_attr_tab.num_handle, HRS_IDX_NB); } } else { ESP_LOGE(GATTS_TABLE_TAG, "Attribute table create failed, error code = %x", param->create.status); } break; } default: break; } } static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { /* If event is register event, store the gatts_if for each profile */ if (event == ESP_GATTS_REG_EVT) { if (param->reg.status == ESP_GATT_OK) { heart_rate_profile_tab[HEART_PROFILE_APP_IDX].gatts_if = gatts_if; } else { ESP_LOGI(GATTS_TABLE_TAG, "Reg app failed, app_id %04x, status %d", param->reg.app_id, param->reg.status); return; } } do { int idx; for (idx = 0; idx < HEART_PROFILE_NUM; idx++) { if (gatts_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ gatts_if == heart_rate_profile_tab[idx].gatts_if) { if (heart_rate_profile_tab[idx].gatts_cb) { heart_rate_profile_tab[idx].gatts_cb(event, gatts_if, param); } } } } while (0); } /** * @brief 初始化蓝牙模块 * */ void Dri_BT_Init(void) { // 避免重复初始化 if (bt_initialized) { ESP_LOGI(GATTS_TABLE_TAG, "Bluetooth already initialized"); return; } esp_err_t ret; // 获取当前蓝牙状态 esp_bt_controller_status_t bt_status = esp_bt_controller_get_status(); // 蓝牙未被初始化 if (bt_status == ESP_BT_CONTROLLER_STATUS_IDLE) { // 初始化NVS.为了存入蓝牙连接信息; ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); // 释放经典蓝牙部署 ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)); // 初始化蓝牙硬件配置 esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); esp_bt_controller_init(&bt_cfg); esp_bt_controller_enable(ESP_BT_MODE_BLE); // 初始化蓝牙应用层软件配置 esp_bluedroid_init(); esp_bluedroid_enable(); } // 蓝牙未初始化 if (!bt_initialized) { // 注册回调函数 esp_ble_gatts_register_callback(gatts_event_handler); esp_ble_gap_register_callback(gap_event_handler); esp_ble_gatts_app_register(ESP_HEART_RATE_APP_ID); // 设置安全参数,未来传输数据需要加密,采用非对称加密方式(公钥和私钥) esp_ble_auth_req_t auth_req = ESP_LE_AUTH_REQ_SC_MITM_BOND; // bonding with peer device after authentication esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE; // set the IO capability to No output No input uint8_t key_size = 16; // the key size should be 7~16 bytes uint8_t init_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; uint8_t rsp_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; // 安全密钥 uint32_t passkey = 123456; uint8_t auth_option = ESP_BLE_ONLY_ACCEPT_SPECIFIED_AUTH_DISABLE; uint8_t oob_support = ESP_BLE_OOB_DISABLE; esp_ble_gap_set_security_param(ESP_BLE_SM_SET_STATIC_PASSKEY, &passkey, sizeof(uint32_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &auth_req, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &key_size, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_ONLY_ACCEPT_SPECIFIED_SEC_AUTH, &auth_option, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_OOB_SUPPORT, &oob_support, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_SET_INIT_KEY, &init_key, sizeof(uint8_t)); esp_ble_gap_set_security_param(ESP_BLE_SM_SET_RSP_KEY, &rsp_key, sizeof(uint8_t)); } bt_initialized = true; } #include "Dri_Wifi.h" // 蓝牙的两种情况 // 二维码扫描前需要配网低功耗蓝牙和自定义GATT低功耗蓝牙 // WIFI配网成功后,只需要自定义GATT低功耗蓝牙 typedef enum { BT_MODE_GATT, // GATT服务模式 BT_MODE_DUAL // 双模式(同时支持配网和GATT) } bt_mode_t; // 默认双模式 static bt_mode_t current_bt_mode = BT_MODE_DUAL; static wifi_conn wifi_success_cb; static const char *TAG = "WIFI"; const int WIFI_CONNECTED_EVENT = BIT0; static EventGroupHandle_t wifi_event_group; #define PROV_QR_VERSION "v1" #define PROV_TRANSPORT_BLE "ble" #define QRCODE_BASE_URL "https://espressif.github.io/esp-jumpstart/qrcode.html" // WIFI各种事件的回调函数 static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { // 记录失败次数 static int retries; // 记录WIFI连接失败次数 static uint8_t wifi_conn_retries = 0; if (event_base == WIFI_PROV_EVENT) // WIFI配置事件 { switch (event_id) { case WIFI_PROV_START: ESP_LOGI(TAG, "Provisioning started"); break; case WIFI_PROV_CRED_RECV: { wifi_sta_config_t *wifi_sta_cfg = (wifi_sta_config_t *)event_data; ESP_LOGI(TAG, "Received Wi-Fi credentials" "\n\tSSID : %s\n\tPassword : %s", (const char *)wifi_sta_cfg->ssid, (const char *)wifi_sta_cfg->password); break; } case WIFI_PROV_CRED_FAIL: { wifi_prov_sta_fail_reason_t *reason = (wifi_prov_sta_fail_reason_t *)event_data; ESP_LOGE(TAG, "Provisioning failed!\n\tReason : %s" "\n\tPlease reset to factory and retry provisioning", (*reason == WIFI_PROV_STA_AUTH_ERROR) ? "Wi-Fi station authentication failed" : "Wi-Fi access-point not found"); retries++; if (retries >= 5) { ESP_LOGI(TAG, "Failed to connect with provisioned AP, resetting provisioned credentials"); wifi_prov_mgr_reset_sm_state_on_failure(); retries = 0; } break; } case WIFI_PROV_CRED_SUCCESS: ESP_LOGI(TAG, "Provisioning successful"); retries = 0; break; case WIFI_PROV_END: // 配置完成后,取消初始化管理器 wifi_prov_mgr_deinit(); break; default: break; } } else if (event_base == WIFI_EVENT) // WIFI事件 { switch (event_id) { case WIFI_EVENT_STA_START: esp_wifi_connect(); break; case WIFI_EVENT_STA_DISCONNECTED: ESP_LOGI(TAG, "Disconnected. Connecting to the AP again..."); wifi_conn_retries++; if (wifi_conn_retries >= 10) { // 重置WIFI配置 wifi_prov_mgr_reset_provisioning(); // 重启芯片 esp_restart(); } esp_wifi_connect(); break; default: break; } } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) // 连接成功 { // 重置记录WIFI连接失败次数 wifi_conn_retries = 0; // 引用运行回调函数代码 wifi_success_cb(); ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ESP_LOGI(TAG, "Connected with IP Address:" IPSTR, IP2STR(&event->ip_info.ip)); xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_EVENT); } else if (event_base == PROTOCOMM_TRANSPORT_BLE_EVENT) // 蓝牙事件 { switch (event_id) { case PROTOCOMM_TRANSPORT_BLE_CONNECTED: ESP_LOGI(TAG, "BLE transport: Connected!"); break; case PROTOCOMM_TRANSPORT_BLE_DISCONNECTED: ESP_LOGI(TAG, "BLE transport: Disconnected!"); break; default: break; } } } static void wifi_init_sta(void) { /* Start Wi-Fi in station mode */ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_start()); } static void get_device_service_name(char *service_name, size_t max) { uint8_t eth_mac[6]; const char *ssid_prefix = "PROV_"; esp_wifi_get_mac(WIFI_IF_STA, eth_mac); snprintf(service_name, max, "%s%02X%02X%02X", ssid_prefix, eth_mac[3], eth_mac[4], eth_mac[5]); } esp_err_t custom_prov_data_handler(uint32_t session_id, const uint8_t *inbuf, ssize_t inlen, uint8_t **outbuf, ssize_t *outlen, void *priv_data) { if (inbuf) { ESP_LOGI(TAG, "Received data: %.*s", inlen, (char *)inbuf); } char response[] = "SUCCESS"; *outbuf = (uint8_t *)strdup(response); if (*outbuf == NULL) { ESP_LOGE(TAG, "System out of memory"); return ESP_ERR_NO_MEM; } *outlen = strlen(response) + 1; /* +1 for NULL terminating byte */ return ESP_OK; } static void wifi_prov_print_qr(const char *name, const char *username, const char *pop, const char *transport) { if (!name || !transport) { ESP_LOGW(TAG, "Cannot generate QR code payload. Data missing."); return; } char payload[150] = {0}; snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" ",\"transport\":\"%s\"}", PROV_QR_VERSION, name, transport); ESP_LOGI(TAG, "Scan this QR code from the provisioning application for Provisioning."); esp_qrcode_config_t cfg = ESP_QRCODE_CONFIG_DEFAULT(); esp_qrcode_generate(&cfg, payload); ESP_LOGI(TAG, "If QR code is not visible, copy paste the below URL in a browser.\n%s?data=%s", QRCODE_BASE_URL, payload); } /** * @brief 初始化WIFI模块 * */ void Dri_Wifi_Init(wifi_conn wifi_conn_success) { // 赋值回调函数 wifi_success_cb = wifi_conn_success; // 初始化NVS,用于保存WIFI名称于Flash esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ESP_ERROR_CHECK(nvs_flash_init()); } // 初始化TCP/IP ESP_ERROR_CHECK(esp_netif_init()); // 创建事件循环组 ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_event_group = xEventGroupCreate(); // 注册各种事件回调函数 ESP_ERROR_CHECK(esp_event_handler_register(WIFI_PROV_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(PROTOCOMM_TRANSPORT_BLE_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(PROTOCOMM_SECURITY_SESSION_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL)); // 根据TCP/IP网络协议,初始化WIFI esp_netif_create_default_wifi_sta(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); // 初始化自定义GATT蓝牙 Dri_BT_Init(); // 配网配置信息 wifi_prov_mgr_config_t config = { .scheme = wifi_prov_scheme_ble, .scheme_event_handler = WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BTDM, }; // 配网初始化 ESP_ERROR_CHECK(wifi_prov_mgr_init(config)); bool provisioned = false; // wifi_prov_mgr_reset_provisioning(); // 检查是否配网 ESP_ERROR_CHECK(wifi_prov_mgr_is_provisioned(&provisioned)); // 根据是否配网,做对应操作 // 没有配网 if (!provisioned) { ESP_LOGI(TAG, "Starting provisioning"); // 配网模式:同时支持配网和GATT current_bt_mode = BT_MODE_DUAL; // WIFI设备名称 char service_name[12]; get_device_service_name(service_name, sizeof(service_name)); // 无安全设置 const char *service_key = NULL; // WIFI设备唯一标识 uint8_t custom_service_uuid[] = { /* LSB <--------------------------------------- * ---------------------------------------> MSB */ 0xb4, 0xdf, 0x5a, 0x1c, 0x3f, 0x6b, 0xf4, 0xbf, 0xea, 0x4a, 0x82, 0x03, 0x04, 0x90, 0x1a, 0x02, }; wifi_prov_scheme_ble_set_service_uuid(custom_service_uuid); // 创建WIFI设备节点信息 wifi_prov_mgr_endpoint_create("custom-data"); // 启动配网设备 wifi_prov_security_t security = WIFI_PROV_SECURITY_0; ESP_ERROR_CHECK(wifi_prov_mgr_start_provisioning(security, (const void *)NULL, service_name, service_key)); // 在网络中进行设备注册 wifi_prov_mgr_endpoint_register("custom-data", custom_prov_data_handler, NULL); // 打印二维码 wifi_prov_print_qr(service_name, NULL, NULL, PROV_TRANSPORT_BLE); // 启动双服务广播 start_dual_service_advertising(); } else { ESP_LOGI(TAG, "Already provisioned, starting Wi-Fi STA"); // 已配网:仅GATT模式 current_bt_mode = BT_MODE_GATT; // 配网初始化 wifi_prov_mgr_deinit(); // 启动WIFI wifi_init_sta(); // 启动GATT服务广播 esp_ble_gap_start_advertising(&heart_rate_adv_params); } // 等待WIFI连接成功 xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_EVENT, true, true, portMAX_DELAY); } 蓝牙的两种情况怎么实现

#include <WiFi.h> #include "esp_camera.h" #include <shibie_inferencing.h> #include "edge-impulse-sdk/dsp/image/image.hpp" #include "freertos/semphr.h" // 互斥锁头文件 #include "esp_task_wdt.h" #include "freertos/task.h" #include "esp_http_server.h" // 摄像头引脚配置(根据实际硬件调整) // OLED配置 #include <Adafruit_SSD1306.h> #include <Adafruit_GFX.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Edge Impulse模型 static ei_impulse_result_t result; // 存储推理结果 // 摄像头配置(匹配模型输入) static camera_config_t camera_config = { .pixel_format = PIXFORMAT_GRAY, // 灰度图减少处理负载 .frame_size = FRAMESIZE_96X96, // 匹配Edge Impulse输入尺寸 .jpeg_quality = 10, // 高压缩率 .fb_count = 1, .fb_location = CAMERA_FB_IN_PSRAM }; void setup() { // 初始化摄像头(参考之前代码) if(esp_camera_init(&camera_config) != ESP_OK) { Serial.println("摄像头初始化失败"); while(1) delay(100); } // 初始化OLED Wire.begin(14, 15); // SDA=GPIO14, SCL=GPIO15 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("OLED初始化失败"); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); // 初始化Edge Impulse ei_printf("Edge Impulse推理引擎启动\n"); } void loop() { camera_fb_t *fb = esp_camera_fb_get(); // 捕获图像 if(!fb) return; // 图像预处理(转换为模型输入格式) signal_t signal; signal.total_length = fb->len; signal.get_data = &raw_feature_get_data; // Edge Impulse推理 EI_IMPULSE_ERROR res = run_classifier(&signal, &result, false); if(res != EI_IMPULSE_OK) { display.clearDisplay(); display.setCursor(0,0); display.print("推理错误!"); display.display(); return; } // 在OLED显示结果 display.clearDisplay(); display.setCursor(0,0); display.print("检测到: "); display.println(result.classification[0].label); display.printf("置信度: %.1f%%", result.classification[0].value*100); display.display(); esp_camera_fb_return(fb); // 释放内存 delay(1000); // 控制识别频率 } // 图像数据转换回调 static int raw_feature_get_data(size_t offset, size_t length, float *out_ptr) { size_t pixel_ix = offset * 2; for(size_t i = 0; i < length; i++) { out_ptr[i] = (fb->buf[pixel_ix] << 8) | fb->buf[pixel_ix+1]; // 灰度转float pixel_ix += 2; } return 0; }... "C:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\xtensa-esp32-elf-gcc\\gcc8_4_0-esp-2021r2-patch3/bin/xtensa-esp32-elf-g++" -DHAVE_CONFIG_H "-DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"" -DUNITY_INCLUDE_CONFIG_H -DWITH_POSIX -D_GNU_SOURCE "-DIDF_VER=\"v4.4.1-472-gc9140caf8c\"" -DESP_PLATFORM -D_POSIX_READER_WRITER_LOCKS "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/newlib/platform_include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/freertos/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/freertos/include/esp_additions/freertos" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/freertos/port/xtensa/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/freertos/include/esp_additions" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hw_support/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hw_support/include/soc" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hw_support/port/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hw_support/port/esp32/private_include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/heap/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/log/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/lwip/include/apps" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/lwip/include/apps/sntp" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/lwip/lwip/src/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/lwip/port/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/lwip/port/esp32/include/arch" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/soc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/soc/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/soc/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/hal/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/hal/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/hal/platform_port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_rom/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_rom/include/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_rom/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_system/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_system/port/soc" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_system/port/public_compat" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/xtensa/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/xtensa/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/driver/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/driver/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_pm/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_ringbuf/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/efuse/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/efuse/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/vfs/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_wifi/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_event/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_netif/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_eth/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/tcpip_adapter/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_phy/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_phy/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_ipc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/app_trace/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_timer/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/mbedtls/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/mbedtls/mbedtls/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/mbedtls/esp_crt_bundle/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/app_update/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/spi_flash/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bootloader_support/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/nvs_flash/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/pthread/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_gdbstub/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_gdbstub/xtensa" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_gdbstub/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/espcoredump/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/espcoredump/include/port/xtensa" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/wpa_supplicant/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/wpa_supplicant/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/wpa_supplicant/esp_supplicant/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/ieee802154/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/console" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/asio/asio/asio/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/asio/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/common/osi/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/include/esp32/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/common/api/include/api" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/common/btc/profile/esp/blufi/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/common/btc/profile/esp/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/host/bluedroid/api/include/api" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/storage" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/btc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/client/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/server/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/api/core/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/api/models/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/bt/esp_ble_mesh/api" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/cbor/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/unity/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/unity/unity/src" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/cmock/CMock/src" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/coap/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/coap/libcoap/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/nghttp/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/nghttp/nghttp2/lib/includes" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-tls" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-tls/esp-tls-crypto" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_adc_cal/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_hid/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/tcp_transport/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_http_client/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_http_server/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_https_ota/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_https_server/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_lcd/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_lcd/interface" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/protobuf-c/protobuf-c" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/protocomm/include/common" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/protocomm/include/security" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/protocomm/include/transports" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/mdns/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_local_ctrl/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/sdmmc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_serial_slave_link/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_websocket_client/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/expat/expat/expat/lib" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/expat/port/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/wear_levelling/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/fatfs/diskio" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/fatfs/vfs" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/fatfs/src" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/freemodbus/common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/idf_test/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/idf_test/include/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/jsmn/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/json/cJSON" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/libsodium/libsodium/src/libsodium/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/libsodium/port_include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/mqtt/esp-mqtt/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/openssl/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/perfmon/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/spiffs/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/ulp/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/wifi_provisioning/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/button/button/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/rmaker_common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/json_parser/upstream/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/json_parser/upstream" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/json_generator/upstream" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_schedule/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_rainmaker/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/qrcode/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/ws2812_led" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/dotprod/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/support/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/hann/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/blackman/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/blackman_harris/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/blackman_nuttall/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/nuttall/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/windows/flat_top/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/iir/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/fir/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/add/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/sub/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/mul/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/addc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/mulc/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/math/sqrt/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/matrix/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/fft/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/dct/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/conv/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/common/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/kalman/ekf/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dsp/modules/kalman/ekf_imu13states/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_littlefs/src" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp_littlefs/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/tool" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/typedef" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/image" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/math" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/nn" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/layer" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/detect" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-dl/include/model_zoo" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-sr/esp-tts/esp_tts_chinese/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp-sr/include/esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp32-camera/driver/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/esp32-camera/conversions/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/include/fb_gfx/include" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4/tools/sdk/esp32/qio_qspi/include" -mlongcalls -Wno-frame-address -ffunction-sections -fdata-sections -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -ggdb -Os -freorder-blocks -Wwrite-strings -fstack-protector -fstrict-volatile-bitfields -Wno-error=unused-but-set-variable -fno-jump-tables -fno-tree-switch-conversion -std=gnu++11 -fexceptions -fno-rtti -MMD -c -w -DF_CPU=240000000L -DARDUINO=10607 -DARDUINO_ESP32_DEV -DARDUINO_ARCH_ESP32 "-DARDUINO_BOARD=\"ESP32_DEV\"" "-DARDUINO_VARIANT=\"esp32\"" -DARDUINO_PARTITION_huge_app -DESP32 -DCORE_DEBUG_LEVEL=0 -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue -mfix-esp32-psram-cache-strategy=memw -DARDUINO_USB_CDC_ON_BOOT=0 "@C:\\Users\\11016\\AppData\\Local\\arduino\\sketches\\0EEE3D2B537D80DA7537EC51C47A096B/build_opt.h" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4\\cores\\esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4\\variants\\esp32" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4\\libraries\\WiFi\\src" "-Ic:\\Users\\11016\\Documents\\Arduino\\libraries\\shibie_inferencing\\src" "-Ic:\\Users\\11016\\Documents\\Arduino\\libraries\\Adafruit_SSD1306" "-Ic:\\Users\\11016\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library" "-Ic:\\Users\\11016\\Documents\\Arduino\\libraries\\Adafruit_BusIO" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4\\libraries\\Wire\\src" "-IC:\\Users\\11016\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.4\\libraries\\SPI\\src" "C:\\Users\\11016\\AppData\\Local\\arduino\\sketches\\0EEE3D2B537D80DA7537EC51C47A096B\\sketch\\sketch_jul18c.ino.cpp" -o "C:\\Users\\11016\\AppData\\Local\\arduino\\sketches\\0EEE3D2B537D80DA7537EC51C47A096B\\sketch\\sketch_jul18c.ino.cpp.o" C:\Users\11016\Desktop\sketch_jul18c\sketch_jul18c.ino:22:19: error: 'PIXFORMAT_GRAY' was not declared in this scope .pixel_format = PIXFORMAT_GRAY, // 灰度图减少处理负载 ^~~~~~~~~~~~~~ C:\Users\11016\Desktop\sketch_jul18c\sketch_jul18c.ino:22:19: note: suggested alternative: 'PIXFORMAT_RAW' .pixel_format = PIXFORMAT_GRAY, // 灰度图减少处理负载 ^~~~~~~~~~~~~~ PIXFORMAT_RAW C:\Users\11016\Desktop\sketch_jul18c\sketch_jul18c.ino: In function 'int raw_feature_get_data(size_t, size_t, float*)': C:\Users\11016\Desktop\sketch_jul18c\sketch_jul18c.ino:84:19: error: 'fb' was not declared in this scope out_ptr[i] = (fb->buf[pixel_ix] << 8) | fb->buf[pixel_ix+1]; // 灰度转float ^~ Using library WiFi at version 2.0.0 in folder: C:\Users\11016\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\WiFi Using library shibie_inferencing at version 1.0.1 in folder: C:\Users\11016\Documents\Arduino\libraries\shibie_inferencing Using library Adafruit SSD1306 at version 2.5.15 in folder: C:\Users\11016\Documents\Arduino\libraries\Adafruit_SSD1306 Using library Adafruit GFX Library at version 1.12.1 in folder: C:\Users\11016\Documents\Arduino\libraries\Adafruit_GFX_Library Using library Adafruit BusIO at version 1.17.2 in folder: C:\Users\11016\Documents\Arduino\libraries\Adafruit_BusIO Using library Wire at version 2.0.0 in folder: C:\Users\11016\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\Wire Using library SPI at version 2.0.0 in folder: C:\Users\11016\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\SPI exit status 1 Compilation error: 'PIXFORMAT_GRAY' was not declared in this scope

pdf
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。

最新推荐

recommend-type

优化算法基于四则运算的算术优化算法原理与Python实现:面向图像分割的全局寻优方法研究

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
recommend-type

【微信小程序源码】图文信息;欢迎页面,音乐控制.zip

资源说明: 1:本资料仅用作交流学习参考,请切勿用于商业用途。 2:一套精品实用微信小程序源码资源,无论是入门练手还是项目复用都超实用,省去重复开发时间,让开发少走弯路! 更多精品资源请访问 https://blog.csdn.net/ashyyyy/article/details/146464041
recommend-type

bedrock-testing-support-7.0.4.jar中文-英文对照文档.zip

1、压缩文件中包含: 中文-英文对照文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

【微信小程序源码】物业管理.zip

资源说明: 1:本资料仅用作交流学习参考,请切勿用于商业用途。 2:一套精品实用微信小程序源码资源,无论是入门练手还是项目复用都超实用,省去重复开发时间,让开发少走弯路! 更多精品资源请访问 https://blog.csdn.net/ashyyyy/article/details/146464041
recommend-type

grpc-services-1.68.1.jar中文-英文对照文档.zip

1、压缩文件中包含: 中文-英文对照文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

Docker化部署TS3AudioBot教程与实践

### 标题知识点 #### TS3AudioBot_docker - **Dockerfile的用途与组成**:Dockerfile是一个文本文件,包含了所有构建Docker镜像的命令。开发者可以通过编辑Dockerfile来指定Docker镜像创建时所需的所有指令,包括基础镜像、运行时指令、环境变量、软件安装、文件复制等。TS3AudioBot_docker表明这个Dockerfile与TS3AudioBot项目相关,TS3AudioBot可能是一个用于TeamSpeak 3服务器的音频机器人,用于播放音频或与服务器上的用户进行交互。 - **Docker构建过程**:在描述中,有两种方式来获取TS3AudioBot的Docker镜像。一种是从Dockerhub上直接运行预构建的镜像,另一种是自行构建Docker镜像。自建过程会使用到docker build命令,而从Dockerhub运行则会用到docker run命令。 ### 描述知识点 #### Docker命令的使用 - **docker run**:这个命令用于运行一个Docker容器。其参数说明如下: - `--name tsbot`:为运行的容器指定一个名称,这里命名为tsbot。 - `--restart=always`:设置容器重启策略,这里是总是重启,确保容器在失败后自动重启。 - `-it`:这是一对参数,-i 表示交互式操作,-t 分配一个伪终端。 - `-d`:表示后台运行容器。 - `-v /home/tsBot/data:/data`:将宿主机的/home/tsBot/data目录挂载到容器内的/data目录上,以便持久化存储数据。 - `rofl256/tsaudiobot` 或 `tsaudiobot`:指定Docker镜像名称。前者可能是从DockerHub上获取的带有用户名命名空间的镜像,后者是本地构建或已重命名的镜像。 #### Docker构建流程 - **构建镜像**:使用docker build命令可以将Dockerfile中的指令转化为一个Docker镜像。`docker build . -t tsaudiobot`表示从当前目录中读取Dockerfile,并创建一个名为tsaudiobot的镜像。构建过程中,Docker会按顺序执行Dockerfile中的指令,比如FROM、RUN、COPY等,最终形成一个包含所有依赖和配置的应用镜像。 ### 标签知识点 #### Dockerfile - **Dockerfile的概念**:Dockerfile是一个包含创建Docker镜像所有命令的文本文件。它被Docker程序读取,用于自动构建Docker镜像。Dockerfile中的指令通常包括安装软件、设置环境变量、复制文件等。 - **Dockerfile中的命令**:一些常用的Dockerfile命令包括: - FROM:指定基础镜像。 - RUN:执行命令。 - COPY:将文件或目录复制到镜像中。 - ADD:类似于COPY,但是 ADD 支持从URL下载文件以及解压 tar 文件。 - ENV:设置环境变量。 - EXPOSE:声明端口。 - VOLUME:创建挂载点。 - CMD:容器启动时要运行的命令。 - ENTRYPOINT:配置容器启动时的执行命令。 ### 压缩包子文件的文件名称列表知识点 #### 文件命名 - **TS3AudioBot_docker-main**:此文件名表明了这是一个主要的代码库或Dockerfile的存放位置。在开发中,通常main分支代表当前的主版本或正在积极开发的分支。因此TS3AudioBot_docker-main可能表示这是在Dev分支上开发的Dockerfile的主要代码版本。主分支一般比较稳定,并作为新的特性开发的基础。 ### 综合知识点 - **Docker在DevOps中的角色**:Docker作为一种轻量级的容器化技术,在DevOps领域扮演重要角色。它可以快速部署、一致的运行环境、便于测试和迁移应用。通过Dockerfile的编写和docker build命令,开发者可以构建可移植的容器镜像,通过docker run命令则可以快速启动容器实例。 - **TS3AudioBot与TeamSpeak**:TS3AudioBot很可能是一个针对TeamSpeak 3服务器的自动化解决方案。TeamSpeak是一个语音通讯软件,广泛用于线上游戏团队进行沟通。一个音频机器人可以提供自动化的消息通知、音频流控制等功能,提高游戏社区的交流效率。 - **Docker镜像的版本管理**:镜像的命名通常包括用户名、项目名和标签。如rofl256/tsaudiobot中rofl256可能是一个用户名,tsaudiobot可能是项目名称,这样的命名规则有利于镜像的共享和管理。 在介绍以上知识点后,我们理解了标题、描述、标签及文件名称列表中所含的知识点。这些知识点涵盖了Dockerfile的构建、Docker镜像的使用、TS3AudioBot功能以及版本控制等多个方面,为IT专业人员在使用和开发Docker相关项目时提供了必要的信息。
recommend-type

零售销售数据的探索性分析与DeepAR模型预测

### 零售销售数据的探索性分析与DeepAR模型预测 #### 1. 探索性数据分析 在拥有45家商店的情况下,我们选择了第20号商店,来分析其不同部门在三年间的销售表现。借助DeepAR算法,我们可以了解不同部门商品的销售情况。 在SageMaker中,通过生命周期配置(Lifecycle Configurations),我们可以在笔记本实例启动前自定义安装Python包,避免在执行笔记本前手动跟踪所需的包。为了探索零售销售数据,我们需要安装最新版本(0.9.0)的seaborn库。具体操作步骤如下: 1. 在SageMaker的Notebook下,点击Lifecycle Config
recommend-type

llm agent平台

<think>好的,我现在需要帮用户寻找与LLM代理平台解决方案相关的信息。首先,我得明确用户的需求。用户提到了“LLM agent platform solutions”,也就是大型语言模型代理平台的解决方案。这可能涉及到如何构建、部署或优化基于LLM的代理系统。接下来,我应该回忆之前用户提供的引用内容,看看有没有相关的信息可以利用。 根据引用[1],提到构建LLM应用程序的步骤分解,可能涉及到代理平台的设计。引用[2]讨论了评估LLM的挑战,包括可重复性和开源模型的解决方案,这可能影响代理平台的稳定性和选择。引用[3]则提到大模型相关的岗位和面试题,可能涉及实际应用中的技术问题。 接下
recommend-type

Docker实现OAuth2代理:安全的HTTPS解决方案

### 知识点详细说明: #### Dockerfile基础 Dockerfile是一种文本文件,它包含了用户创建Docker镜像所需的命令和参数。Docker通过读取Dockerfile中的指令自动构建镜像。Dockerfile通常包含了如下载基础镜像、安装软件包、执行脚本等指令。 #### Dockerfile中的常用指令 1. **FROM**: 指定基础镜像,所有的Dockerfile都必须以FROM开始。 2. **RUN**: 在构建过程中执行命令,如安装软件。 3. **CMD**: 设置容器启动时运行的命令,可以被docker run命令后面的参数覆盖。 4. **EXPOSE**: 告诉Docker容器在运行时监听指定的网络端口。 5. **ENV**: 设置环境变量。 6. **ADD**: 将本地文件复制到容器中,如果是tar归档文件会自动解压。 7. **ENTRYPOINT**: 设置容器启动时的默认命令,不会被docker run命令覆盖。 8. **VOLUME**: 创建一个挂载点以挂载外部存储,如磁盘或网络文件系统。 #### OAuth 2.0 Proxy OAuth 2.0 Proxy 是一个轻量级的认证代理,用于在应用程序前提供OAuth认证功能。它主要通过HTTP重定向和回调机制,实现对下游服务的安全访问控制,支持多种身份提供商(IdP),如Google, GitHub等。 #### HTTPS和SSL/TLS HTTPS(HTTP Secure)是HTTP的安全版本,它通过SSL/TLS协议加密客户端和服务器之间的通信。使用HTTPS可以保护数据的机密性和完整性,防止数据在传输过程中被窃取或篡改。SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是用来在互联网上进行通信时加密数据的安全协议。 #### Docker容器与HTTPS 为了在使用Docker容器时启用HTTPS,需要在容器内配置SSL/TLS证书,并确保使用443端口。这通常涉及到配置Nginx或Apache等Web服务器,并将其作为反向代理运行在Docker容器内。 #### 临时分叉(Fork) 在开源领域,“分叉”指的是一种特殊的复制项目的行为,通常是为了对原项目进行修改或增强功能。分叉的项目可以独立于原项目发展,并可选择是否合并回原项目。在本文的语境下,“临时分叉”可能指的是为了实现特定功能(如HTTPS支持)而在现有Docker-oauth2-proxy项目基础上创建的分支版本。 #### 实现步骤 要实现HTTPS支持的docker-oauth2-proxy,可能需要进行以下步骤: 1. **准备SSL/TLS证书**:可以使用Let's Encrypt免费获取证书或自行生成。 2. **配置Nginx/Apache服务器**:在Dockerfile中添加配置,以使用SSL证书和代理设置。 3. **修改OAuth2 Proxy设置**:调整OAuth2 Proxy配置以使用HTTPS连接。 4. **分叉Docker-oauth2-proxy项目**:创建项目的分支副本,以便进行修改。 5. **编辑Dockerfile**:在分叉的项目中编写或修改Dockerfile,包括下载基础镜像、设置环境变量、添加SSL证书、配置Nginx/Apache和OAuth2 Proxy等步骤。 6. **构建和测试新镜像**:使用Docker构建镜像,并在安全环境中进行测试,确保HTTPS配置正确,并且OAuth2 Proxy功能正常工作。 7. **部署到生产环境**:在确认无误后,将配置好的镜像部署到生产环境中。 #### 压缩包子文件的文件名称列表 - **docker-oauth2-proxy-master**: 这可能是指在GitHub等代码托管平台上,docker-oauth2-proxy项目的主分支或主仓库。名称列表中的“master”暗示了该文件夹包含的是主分支的代码。 总结来说,要实现一个支持HTTPS的docker-oauth2-proxy,开发者需要进行一系列的配置和编码工作,包括使用Dockerfile来构建自定义的Docker镜像,配置SSL/TLS证书,分叉并修改现有的开源项目代码。通过这些步骤,可以确保OAuth2 Proxy能够安全地处理HTTPS请求,并为下游服务提供安全认证功能。
recommend-type

利用AmazonSageMaker进行图像分类:从理论到实践

# 利用 Amazon SageMaker 进行图像分类:从理论到实践 ## 1. 主题建模与图像分类概述 在数据科学领域,从大量非结构化数据中提取信息和主题至关重要。像 SageMaker 的神经主题模型(NTM)这类主题建模技术,提供了线性和非线性学习方法,能帮助我们深入挖掘数据中的潜在主题。它通过特定的架构和内部机制工作,还支持分布式训练,将数据集分割成多个块进行并行处理。训练完成后,我们可以将模型部署为端点并进行推理,例如解读安然邮件中的主题。 图像分类在过去五年中一直是热门研究领域,因为它能解决众多行业的实际业务问题,如自动驾驶汽车行业就高度依赖图像分类和目标检测模型的准确性。A