From 56c1716726491f99f410493f400caf6924e9c936 Mon Sep 17 00:00:00 2001 From: OPTOC <9159397+optoc@user.noreply.gitee.com> Date: Thu, 28 Aug 2025 16:04:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0STAwifi=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E4=BF=AE=E6=94=B9=E7=81=AF=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data_port/ble_spp/ble_spp_server.c | 4 +- app/drivers/led_strip/led_strip.c | 18 ++- app/drivers/led_strip/led_strip.h | 4 + app/drivers/sertrf/device.c | 135 ++++++++++++++---- app/drivers/sertrf/device.h | 24 +++- app/drivers/sertrf/sertrf.c | 88 +++++++++--- app/drivers/sertrf/sertrf.h | 10 +- .../sdkconfig.release_SERTRF_esp32c3.defaults | 1 + 8 files changed, 230 insertions(+), 54 deletions(-) diff --git a/app/drivers/data_port/ble_spp/ble_spp_server.c b/app/drivers/data_port/ble_spp/ble_spp_server.c index caa6ed9..b6a87fa 100644 --- a/app/drivers/data_port/ble_spp/ble_spp_server.c +++ b/app/drivers/data_port/ble_spp/ble_spp_server.c @@ -511,7 +511,7 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_ size_t len = os_pipe_fifo_fill(&port_data->pipe_obj, p_data->write.value, p_data->write.len); if (len < p_data->write.len) { - SYS_LOG_WRN("Pipeline cache exceeded %d bytes", p_data->write.len - len); + SYS_LOG_WRN("read Pipeline cache exceeded %d bytes", p_data->write.len - len); } } else @@ -559,7 +559,7 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_ size_t len = os_pipe_fifo_fill(&port_data->pipe_obj, fifo->data, fifo->len); if (len < p_data->write.len) { - SYS_LOG_WRN("Pipeline cache exceeded %d bytes", p_data->write.len - len); + SYS_LOG_WRN("write Pipeline cache exceeded %d bytes", p_data->write.len - len); } os_fifo_free(fifo); diff --git a/app/drivers/led_strip/led_strip.c b/app/drivers/led_strip/led_strip.c index 3af327b..d208a54 100644 --- a/app/drivers/led_strip/led_strip.c +++ b/app/drivers/led_strip/led_strip.c @@ -11,10 +11,12 @@ uint16_t toggle_cycle = 1000; static uint8_t rgb_color_index = RGB_COLOR_RAD; rgb_color_t rgb_color_rad = {0,255,0,0,0}; +rgb_color_t rgb_color_orange = {0,255,80,0,0}; rgb_color_t rgb_color_green = {0,0,255,0,0}; rgb_color_t rgb_color_blue = {0,0,0,255,0}; - - +rgb_color_t rgb_color_cyan = {0,0,255,255,0}; +rgb_color_t rgb_color_purple = {0,255,0,255,0}; +rgb_color_t rgb_color_white = {0,255,255,255,0}; void led_strip_init(void) { @@ -71,9 +73,21 @@ void _work_rgb_led(void *arg) case RGB_COLOR_RAD: expression = &rgb_color_rad; break; + case RGB_COLOR_ORANGE: + expression = &rgb_color_orange; + break; case RGB_COLOR_GREEN: expression = &rgb_color_green; break; + case RGB_COLOR_WHITE: + expression = &rgb_color_white; + break; + case RGB_COLOR_PURPLE: + expression = &rgb_color_purple; + break; + case RGB_COLOR_CYAN: + expression = &rgb_color_cyan; + break; case RGB_COLOR_BLUE: expression = &rgb_color_blue; break; diff --git a/app/drivers/led_strip/led_strip.h b/app/drivers/led_strip/led_strip.h index d3c7de3..7030560 100644 --- a/app/drivers/led_strip/led_strip.h +++ b/app/drivers/led_strip/led_strip.h @@ -35,7 +35,11 @@ typedef struct rgb_color_s typedef enum { RGB_COLOR_RAD = 0, + RGB_COLOR_ORANGE, RGB_COLOR_GREEN, + RGB_COLOR_WHITE, + RGB_COLOR_PURPLE, + RGB_COLOR_CYAN, RGB_COLOR_BLUE, }RGB_COLOR; diff --git a/app/drivers/sertrf/device.c b/app/drivers/sertrf/device.c index 51827c5..7eb6a88 100644 --- a/app/drivers/sertrf/device.c +++ b/app/drivers/sertrf/device.c @@ -40,19 +40,19 @@ uint8_t device_init(device_t *port) { SYS_LOG_ERR("embedded device choice error"); } - //默认蓝牙 val - res = pc_device_choice(port, DATA_PORT_TYPE_WIFI); - res = pc_device_choice_inside(port, DATA_PORT_TYPE_BLE_VAL, 0); + //默认BLE模式 + res = pc_device_choice_inside(port, DATA_PORT_TYPE_BLE_VAL, DISCONNECT); if(res == DEVICE_PC_ERROR) { SYS_LOG_ERR("pc device choice error"); } + SYS_LOG_INF("device init success"); return DEVICE_OK; } uint8_t uart_init(init_device_t *port) { // port->uart_port = sb_uart_port_bind(g_cfg_board->uart_fc.id, g_cfg_board->uart_fc.br, g_cfg_board->uart_fc.pin_txd.pin, g_cfg_board->uart_fc.pin_rxd.pin, g_cfg_board->uart_fc.irq_prior, 1024, 0, NULL); - port->uart_port = sb_uart_port_bind(1, 115200, 0, 10, 21, 1024, 0, NULL); + port->uart_port = sb_uart_port_bind(1, 115200, 21, 20, 21, 1024, 0, NULL); if(port->uart_port == NULL) { @@ -76,7 +76,7 @@ static void ble_server_connect_handler(ble_server_status_t status) } SYS_LOG_INF("ble Connected"); } else if(status == BLE_SERVER_STATUS_DISCONNECTED){ - uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_BLE_VAL, 0); + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_BLE_VAL, DISCONNECT); if(res == DEVICE_PC_ERROR){ } SYS_LOG_INF("ble dis Connected"); @@ -122,14 +122,54 @@ static void wifi_event_handler(bool is_connect, sb_data_port_t *port) { //实现自动切换发送对象 if(is_connect){ - uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI, CONNECT_WIFI); + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_TCP, CONNECT_WIFI_TCP); if(res == DEVICE_PC_ERROR) { SYS_LOG_ERR("wifi pc device choice error"); } SYS_LOG_INF("wifi connect"); }else{ - uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI, 0); + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_UDP, CONNECT_WIFI_UDP); + if(res == DEVICE_PC_ERROR) + { + SYS_LOG_ERR("wifi pc device choice error"); + } + SYS_LOG_INF("wifi disconnect"); + } +} +static void wifi_ap_connect_handler(wifi_ap_connect_status_t status, uint8_t connect_cnt) +{ + SYS_LOG_WRN("wifi ap connect status %d %d", (int)status, (int)connect_cnt); + //实现自动切换发送对象 + if((connect_cnt == 1 && status == WIFI_AP_CONNECT_GOT_STA)){ + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_UDP, CONNECT_WIFI_UDP); + if(res == DEVICE_PC_ERROR) + { + SYS_LOG_ERR("wifi pc device choice error"); + } + SYS_LOG_INF("wifi connect"); + }else{ + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_UDP, DISCONNECT); + if(res == DEVICE_PC_ERROR) + { + SYS_LOG_ERR("wifi pc device choice error"); + } + SYS_LOG_INF("wifi disconnect"); + } +} +static void wifi_sta_connect_handler(wifi_sta_connect_status_t status, uint8_t ip_v4[4]) +{ + SYS_LOG_WRN("wifi ap connect status %d", (int)status); + //实现自动切换发送对象 + if(status == WIFI_STA_CONNECT_GOT_IP){ + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_UDP, CONNECT_WIFI_UDP); + if(res == DEVICE_PC_ERROR) + { + SYS_LOG_ERR("wifi pc device choice error"); + } + SYS_LOG_INF("wifi connect"); + }else{ + uint8_t res = pc_device_choice_inside(NULL, DATA_PORT_TYPE_WIFI_UDP, DISCONNECT); if(res == DEVICE_PC_ERROR) { SYS_LOG_ERR("wifi pc device choice error"); @@ -148,22 +188,23 @@ uint8_t wifi_init(init_device_t *port) .gw_v4 = {192, 168, 1, 1}, .mask_v4 = {255, 255, 255, 0}, .max_connection = 1, - .connect_cb = NULL, + .connect_cb = wifi_ap_connect_handler, }, .sta = { #if 0 .ssid = "KFXJ", .password = "Kfdx201*", #else - .ssid = "SDWAN", - .password = "Dxltkj201", + .ssid = "Sertorf_sta", + .password = "12345678", #endif - .connect_cb = NULL, + .connect_cb = wifi_sta_connect_handler, }, }; wifi_netif_init(&init_struct); wifi_set_mode(WIFI_NETIF_MODE_AP); + // wifi_set_mode(WIFI_NETIF_MODE_STA); // 初始化socket socket_inet_init(); @@ -176,17 +217,51 @@ uint8_t wifi_init(init_device_t *port) .rx_resume_work = NULL, }; - port->wifi = socket_inet_server_bind_tcp(port->tcp_listen, &bind_param); + port->wifi_tcp = socket_inet_server_bind_tcp(port->tcp_listen, &bind_param); - if (port->wifi) + port->wifi_udp = socket_inet_server_bind_udp(14550, &bind_param); + + if (port->wifi_tcp) { - sb_data_port_start(port->wifi); + sb_data_port_start(port->wifi_tcp); } + if (port->wifi_udp) + { + sb_data_port_start(port->wifi_udp); + } + + wifi_mode_switch(port); wifi_start(); return DEVICE_OK; } +void wifi_mode_switch(init_device_t *port) +{ + static init_device_t* port_lat = NULL; + static bool wifi_mode_flag = false; + if(port_lat == NULL && port != NULL) + { + port_lat = port; + return; + } + + if (wifi_mode_flag) + { + wifi_mode_flag = false; + wifi_set_mode(WIFI_NETIF_MODE_AP); + port_lat->wifi_mode = WIFI_NETIF_MODE_AP; + SYS_LOG_INF("wifi mode switch to ap"); + } + else + { + wifi_mode_flag = true; + wifi_set_mode(WIFI_NETIF_MODE_STA); + port_lat->wifi_mode = WIFI_NETIF_MODE_STA; + SYS_LOG_INF("wifi mode switch to sta"); + } + wifi_start(); +} uint8_t embedded_device_choice(device_t *port, uint8_t type) { //端口与PC一致 @@ -202,8 +277,11 @@ uint8_t embedded_device_choice(device_t *port, uint8_t type) case DATA_PORT_TYPE_UART: port->embedded_device = port->init_device.uart_port; break; - case DATA_PORT_TYPE_WIFI: - port->embedded_device = port->init_device.wifi; + case DATA_PORT_TYPE_WIFI_TCP: + port->embedded_device = port->init_device.wifi_tcp; + break; + case DATA_PORT_TYPE_WIFI_UDP: + port->embedded_device = port->init_device.wifi_udp; break; case DATA_PORT_TYPE_BLE_CMD: port->embedded_device = port->init_device.ble_spp_server_cmd; @@ -241,17 +319,15 @@ uint32_t embedded_device_get_rx_length(device_t *port) static uint8_t pc_device_choice_inside(device_t *port, uint8_t type, uint8_t connect) { static device_t* port_device_inside = NULL; - // if(port_device_inside == NULL && port == NULL) - // { - // SYS_LOG_WRN("pc_device_choice_inside error port is null"); - // return DEVICE_PC_ERROR; - // } - if(port == NULL && port_device_inside != NULL){ + SYS_LOG_WRN("pc_device_choice_inside type %d connect %d", type, connect); + if(port != NULL && port_device_inside == NULL){ + SYS_LOG_INF("pc_device_choice_inside"); + pc_device_choice(port, type); + port_device_inside = port; + port_device_inside->connect_pc = connect; + }else if(port == NULL && port_device_inside != NULL && (port_device_inside->pc_device_type == type || connect != DISCONNECT)){ pc_device_choice(port_device_inside, type); port_device_inside->connect_pc = connect; - }else{ - SYS_LOG_INF("pc_device_choice_inside"); - port_device_inside = port; } return DEVICE_OK; } @@ -270,8 +346,11 @@ uint8_t pc_device_choice(device_t *port, uint8_t type) case DATA_PORT_TYPE_UART: port->pc_device = port->init_device.uart_port; break; - case DATA_PORT_TYPE_WIFI: - port->pc_device = port->init_device.wifi; + case DATA_PORT_TYPE_WIFI_TCP: + port->pc_device = port->init_device.wifi_tcp; + break; + case DATA_PORT_TYPE_WIFI_UDP: + port->pc_device = port->init_device.wifi_udp; break; case DATA_PORT_TYPE_BLE_CMD: port->pc_device = port->init_device.ble_spp_server_cmd; @@ -285,7 +364,7 @@ uint8_t pc_device_choice(device_t *port, uint8_t type) if(port->pc_device == NULL) { - SYS_LOG_WRN("embedded device choice error"); + SYS_LOG_WRN("pc device choice error"); return DEVICE_PC_ERROR; } diff --git a/app/drivers/sertrf/device.h b/app/drivers/sertrf/device.h index f953358..8516b5d 100644 --- a/app/drivers/sertrf/device.h +++ b/app/drivers/sertrf/device.h @@ -28,8 +28,10 @@ enum DEVICE_ERROR }; enum DATA_PORT_TYPE { - DATA_PORT_TYPE_UART = 1, - DATA_PORT_TYPE_WIFI, + DATA_PORT_TYPE_NONE = 0, + DATA_PORT_TYPE_UART, + DATA_PORT_TYPE_WIFI_TCP, + DATA_PORT_TYPE_WIFI_UDP, DATA_PORT_TYPE_BLE_CMD, DATA_PORT_TYPE_BLE_VAL }; @@ -38,7 +40,15 @@ enum CONNECT_TYPE DISCONNECT = 0, CONNECT_UART, CONNECT_BLE, - CONNECT_WIFI + CONNECT_WIFI_TCP, + CONNECT_WIFI_UDP, +}; +enum WIFI_MODE +{ + AP_TCP, + STA_TCP, + AP_UDP, + STA_UDP }; typedef struct { @@ -47,7 +57,9 @@ typedef struct sb_data_port_t* ble_spp_server_val; sb_data_port_t* ble_spp_client_cmd; sb_data_port_t* ble_spp_client_val; - sb_data_port_t* wifi; + sb_data_port_t* wifi_tcp; + sb_data_port_t* wifi_udp; + uint8_t wifi_mode; socket_listen_tcp_t tcp_listen; }init_device_t; @@ -96,6 +108,10 @@ uint8_t ble_init(init_device_t *port); * @retval 0 成功 */ uint8_t wifi_init(init_device_t *port); +/** + * @brief WIFI 模式切换 + */ +void wifi_mode_switch(init_device_t *port); /** * @brief 嵌入式设备数据接口 * diff --git a/app/drivers/sertrf/sertrf.c b/app/drivers/sertrf/sertrf.c index 3188cf2..020f0c8 100644 --- a/app/drivers/sertrf/sertrf.c +++ b/app/drivers/sertrf/sertrf.c @@ -12,6 +12,9 @@ void sertrf_init(void) } //RGB灯 work_rgb_led_start(); + //按键初始化 + button_work_init(); + //线程启动 sertrf_start(); } void sertrf_start(void) @@ -35,37 +38,90 @@ void embedded_thread(void* arg) // SYS_LOG_INF("data : %s", data); pc_device_write(&sertrf.device, data, embedded_size); } - embedded_size = pc_device_get_rx_length(&sertrf.device); - if(embedded_size > 0) + + uint32_t pc_size = pc_device_get_rx_length(&sertrf.device); + + if(pc_size > 0) { - uint8_t data[embedded_size]; - pc_device_read(&sertrf.device, data, embedded_size); + uint8_t data[pc_size]; + pc_device_read(&sertrf.device, data, pc_size); // SYS_LOG_INF("data : %s", data); - embedded_device_write(&sertrf.device, data, embedded_size); + embedded_device_write(&sertrf.device, data, pc_size); } - pc_link_rgb_color(sertrf.device.connect_pc); + // printf_chill_time(10,1000); + pc_link_rgb_color(&sertrf.device); //需要添加一些延时,否则会卡死,导致看门狗复位 // vTaskDelay(( TickType_t ) 1000 / configTICK_RATE_HZ); os_thread_sleep(1); } } -void pc_link_rgb_color(uint8_t connect) +void pc_link_rgb_color(device_t* device) { - static uint8_t last_connect = 0; - if(connect != last_connect) + static uint8_t last_connect = 0, last_wifi_mode = 0; + if(device->connect_pc != last_connect || last_wifi_mode != device->init_device.wifi_mode) { - switch (connect) + switch (device->connect_pc) { case DISCONNECT: - rgb_color_change(0, RGB_COLOR_RAD); + { + if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) + rgb_color_change(0, RGB_COLOR_BLUE); + else + rgb_color_change(0, RGB_COLOR_ORANGE); + break; - case CONNECT_WIFI: + } + case CONNECT_WIFI_TCP: + { + if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) + rgb_color_change(0, RGB_COLOR_WHITE); + else + rgb_color_change(0, RGB_COLOR_PURPLE); + + break; + } + case CONNECT_WIFI_UDP: + { + if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) + rgb_color_change(0, RGB_COLOR_WHITE); + else + rgb_color_change(0, RGB_COLOR_PURPLE); + + break; + } + case CONNECT_BLE: rgb_color_change(0, RGB_COLOR_GREEN); break; - case CONNECT_BLE: - rgb_color_change(0, RGB_COLOR_BLUE); - break; } - last_connect = connect; + last_connect = device->connect_pc; + last_wifi_mode = device->init_device.wifi_mode; + } + if(device->connect_pc){ + rgb_update_cyle(0); + }else{ + rgb_update_cyle(500); } } + +void printf_chill_time(uint8_t chill_time, uint16_t type) +{ + static size_t last_time[24] = {0}; + static uint16_t cnt[24] = {0}; + static uint32_t type_cnt_time[24] = {0}; + size_t now_time = os_get_sys_time(); + cnt[chill_time]++; + type_cnt_time[chill_time] += now_time - last_time[chill_time]; + if(cnt[chill_time] % type == 0 && type_cnt_time[chill_time] / type >= now_time - last_time[chill_time] - 1) + { + SYS_LOG_INF("TIME_CHILL%d : %d : %d",chill_time, now_time - last_time[chill_time], type_cnt_time[chill_time]); + cnt[chill_time] = 0; + type_cnt_time[chill_time] = 0; + } + else if(cnt[chill_time] % type == 0) + { + SYS_LOG_WRN("TIME_CHILL%d : %d : %d",chill_time, now_time - last_time[chill_time], type_cnt_time[chill_time]); + cnt[chill_time] = 0; + type_cnt_time[chill_time] = 0; + } + last_time[chill_time] = now_time; +} \ No newline at end of file diff --git a/app/drivers/sertrf/sertrf.h b/app/drivers/sertrf/sertrf.h index 92cde7b..4a8228a 100644 --- a/app/drivers/sertrf/sertrf.h +++ b/app/drivers/sertrf/sertrf.h @@ -2,7 +2,7 @@ #include "device.h" #include "../led_strip/led_strip.h" - +#include "key.h" typedef struct { device_t device; @@ -36,6 +36,12 @@ void sertrf_status(void); void embedded_thread(void* arg); /** * @brief 根据连接状态显示不同的颜色 + * + * @param connect 连接状态 */ -void pc_link_rgb_color(uint8_t connect); +void pc_link_rgb_color(device_t* device); +/** + * @brief 打印时间间隔 +*/ +void printf_chill_time(uint8_t chill_time, uint16_t type); diff --git a/sdkconfig_defaults/sdkconfig.release_SERTRF_esp32c3.defaults b/sdkconfig_defaults/sdkconfig.release_SERTRF_esp32c3.defaults index 3240b11..b60e1b0 100644 --- a/sdkconfig_defaults/sdkconfig.release_SERTRF_esp32c3.defaults +++ b/sdkconfig_defaults/sdkconfig.release_SERTRF_esp32c3.defaults @@ -6,6 +6,7 @@ CONFIG_BOOTLOADER_LOG_LEVEL_WARN=y CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_BT_ENABLED=y +CONFIG_ESP_WIFI_ENABLED=y CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y