Как получить страницу с сервера, используя ESP8266 с программой, работающей на Arduino вместо модуля ESP?

Я подключил модуль ESP8266-01 к Arduino, как показано на следующей схеме, где контакты RX и TX заменены на контакты 8 и 9 вместо 0 и 1:

Я использую библиотеку ESP8266wifi по следующей ссылке:

https://github.com/ekstrand/ESP8266wifi

Я просмотрел библиотеку ESP8266HTTPClient, но она предназначена для платы ESP8266. Я хочу, чтобы мой код работал на Arduino Uno, а не на ESP8266! Я написал следующий код:

#include <SoftwareSerial.h>
#include <SerialESP8266wifi.h>

const String API_PASSWORD = "stn1234";

#define RX_PIN          8   // RX Arduino (подключен к TX ESP8266)
#define TX_PIN          9   // TX Arduino (подключен к RX ESP8266)
#define ESP_RESET_PIN   12 

#define SERVER_IP           "192.168.43.234"
#define SERVER_PORT         "80"
#define WIFI_SSID           "MyWIFI"
#define WIFI_PASSWORD       "myWifiPassword"

uint8_t wifi_started = false;

const char RST[] PROGMEM = "RST";
const char IDN[] PROGMEM = "*IDN?";

#define CHANGE_DELAY        5000


void initializeWifi();
void transmitData(String);
String getResponse();
void transmitStatus();

SoftwareSerial swSerial =  SoftwareSerial(RX_PIN, TX_PIN);
SerialESP8266wifi wifi(swSerial, swSerial, ESP_RESET_PIN, Serial);

void setup() 
{
    Serial.begin(9600);
    Serial.println("Initializing...");
    initializeWifi();
    Serial.println("Initialization complete");
}

void loop() 
{
    transmitStatus();
    Serial.print("Transmission complete, ");
    int s = (CHANGE_DELAY/1000);
    Serial.print(s);
    Serial.println("s until next cycle");
    delay(CHANGE_DELAY);
}

void transmitStatus()
{
    int a = (int)random(100);
    int b = (int)random(100);
    String url = "/LocalWebProject/api/testConnection.php?a=" + String(a) + "&b=" + String(b);

    transmitData(url);
    String response = getResponse();
    Serial.print("Reply received: ");
    Serial.println(response);
}

void initializeWifi()
{
    swSerial.begin(115200);
    Serial.println("Starting Wifi");
    wifi.setTransportToTCP();
    wifi.endSendWithNewline(false);     // Завершит все передачи символом новой строки и возвратом каретки, т.е. println.. по умолчанию true

    wifi_started = wifi.begin();
    if(wifi_started) 
    {
        Serial.println("Wifi started, connecting to AP...");
        wifi.connectToAP(WIFI_SSID, WIFI_PASSWORD);
        Serial.println("Connected to AP");
    } else {
        Serial.println("ESP module not working");
    }
}

void transmitData(String url)
{
    Serial.println("Connecting to server...");
    wifi.connectToServer(SERVER_IP, SERVER_PORT);

    String data = String("GET ") + url + " HTTP/1.1\r\n" +
           "Host: " + wifi.getIP() + "\r\n" + 
           "Connection: close\r\n\r\n";

    Serial.println("Connected. Transmitting data...");
    wifi.send(SERVER, data);
}

String getResponse()
{
    while(1)
    {
        Serial.println("Waiting for response...");
        WifiMessage in = wifi.listenForIncomingMessage(6000);
        if(in.hasData) 
        {
            if(in.channel == SERVER)
            {
                Serial.print("Reply received from the server: ");
                Serial.println(in.message);             
                return in.message;
            }
        }

        delay(1000);
        Serial.print("Retrying, ");
    }
}

У меня есть сервер Apache, работающий на Ubuntu 18.10, с проектом PHP, работающим на порту 80. Страница testConnection.php принимает 2 параметра GET (целые числа) и возвращает сумму.

Проблема: Пишет, что модуль ESP не работает. Точка доступа в моем случае — это локальная точка доступа на моем мобильном телефоне.

Я попытался запустить данный пример "SerialESP8266_library_test" и, как ни странно, он печатает, что он успешно подключен к моей точке доступа, но на моем телефоне я не вижу, чтобы он был подключен. Только 1 устройство видно как подключенное, это мой ноутбук, на котором работает сервер Apache и веб-проект. Также connectToAP возвращает 1, а connectToServer возвращает 0.

Что я делаю не так? Я знаю, что модуль ESP требует питания, а Arduino 3V3 недостаточно, но сейчас я просто тестирую код и позже внесу необходимые изменения. В связи с этим я размещаю свой Android-телефон рядом с модулем ESP, чтобы у него не было проблем с подключением к нему.

Буду признателен за любую помощь! Заранее спасибо.

, 👍-1

Обсуждение

https://github.com/jandrassy/WiFiEspAT/blob/master/examples/Basic/WebClient/WebClient.ino, @Juraj

swSerial.begin(115200). Я не думаю, что softwareSerial может работать так быстро. Библиотека, которую вы используете для Wi-Fi, использует 9600 бод. Я бы попробовал., @Gerben

@Gerben Некоторые модули 9600, некоторые 115200 - зависит от версии прошивки. SoftwareSerial может *работать* на частоте 115200, но не может достаточно быстро реагировать на входящие байты, чтобы надежно получать поток данных., @Majenko

@Juraj WiFiEspAt требует прошивки с AT 1.7, я не хотел этого делать, @APN

@Gerben Я пробовал с 9600 и внес некоторые другие изменения. Теперь он правильно подключается к точке доступа (отображается на моем телефоне), а также подключается к серверу. Но получает ошибку запроса HTTP 400 Bad. Есть ли проблема в формате запроса GET? Моя страница находится по адресу: http://192.168.43.234/LocalWebProject/api/testConnection.php, @APN

Значение заголовка хоста должно быть именем или IP-адресом сервера., @Juraj

@Juraj, как в примерах и т. д., хост — это локальный IP-адрес модуля ESP. В любом случае, я попробовал ваше предложение, предоставив там SERVER_IP, но все же у меня возникла та же проблема., @APN

протокол HTTP не определен в этом примере, @Juraj


1 ответ


0

Наконец-то он работает, установив скорость передачи данных на 9600 и сократив URL-адрес GET. Возможно, в библиотеке есть ограничение по длине.

,