From 133118949ef179614a30e651f8b4a8ee0d1568d9 Mon Sep 17 00:00:00 2001 From: JeffMboya Date: Mon, 13 Jan 2025 09:40:21 +0300 Subject: [PATCH] Fix STA mode --- .../boards/esp32s3_devkitc_procpu.conf | 15 +- .../boards/esp32s3_devkitc_procpu.overlay | 9 +- embed-proplet/prj.conf | 93 ++--- embed-proplet/src/main.c | 322 +++++++++--------- 4 files changed, 197 insertions(+), 242 deletions(-) diff --git a/embed-proplet/boards/esp32s3_devkitc_procpu.conf b/embed-proplet/boards/esp32s3_devkitc_procpu.conf index 775f041..8ec74a8 100644 --- a/embed-proplet/boards/esp32s3_devkitc_procpu.conf +++ b/embed-proplet/boards/esp32s3_devkitc_procpu.conf @@ -1,7 +1,10 @@ -# This file can be useful for board-specific overrides or testing alternative configurations without affecting the main project-wide settings. +# Wi-Fi Configuration +CONFIG_WIFI=y +CONFIG_WIFI_ESP32=y +CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4=y +CONFIG_ESP32_WIFI_AP_STA_MODE=n +CONFIG_WIFI_NM=y +CONFIG_WIFI_NM_MAX_MANAGED_INTERFACES=2 +CONFIG_WIFI_LOG_LEVEL_DBG=y +CONFIG_ESP32_WIFI_DEBUG_PRINT=y -# - CONFIG_LOG: Enables logging support in the system. -# - CONFIG_LOG_BUFFER_SIZE: Configures the size of the logging buffer. -# - CONFIG_LOG_MODE_IMMEDIATE: Ensures logs are immediately output without buffering. -# - CONFIG_LOG_DEFAULT_LEVEL: Sets the default logging verbosity level. -# - CONFIG_THREAD_RUNTIME_STATS: Enables tracking and reporting of thread runtime statistics. diff --git a/embed-proplet/boards/esp32s3_devkitc_procpu.overlay b/embed-proplet/boards/esp32s3_devkitc_procpu.overlay index a53651c..cdbd0d4 100644 --- a/embed-proplet/boards/esp32s3_devkitc_procpu.overlay +++ b/embed-proplet/boards/esp32s3_devkitc_procpu.overlay @@ -1,10 +1,3 @@ &wifi { status = "okay"; -}; - -/ { - wifi_ap: wifi_ap { - compatible = "espressif,esp32-wifi"; - status = "okay"; - }; -}; +}; \ No newline at end of file diff --git a/embed-proplet/prj.conf b/embed-proplet/prj.conf index bad29f0..1726911 100644 --- a/embed-proplet/prj.conf +++ b/embed-proplet/prj.conf @@ -1,52 +1,17 @@ -CONFIG_USERSPACE=y -CONFIG_STACK_SENTINEL=y - -CONFIG_MAIN_STACK_SIZE=4096 -CONFIG_HEAP_MEM_POOL_SIZE=16384 - -CONFIG_WIFI_CREDENTIALS_STATIC=y -CONFIG_WIFI_CREDENTIALS_STATIC_SSID="vive tu vida" -CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="IVYMARION3" -CONFIG_NET_L2_WIFI_MGMT=y -CONFIG_NET_MGMT=y -CONFIG_NET_MGMT_EVENT=y -CONFIG_NET_MGMT_EVENT_INFO=y - - -CONFIG_NET_IPV4=y -CONFIG_NET_IPV6=n -CONFIG_NET_TCP=y -CONFIG_NET_UDP=y -CONFIG_NET_DHCPV4=y -CONFIG_NETWORKING=y -CONFIG_NET_SOCKETS=y - -CONFIG_PRINTK=y -CONFIG_LOG=y -CONFIG_LOG_BUFFER_SIZE=8096 -CONFIG_LOG_MODE_IMMEDIATE=y -CONFIG_LOG_DEFAULT_LEVEL=4 -CONFIG_THREAD_RUNTIME_STATS=y - -CONFIG_JSON_LIBRARY=y - -CONFIG_FILE_SYSTEM=y - -CONFIG_MQTT_LIB=y -CONFIG_MQTT_LIB_CUSTOM_TRANSPORT=n -CONFIG_MQTT_LIB_TLS=n -CONFIG_MQTT_LIB_WEBSOCKET=n -CONFIG_MQTT_KEEPALIVE=60 - -CONFIG_ENTROPY_GENERATOR=y - +# Network Configuration CONFIG_NET_CONFIG_AUTO_INIT=n CONFIG_NET_CONNECTION_MANAGER=y -CONFIG_NET_CONNECTION_MANAGER_MONITOR_STACK_SIZE=4096 +CONFIG_NET_DHCPV4=y CONFIG_NET_DHCPV4_SERVER=y CONFIG_NET_IF_MAX_IPV4_COUNT=2 CONFIG_NET_IF_MAX_IPV6_COUNT=2 +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=n CONFIG_NET_L2_ETHERNET=y +CONFIG_NET_L2_WIFI_MGMT=y +CONFIG_NET_MGMT=y +CONFIG_NET_MGMT_EVENT=y +CONFIG_NET_MGMT_EVENT_INFO=y CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=10 CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096 CONFIG_NET_PKT_RX_COUNT=16 @@ -54,29 +19,27 @@ CONFIG_NET_PKT_TX_COUNT=16 CONFIG_NET_SOCKETS_SERVICE_STACK_SIZE=4096 CONFIG_NET_TCP=y CONFIG_NET_UDP=y +CONFIG_NETWORKING=y +# LOG Configuration +CONFIG_LOG=y CONFIG_NET_LOG=y +CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_NET_DHCPV4_SERVER_LOG_LEVEL_DBG=y -CONFIG_NET_DHCPV4=y - -CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4=y - -CONFIG_WIFI_ESP32=y -CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4=y -CONFIG_ESP32_WIFI_AP_STA_MODE=n -CONFIG_WIFI_NM=y -CONFIG_WIFI=y -CONFIG_WIFI_NM_MAX_MANAGED_INTERFACES=1 -CONFIG_ESP32_WIFI_STA_RECONNECT=y -CONFIG_WIFI_LOG_LEVEL_DBG=y -CONFIG_ESP32_WIFI_DEBUG_PRINT=y - -CONFIG_THREAD_ANALYZER=y -CONFIG_THREAD_ANALYZER_AUTO=y -CONFIG_THREAD_ANALYZER_AUTO_INTERVAL=5 -CONFIG_THREAD_ANALYZER_LOG_LEVEL_DBG=y -CONFIG_THREAD_ANALYZER_ISR_STACK_USAGE=y -CONFIG_THREAD_ANALYZER_LOG_LEVEL_DBG=y -CONFIG_ISR_STACK_SIZE=4096 -CONFIG_MAIN_STACK_SIZE=6144 \ No newline at end of file +#Network Buffer Configuration +CONFIG_NET_MAX_CONTEXTS=10 +CONFIG_NET_BUF_RX_COUNT=32 +CONFIG_NET_BUF_TX_COUNT=32 +CONFIG_NET_BUF_DATA_SIZE=512 +CONFIG_NET_RX_STACK_SIZE=4096 +CONFIG_NET_TX_STACK_SIZE=4096 +CONFIG_NET_PKT_RX_COUNT=64 +CONFIG_NET_PKT_TX_COUNT=64 + +CONFIG_EARLY_CONSOLE=y +CONFIG_INIT_STACKS=y +CONFIG_NET_STATISTICS=y +CONFIG_NET_STATISTICS_PERIODIC_OUTPUT=n +CONFIG_NET_MGMT_EVENT_QUEUE_TIMEOUT=5000 +CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=16 \ No newline at end of file diff --git a/embed-proplet/src/main.c b/embed-proplet/src/main.c index 792beef..023ac96 100644 --- a/embed-proplet/src/main.c +++ b/embed-proplet/src/main.c @@ -1,186 +1,182 @@ #include -#include -#include -#include -#include -#include -#include "wasm_handler.h" -#include -#include -#include -#include +#include #include #include -#define MQTT_BROKER_HOSTNAME "broker.supermq.example" -#define MQTT_BROKER_PORT 1883 -#define PROPLET_ID "proplet_01" -#define CHANNEL_ID "channel_01" -#define TOPIC_REQUEST "/channels/" CHANNEL_ID "/messages/registry/request" -#define TOPIC_RESPONSE "/channels/" CHANNEL_ID "/messages/registry/response" - -static struct mqtt_client client; -static struct sockaddr_storage broker_addr; -static uint8_t rx_buffer[512]; -static uint8_t tx_buffer[512]; -static int configure_broker(void) -{ - struct sockaddr_in *broker = (struct sockaddr_in *)&broker_addr; +LOG_MODULE_REGISTER(MAIN); - broker->sin_family = AF_INET; - broker->sin_port = htons(MQTT_BROKER_PORT); +#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" - int ret = net_addr_pton(AF_INET, MQTT_BROKER_HOSTNAME, &broker->sin_addr); - if (ret != 0) { - printk("Failed to configure broker address.\n"); - return -EINVAL; - } +#define NET_EVENT_WIFI_MASK \ + (NET_EVENT_WIFI_CONNECT_RESULT | NET_EVENT_WIFI_DISCONNECT_RESULT | \ + NET_EVENT_WIFI_AP_ENABLE_RESULT | NET_EVENT_WIFI_AP_DISABLE_RESULT | \ + NET_EVENT_WIFI_AP_STA_CONNECTED | NET_EVENT_WIFI_AP_STA_DISCONNECTED) - return 0; -} +/* AP Mode Configuration */ +#define WIFI_AP_SSID "ESP32S3-AP" +#define WIFI_AP_PSK "" +#define WIFI_AP_IP_ADDRESS "192.168.4.1" +#define WIFI_AP_NETMASK "255.255.255.0" -static void request_wasm_file(const char *app_name) -{ - char request_payload[128]; - snprintf(request_payload, sizeof(request_payload), "{\"app_name\":\"%s\"}", app_name); - - struct mqtt_publish_param pub_param = { - .message_id = sys_rand32_get(), - .message = { - .topic = { - .topic = { - .utf8 = TOPIC_REQUEST, - .size = strlen(TOPIC_REQUEST) - }, - .qos = MQTT_QOS_1_AT_LEAST_ONCE - }, - .payload = { - .data = request_payload, - .len = strlen(request_payload) - } - } - }; - - int ret = mqtt_publish(&client, &pub_param); - if (ret) { - printk("Failed to request Wasm file: %d\n", ret); - } else { - printk("Requested Wasm file: %s\n", app_name); - } -} +/* STA Mode Configuration */ +#define WIFI_SSID "Octavifi" +#define WIFI_PSK "Unic0rn_2030" + +static struct net_if *ap_iface; +static struct net_if *sta_iface; -static void mqtt_event_handler(struct mqtt_client *c, const struct mqtt_evt *evt) +static struct wifi_connect_req_params ap_config; +static struct wifi_connect_req_params sta_config; + +static struct net_mgmt_event_callback cb; + +static void wifi_event_handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, + struct net_if *iface) { - switch (evt->type) { - case MQTT_EVT_CONNACK: - printk("MQTT connected to broker.\n"); - break; - - case MQTT_EVT_PUBLISH: { - const struct mqtt_publish_param *p = &evt->param.publish; - - if (strncmp(p->message.topic.topic.utf8, TOPIC_RESPONSE, p->message.topic.topic.size) == 0) { - handle_wasm_chunk(p->message.payload.data, p->message.payload.len); - } - break; - } - case MQTT_EVT_DISCONNECT: - printk("MQTT disconnected.\n"); - break; - - case MQTT_EVT_PUBACK: - printk("MQTT publish acknowledged.\n"); - break; - - default: - printk("Unhandled MQTT event: %d\n", evt->type); - break; - } + switch (mgmt_event) { + case NET_EVENT_WIFI_CONNECT_RESULT: { + LOG_INF("Connected to %s", WIFI_SSID); + break; + } + case NET_EVENT_WIFI_DISCONNECT_RESULT: { + LOG_INF("Disconnected from %s", WIFI_SSID); + break; + } + case NET_EVENT_WIFI_AP_ENABLE_RESULT: { + LOG_INF("AP Mode is enabled. Waiting for station to connect"); + break; + } + case NET_EVENT_WIFI_AP_DISABLE_RESULT: { + LOG_INF("AP Mode is disabled."); + break; + } + case NET_EVENT_WIFI_AP_STA_CONNECTED: { + struct wifi_ap_sta_info *sta_info = (struct wifi_ap_sta_info *)cb->info; + + LOG_INF("station: " MACSTR " joined ", sta_info->mac[0], sta_info->mac[1], + sta_info->mac[2], sta_info->mac[3], sta_info->mac[4], sta_info->mac[5]); + break; + } + case NET_EVENT_WIFI_AP_STA_DISCONNECTED: { + struct wifi_ap_sta_info *sta_info = (struct wifi_ap_sta_info *)cb->info; + + LOG_INF("station: " MACSTR " leave ", sta_info->mac[0], sta_info->mac[1], + sta_info->mac[2], sta_info->mac[3], sta_info->mac[4], sta_info->mac[5]); + break; + } + default: + break; + } } -static int mqtt_client_setup(void) +static void enable_dhcpv4_server(void) { - mqtt_client_init(&client); + static struct in_addr addr; + static struct in_addr netmaskAddr; + + if (net_addr_pton(AF_INET, WIFI_AP_IP_ADDRESS, &addr)) { + LOG_ERR("Invalid address: %s", WIFI_AP_IP_ADDRESS); + return; + } + + if (net_addr_pton(AF_INET, WIFI_AP_NETMASK, &netmaskAddr)) { + LOG_ERR("Invalid netmask: %s", WIFI_AP_NETMASK); + return; + } + + net_if_ipv4_set_gw(ap_iface, &addr); - client.broker = &broker_addr; - client.evt_cb = mqtt_event_handler; - client.client_id.utf8 = PROPLET_ID; - client.client_id.size = strlen(PROPLET_ID); - client.protocol_version = MQTT_VERSION_3_1_1; + if (net_if_ipv4_addr_add(ap_iface, &addr, NET_ADDR_MANUAL, 0) == NULL) { + LOG_ERR("unable to set IP address for AP interface"); + } - client.rx_buf = rx_buffer; - client.rx_buf_size = sizeof(rx_buffer); - client.tx_buf = tx_buffer; - client.tx_buf_size = sizeof(tx_buffer); + if (!net_if_ipv4_set_netmask_by_addr(ap_iface, &addr, &netmaskAddr)) { + LOG_ERR("Unable to set netmask for AP interface: %s", WIFI_AP_NETMASK); + } - return mqtt_connect(&client); + addr.s4_addr[3] += 10; + if (net_dhcpv4_server_start(ap_iface, &addr) != 0) { + LOG_ERR("DHCP server is not started for desired IP"); + return; + } + + LOG_INF("DHCPv4 server started...\n"); } -static int wifi_connect(void) +static int enable_ap_mode(void) { - struct net_if *sta_iface = net_if_get_wifi_sta(); // Get the station interface - if (!sta_iface) { - printk("No STA interface found.\n"); - return -ENODEV; - } - - printk("STA interface found: %p\n", sta_iface); - - net_if_up(sta_iface); // Bring up the STA interface - printk("STA interface brought up.\n"); - - struct wifi_connect_req_params params = { - .ssid = CONFIG_WIFI_CREDENTIALS_STATIC_SSID, - .ssid_length = strlen(CONFIG_WIFI_CREDENTIALS_STATIC_SSID), - .psk = CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD, - .psk_length = strlen(CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD), - .channel = 6, - .band = WIFI_FREQ_BAND_2_4_GHZ, - .security = WIFI_SECURITY_TYPE_PSK, - }; - - printk("Connecting to Wi-Fi...\n"); - int ret = net_mgmt(NET_REQUEST_WIFI_CONNECT, sta_iface, ¶ms, sizeof(params)); - if (ret) { - printk("Wi-Fi connection failed: %d\n", ret); - return ret; - } - - printk("Wi-Fi connected successfully.\n"); - return 0; + if (!ap_iface) { + LOG_INF("AP: is not initialized"); + return -EIO; + } + + LOG_INF("Turning on AP Mode"); + ap_config.ssid = (const uint8_t *)WIFI_AP_SSID; + ap_config.ssid_length = strlen(WIFI_AP_SSID); + ap_config.psk = (const uint8_t *)WIFI_AP_PSK; + ap_config.psk_length = strlen(WIFI_AP_PSK); + ap_config.channel = WIFI_CHANNEL_ANY; + ap_config.band = WIFI_FREQ_BAND_2_4_GHZ; + + if (strlen(WIFI_AP_PSK) == 0) { + ap_config.security = WIFI_SECURITY_TYPE_NONE; + } else { + + ap_config.security = WIFI_SECURITY_TYPE_PSK; + } + + enable_dhcpv4_server(); + + int ret = net_mgmt(NET_REQUEST_WIFI_AP_ENABLE, ap_iface, &ap_config, + sizeof(struct wifi_connect_req_params)); + if (ret) { + LOG_ERR("NET_REQUEST_WIFI_AP_ENABLE failed, err: %d", ret); + } + + return ret; } - -void main(void) +static int connect_to_wifi(void) { - printk("Starting Proplet MQTT client on ESP32-S3...\n"); - - int ret = wifi_connect(); - if (ret) { - printk("Failed to connect to Wi-Fi.\n"); - return; - } - printk("Wi-Fi connected.\n"); - - ret = configure_broker(); - if (ret) { - printk("Failed to configure MQTT broker.\n"); - return; - } - - ret = mqtt_client_setup(); - if (ret) { - printk("Failed to set up MQTT client: %d\n", ret); - return; - } - - printk("MQTT client setup complete.\n"); - - request_wasm_file("example_app"); - - while (1) { - mqtt_input(&client); - mqtt_live(&client); - k_sleep(K_MSEC(100)); - } + if (!sta_iface) { + LOG_INF("STA: interface no initialized"); + return -EIO; + } + + sta_config.ssid = (const uint8_t *)WIFI_SSID; + sta_config.ssid_length = strlen(WIFI_SSID); + sta_config.psk = (const uint8_t *)WIFI_PSK; + sta_config.psk_length = strlen(WIFI_PSK); + sta_config.security = WIFI_SECURITY_TYPE_PSK; + sta_config.channel = WIFI_CHANNEL_ANY; + sta_config.band = WIFI_FREQ_BAND_2_4_GHZ; + + LOG_INF("Connecting to SSID: %s\n", sta_config.ssid); + + int ret = net_mgmt(NET_REQUEST_WIFI_CONNECT, sta_iface, &sta_config, + sizeof(struct wifi_connect_req_params)); + if (ret) { + LOG_ERR("Unable to Connect to (%s)", WIFI_SSID); + } + + return ret; } + +int main(void) +{ + k_sleep(K_SECONDS(5)); + + net_mgmt_init_event_callback(&cb, wifi_event_handler, NET_EVENT_WIFI_MASK); + net_mgmt_add_event_callback(&cb); + + /* Get AP interface in AP-STA mode. */ + ap_iface = net_if_get_wifi_sap(); + + /* Get STA interface in AP-STA mode. */ + sta_iface = net_if_get_wifi_sta(); + + // enable_ap_mode(); + connect_to_wifi(); + + return 0; +} \ No newline at end of file