OPC-UA HTTP Webserver Arduino Ethernet ESP8266 ESP32 HTML Publish Subscribe

OPC UA - ESP8266


  • OPC UA существует с 2008 года. Это клиент -> серверная архитектура, которая поддерживает мультиплатформенные приложения.
  • Реализация предлагает подключение клиентов к веб-серверу. Клиенты взаимодействуют с методом HTTP POST и продают данные на сервер в формате XML (SOAP).
  • Веб-сервер также может отвечать на запросы клиентов значением, которое можно использовать.
  • Архитектура имеет приложения в микропроцессорной связи, системах автоматизации с ПЛК, простых сенсорных сетях.
  • В расширенной реализации также можно использовать HTTPS-соединение для проверки сертификата WebServer / Client / Server.
  • Демонстрационная реализация демонстрирует простое соединение между платами на платформе ESP8266 с помощью веб-сервера HTTP.
  • Серверная плата ESP8266 также использует реализацию точки доступа AP. Таким образом, подключенные устройства находятся в одной сети с сервером, и сеть зашифрована по протоколу WPA / WPA2 - PSK.
  • ESP8266 транслирует сеть WiFi с именем ESP_WiFi с паролем thereisnospoon , адрес сервера: 192.168.4.1 на порту 80, назначая адрес из диапазона 192.168.4.X s 24-битная сетевая маска.
  • Страницы сервера:
  • / - корневое местоположение (192.168.4.1), страница может использоваться клиентом на компьютере, другом устройстве, визуализируя значения в реальном времени от клиентов
  • /send_data/ - страница для получения данных, ожидающих данные XML от клиентов
  • /get_data/ - страница запроса конкретной информации - веб-сервер отвечает значением по требованию
  • Типы клиентов, реализованных в проекте:
  • Publish_Client - отправляет данные из конвертера ADC на сервер, печатает полученный ответ сервера - подтверждает получение отправленных данных
  • Publish_Client_UDP - отправлять данные с АЦП на сервер, пропускать ответ сервера (обрабатывать его, не записывать полученный ответ, не работать с ним)
  • Subscriber_Client - выполняет HTTP-запрос к серверу - сервер отвечает полученным значением от клиента, например, значением может быть температура. Можно работать и использовать его (вентиляция, переключение котла, отопление, орошение, управление машиной).
  • Блок-схема реализации OPC-UA:

    Bloková schéma - OPC-UA - ESP8266, ESP32, Arduino + Ethernet Wiznet W5100 - XML

    (SOAP) XML ENCODED HTTP PAYLOAD - OPC-UA

    Исходный код веб-сервера на странице не содержит анализатора XML (SOAP). Версии программного обеспечения XML-анализатора и расширенные реализации не доступны бесплатно. Я предлагаю версии программного обеспечения для ESP8266 / ESP32 / Arduino + Ethernet. Если вы заинтересованы в покупке проекта, пожалуйста, свяжитесь с нами для получения дополнительной информации: martinius96@gmail.com

    ESP8266 OPC-UA Webserver



    ESP8266 OPC-UA SOAP (XML) Webserver - AP MODE - NO XML SOAP PARSER


    //ESP8266 (NodeMCU) - OPC-UA (SOAP) webserver (NO XML parser) AP MODE
    //Autor: martinius96
    //Web: https://arduino.php5.sk
    
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    ESP8266WebServer server(80);
    const char* ssid = "ESP_WiFi";
    const char* password = "thereisnospoon";
    
    void setup() {
      Serial.begin(115200);
      WiFi.softAP(ssid, password);
      IPAddress myIP = WiFi.softAPIP();
      Serial.println(myIP);
      server.on("/body", handleBody);
      server.begin();
      Serial.println("Server listening");
    }
    
    void loop() {
      server.handleClient();
    }
    
    void handleBody() {
      if (server.hasArg("plain") == false) {
        server.send(200, "text/plain", "Body not received");
        return;
      }
      String message = "Body received:\n";
      message += server.arg("plain");
      message += "\n";
      server.send(200, "text/plain", message);
      Serial.println(message);
    }
    

    ESP8266 OPC-UA SOAP (XML) Webserver - STA MODE - NO XML SOAP PARSER


    //ESP8266 (NodeMCU) - OPC-UA (SOAP) webserver (NO XML parser)
    //Autor: martinius96
    //Web: https://arduino.php5.sk
    
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    ESP8266WebServer server(80);
    const char* ssid = "WIFI_NAME";
    const char* password =  "WIFI_PASSWORD";
    
    void setup() {
      Serial.begin(115200);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Waiting to connect...");
      }
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
      server.on("/body", handleBody);
      server.begin();
      Serial.println("Server listening");
    
    }
    
    void loop() {
      server.handleClient();
    }
    
    void handleBody() {
      if (server.hasArg("plain") == false) {
        server.send(200, "text/plain", "Body not received");
        return;
      }
      String message = "Body received:\n";
      message += server.arg("plain");
      message += "\n";
      server.send(200, "text/plain", message);
      Serial.println(message);
    }
    

    ESP8266 OPC-UA Client



    ESP8266 OPC-UA SOAP Client


    //ESP8266 (NodeMCU) - OPC-UA Client - XML (SOAP) data payload
    //Autor: martinius96
    //Web: https://arduino.php5.sk
    
    #include <ESP8266WiFi.h>
    const char * ssid = "WIFI_NAME";
    const char * password = "WIFI_PASSWORD";
    const char * host = "192.168.1.3"; //IP address of OPC-UA webserver --> second NodeMCU
    const int httpPort = 80; //http port
    unsigned long previousMillis = 0;
    const long interval = 5000;
    WiFiClient client;
    void setup() {
      Serial.begin(115200);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi uspesne pripojene");
      Serial.println("IP adresa: ");
      Serial.println(WiFi.localIP());
      Serial.println("Ready");
    }
    
    void loop() {
      if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, password);
      }
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      if (millis() - previousMillis >= interval) {
        previousMillis = millis();
        client.stop();
        String mac = WiFi.macAddress();
        String data = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
        data += "<ServiceRequest>\n";
        data += "<ID_BOARD>" + mac + "</ID_BOARD>\n";
        data += "<BME280_VALUE_PRESSURE>1013.48</BME280_VALUE_PRESSURE>\n";
        data += "<BME280_VALUE_TEMPERATURE>-20.34</BME280_VALUE_TEMPERATURE>\n";
        data += "<BME280_VALUE_HUMIDITY>48.55</BME280_VALUE_HUMIDITY>\n";
        data += "</ServiceRequest>\n";
        String url = "/body";
        if (client.connect(host, httpPort)) {
          client.println("POST " + url + " HTTP/1.0");
          client.println("Host: " + (String)host);
          client.println("User-Agent: ESP8266");
          client.println("Connection: close");
          client.println("Content-Type: application/x-www-form-urlencoded;");
          client.print("Content-Length: ");
          client.println(data.length());
          client.println();
          client.println(data);
          while (client.connected()) {
            String line = client.readStringUntil('\n');
            if (line == "\r") {
              break;
            }
          }
          String line = client.readStringUntil('\n');
        } else {
          Serial.println("Problem connecting to webserver");
        }
      }
    }