Program Listing for File cmd.c

Return to documentation for file (components/wifi_sniffer/cmd.c)

#include <stdio.h>
#include <string.h>
#include <strings.h>

#include "esp_console.h"
#include "esp_err.h"
#include "esp_log.h"
#include "sdkconfig.h"

// Project headers
#include "cmd.h"
#include "wifi.h"
#include "sniffer.h"


static const char *TAG = "ESP_CMD";

static esp_console_repl_t *s_repl = NULL;
static bool s_initialized = false;

static void print_usage(void);
static int  wifi_command(int argc, char **argv);

void command_init(void)
{
    if (s_initialized) {
        return;
    }
    s_initialized = true;

    ESP_ERROR_CHECK(esp_console_register_help_command());

    const esp_console_cmd_t wifi_cmd = {
        .command = "wifi",
        .help    = "Wi-Fi control: mode/ap/sta/status",
        .hint    = NULL,
        .func    = &wifi_command,
        .argtable = NULL,
    };
    ESP_ERROR_CHECK(esp_console_cmd_register(&wifi_cmd));

    esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();
    repl_config.prompt = "wifi> ";
    repl_config.max_cmdline_length = 256;

    esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();
    uart_config.channel   = CONFIG_ESP_CONSOLE_UART_NUM;
    uart_config.baud_rate = CONFIG_ESP_CONSOLE_UART_BAUDRATE;

    ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &s_repl));
    ESP_ERROR_CHECK(esp_console_start_repl(s_repl));

    ESP_LOGI(TAG, "Console ready. Type 'help' to list commands.");
}

static void print_usage(void)
{
    printf("Usage:\n");
    printf("  wifi mode <ap|sta|ap+sta|null>\n");
    printf("  wifi sta ssid \"<ssid>\"\n");
    printf("  wifi sta pw \"<password>\"\n");
    printf("  wifi ap ssid \"<ssid>\"\n");
    printf("  wifi ap pw \"<password>\"  (>=8 chars) or empty to open\n");
    printf("  wifi ch <1-13>\n");
    printf("  wifi ring reset\n");
    printf("  wifi status\n");

}

static int wifi_command(int argc, char **argv)
{
    if (argc < 2) {
        print_usage();
        return 0;
    }

    // wifi mode <mode>
    if (strcasecmp(argv[1], "mode") == 0) {
        if (argc < 3) {
            print_usage();
            return 0;
        }
        esp_err_t err = wifi_mgr_set_mode_str(argv[2]);
        if (err != ESP_OK) {
            printf("Failed to set mode '%s': %s\n",
                   argv[2], esp_err_to_name(err));
        }
        return 0;
    }

    // wifi sta ssid <ssid> / pw <password>
    if (strcasecmp(argv[1], "sta") == 0) {
        if (argc < 4) {
            print_usage();
            return 0;
        }

        // wifi sta ssid <ssid> / pw <password>
        esp_err_t err = ESP_OK;
        if (strcasecmp(argv[2], "ssid") == 0) {
            err = wifi_mgr_set_sta_ssid(argv[3]);
        } else if (strcasecmp(argv[2], "pw") == 0 ||
                   strcasecmp(argv[2], "password") == 0) {
            err = wifi_mgr_set_sta_password(argv[3]);
        } else {
            printf("Unknown STA field '%s'\n", argv[2]);
            print_usage();
            return 0;
        }
        if (err != ESP_OK) {
            printf("Failed to update STA config: %s\n", esp_err_to_name(err));
        }
        return 0;
    }

    // wifi ap ssid/pw
    if (strcasecmp(argv[1], "ap") == 0) {
        if (argc < 4) {
            print_usage();
            return 0;
        }
        // wifi ap ssid <ssid> / pw <password>
        esp_err_t err = ESP_OK;
        if (strcasecmp(argv[2], "ssid") == 0) {
            err = wifi_mgr_set_ap_ssid(argv[3]);
        } else if (strcasecmp(argv[2], "pw") == 0 ||
                   strcasecmp(argv[2], "password") == 0) {
            err = wifi_mgr_set_ap_password(argv[3]);
        } else {
            printf("Unknown AP field '%s'\n", argv[2]);
            print_usage();
            return 0;
        }
        if (err != ESP_OK) {
            printf("Failed to update AP config: %s\n", esp_err_to_name(err));
        }
        return 0;
    }

    // wifi status
    if (strcasecmp(argv[1], "status") == 0) {
        wifi_mgr_print_status();
        sniffer_print_stats();
        return 0;
    }

    // wifi ch 1~13
    if (strcasecmp(argv[1], "ch") == 0 || strcasecmp(argv[1], "channel") == 0) {
        if (argc < 3) {
            print_usage();
            return 0;
        }
        int ch = atoi(argv[2]);
        esp_err_t err = wifi_mgr_set_channel((uint8_t)ch);
        if (err != ESP_OK) {
            printf("Failed to set channel: %s\n", esp_err_to_name(err));
        }
        return 0;
    }

    // wifi ring reset
    if (strcasecmp(argv[1], "ring") == 0) {

        if (strcasecmp(argv[2], "reset") == 0) {
            sniffer_ring_reset();
            sniffer_print_stats();
            return 0;
        }


    }

    printf("Unknown wifi command '%s'\n", argv[1]);
    print_usage();
    return 0;
}