цифровая электроника
вычислительная техника
встраиваемые системы

 

Управление ESP32 через Интернет с помощью командной строки

Автор: Mike(admin) от 12-07-2019, 05:35

Интерфейс командной строки во многих случаях является наиболее универсальным и удобным способом управления электроникой. С помощью такого интерфейса вы можете контролировать свои вещи через терминальное приложение, а также интегрировать его с вашим настольным/мобильным приложением.


Управление ESP32 через Интернет с помощью командной строки

В данном проекте описывается связь с ESP32 через Интернет с использованием интерфейса командной строки для сохранения сетевых учетных данных в энергонезависимой памяти и управления светодиодом.


В проекте мы используем несколько интересных инструментов:


  • Библиотека SimpleCLI (https://github.com/spacehuhn/SimpleCLI) – для простого создания интерфейса командной строки. Вам не нужно мучиться с парсингом строк. Эта библиотека делает это (и многое другое) для вас в несколько строк.
  • Библиотека настроек (https://github.com/espressif/arduino-esp32/blob/master/libraries/Preferences/src/Preferences.h) – самый элегантный способ взаимодействия с энергонезависимой / EEPROM / Flash-памятью во время выполнения из пользовательского кода. Мы используем эту библиотеку для хранения сетевых учетных данных в памяти и чтения их после включения, чтобы подключиться к сети.
  • Husarnet (https://github.com/husarnet/arduino-esp32) – сеть виртуальной локальной сети, благодаря которой вы можете получить доступ к ESP32 как из локальной сети, так и через Интернет, без статического IP-адреса, настройки переадресации портов в маршрутизаторе и т. д. Вам даже не нужно запоминать IP-адрес вашей платы, но используйте вместо этого имена хостов.

Чтобы запустить проект, откройте Arduino IDE и выполните следующие действия.


Сначала установите пакет Husarnet для ESP32. Откройте File – Preferences (Файл - Настройки). В поле Additional Board Manager URLs (Дополнительные URL-адреса менеджера плат) добавьте эту ссылку: https://files.husarion.com/arduino/package_esp32_index.json. Откройте Tools - Board: ... - Boards Manager ... (Инструменты - Платы: ... - Менеджер плат …). Найдите esp32-husarnet и нажмите Install (Установить).


Теперь выберете плату ESP32. Откройте Tools – Board (Инструменты - Плата). Выберите ESP32 Dev Module в разделе «ESP32 Arduino (Husarnet)». Далее установите библиотеку SimpleCLI. Откройте Tools - Manage Libraries (Инструменты - Управление библиотеками). Найдите SimpleCLI и установите ее.


Запрограммируйте плату ESP32. Откройте проект ESP32_cli_eeprom.ino, загрузить проект на свою плату ESP32. После этого можно получить код присоединения Husarnet. Зарегистрируйтесь на https://app.husarnet.com/. Нажмите кнопку Create network, назовите ее (например, mynet) и нажмите кнопку Create. Нажмите кнопку Add element и перейдите на вкладку кода присоединения. Скопируйте свой код соединения, содержащий 22 символа XXXXXXXXXXXXXXXXXXXXXX, и сохраните его для дальнейшего использования.


Управление ESP32 через Интернет с помощью командной строки

Откройте последовательный монитор в Arduino IDE на скорости 115200 бод, также в настройках монитора установите Both NL & CR. Сохраните учетные данные сети Wi-Fi в энергонезависимой памяти ESP32, введя в последовательный монитор (XXXXX – название сети, YYYYY – пароль).


conwifi -ssid "<XXXXX>" -pass "<YYYYY>"

Сохраните сетевые учетные данные Husarnet в энергонезависимой памяти ESP32, введя в монитор husarnet_join XXXXXXXXXXXXXXXXXXXXXX myesp32, где XXXXXXXXXXXXXXXXXXXXXX – код соединения HUSARNET.


Сбросьте ESP32. В последовательном мониторе вы должны увидеть, что ваша плата ESP32 пытается подключиться к сети Wi-Fi и Husarnet. Теперь установите Husarnet на свой компьютер с Linux и добавьте его в ту же сеть, что и ESP32. Для этого откройте терминал Linux и введите эту строку для установки Husarnet:


$ curl https://install.husarnet.com/install.sh | sudo bash

Подключите ваш компьютер Linux к сети Husarnet, выполнив следующую команду:


$ sudo husarnet join XXXXXXXXXXXXXXXXXXXXXX mycomputer"

Управляйте своим ESP32 через Интернет с помощью командной строки. Откройте терминал Linux и введите эту строку для подключения к ESP32:


$ socat - tcp:myesp32:8001

Введите setled 1, чтобы включить светодиод, подключенный к линии ввода/вывода 16.


Управление ESP32 через Интернет с помощью командной строки

Код ESP32_cli_eeprom.ino:



#include <WiFi.h>
#include <Husarnet.h>
#include <SimpleCLI.h>
#include <Preferences.h>

const int CLI_PORT = 8001;
const int LED_PIN = 16;

HusarnetServer server(CLI_PORT);

Preferences preferences;

SimpleCLI cli;

Command conwifi;
Command husarnet_join;
Command setled;

void taskInternetCLI( void * parameter );

void conwifiCallback(cmd* c);
void husarnet_joinCallback(cmd* c);
void setledCallback(cmd* c);

void setup() {
  Serial.begin(115200);

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Read Wi-Fi and Husarnet credentials from NVS memory

  preferences.begin("my-app", false);
  String ssid = preferences.getString("ssid");
  String pass = preferences.getString("pass");
  String hostname = preferences.getString("hostname");
  String joincode = preferences.getString("joincode");
  preferences.end();


  // Configure a command line interface (CLI)

  conwifi = cli.addCmd("conwifi", conwifiCallback);
  conwifi.addArg("ssid");
  conwifi.addArg("pass");

  husarnet_join = cli.addCmd("husarnet_join", husarnet_joinCallback);
  husarnet_join.addPosArg("joincode");
  husarnet_join.addPosArg("hostname");

  setled = cli.addCmd("setled", setledCallback);
  setled.addPosArg("state");


  // Connect to Wi-Fi

  Serial.println("Connecting to Wi-Fi: ");
  if (ssid != "") {
    Serial.print("SSID:");
    Serial.println(ssid);
    Serial.print("PASS:");
    Serial.println(pass);

    WiFi.begin(ssid.c_str(), pass.c_str());
    for (int j = 0; j < 10; j++) {
      if (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
        if (j == 9) {
          Serial.printf("\r\nwrong Wi-Fi credentials. Going to commandline:\r\n");
          Serial.println("ESP32 commandline");
          Serial.print("# ");
          return;
        }
      } else {
        Serial.println("done");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
        break;
      }
    }
  } else {
    Serial.println("no credentials in memory");
  }


  // Connect to Husarnet network

  Serial.println("Connecting to Husarnet: ");
  if (hostname != "") {
    Serial.print("joincode:");
    Serial.println(joincode);
    Serial.print("hostname:");
    Serial.println(hostname);

    Husarnet.join(joincode.c_str(), hostname.c_str());
    Husarnet.start();

    xTaskCreate(
      taskInternetCLI,  /* Task function. */
      "taskWifi",       /* String with name of task. */
      20000,            /* Stack size in bytes. */
      NULL,             /* Parameter passed as input of the task */
      2,                /* Priority of the task. */
      NULL);            /* Task handle. */

  } else {
    Serial.println("no credentials in memory");
  }

  Serial.println("ESP32 commandline");
  Serial.print("# ");
}

String input;

void loop() {

  // Check if user typed something into the serial monitor
  if (Serial.available()) {
    char c = Serial.read();
    input += c;
    if (c == '\r') {
      cli.parse(input);
      input = "";
    } else {
      Serial.print(c);
    }
  }

  // Check for parsing errors
  if (cli.errored()) {
    // Get error out of queue
    CommandError cmdError = cli.getError();

    // Print the error
    Serial.print("ERROR: ");
    Serial.println(cmdError.toString());

    // Print correct command structure
    if (cmdError.hasCommand()) {
      Serial.print("Did you mean \"");
      Serial.print(cmdError.getCommand().toString());
      Serial.println("\"?");
    }
    Serial.print("\r\n# ");
  }
}


void conwifiCallback(cmd* c) {
  Command cmd(c);

  String ssid = cmd.getArg("ssid").getValue();
  String pass = cmd.getArg("pass").getValue();

  preferences.begin("my-app", false);
  preferences.putString("ssid", ssid);
  preferences.putString("pass", pass);
  preferences.end();

  Serial.println("\r\nWi-Fi credentials saved. Reset to connect.");
}

void husarnet_joinCallback(cmd* c) {
  Command cmd(c);

  String hostname = cmd.getArg("hostname").getValue();
  String joincode = cmd.getArg("joincode").getValue();

  preferences.begin("my-app", false);
  preferences.putString("hostname", hostname);
  preferences.putString("joincode", joincode);
  preferences.end();

  Serial.println("\r\nHusarnet credentials saved. Reset to connect.");
}

void setledCallback(cmd* c) {
  Command cmd(c);

  String state = cmd.getArg("state").getValue();

  switch (state.toInt()) {
    case 0:
      digitalWrite(LED_PIN, LOW);
      break;
    case 1:
      digitalWrite(LED_PIN, HIGH);
      break;
  }

  Serial.println("\r\nHusarnet credentials saved. Reset to connect.");
}

void taskInternetCLI( void * parameter )
{
  server.begin();

  while (1) {
    HusarnetClient client = server.available();
    if (client) {
      Serial.println("New Client.");
      String currentLine = "";
      Serial.printf("connected: %d\r\n", client.connected());
      while (client.connected()) {

        if (client.available()) {
          char c = client.read();
          currentLine += c;

          if (c == '\n') {
            cli.parse(currentLine);
            currentLine = "";
            client.println("ok");
          }
        }
      }
      
      client.stop();
      Serial.println("Client disconnected.");
      Serial.println("");
    } else {
      delay(200);
    }
  }
}



© digitrode.ru


Теги: ESP32



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий