ESP8266 загружает данные на облачную платформу Google

Я пытаюсь загрузить информацию в свой ресурс приложений, созданный с помощью Google App Engine. Я могу сделать это, когда набираю в браузере:
http://myname.appspot.com/query?city=Copenhagen&temp=20& id=сайт
Но я не могу заставить его работать на ESP8266. Вот мой код:

const char* MY_URL = "http://myname.appspot.com";

void uploadHTTP() {
    // Определить Wi-Fi-клиент
    WiFiClient client;
    // Устанавливаем http-порт
    const int httpPort = 80;

    // Убедитесь, что мы можем подключиться
    if (!client.connect(MY_URL, httpPort)) {
        return;
    }
    else {
        Serial.println("Connected to MY_URL");
    }

    String url = "/query?city=Copenhagen&temp=20&id=ESP8266";

    // Публикация в Appspot
    if (client.connect(MY_URL, httpPort)) {

        // Отправлен HTTP POST-запрос
        client.println("POST " + url + " HTTP/1.1");
        Serial.println("POST " + url + " HTTP/1.1");
        client.println("Host: " + String(MY_URL));
        Serial.println("Host: " + String(MY_URL));
        client.println("User-Agent: Arduino/1.0");
        Serial.println("User-Agent: Arduino/1.0");
        client.print("Content-Length: ");
        Serial.print("Content-Length: ");
        client.println(0);
        Serial.println(0);
        client.println("Content-Type: application/x-www-form-urlencoded");
        Serial.println("Content-Type: application/x-www-form-urlencoded");
        client.println("Connection: close");
        Serial.println("Connection: close");
        }
    //Сделанный
    Serial.println("");
    Serial.println("my HTTP done");
    Serial.println("");
}

, 👍0

Обсуждение

Вы программируете ESP8266 напрямую или используете его, подключенный к Arduino?, @Majenko


1 ответ


2

Самая большая проблема заключается в том, что вы пытаетесь использовать URL-адрес веб-сайта в качестве полного доменного имени. Это не сработает.

Когда вы подключаетесь к удаленному компьютеру, вы подключаетесь к имени (myname.appspot.com), которое преобразуется в IP-адрес, к которому вы можете открыть соединение.

Когда вы используете веб-браузер, он анализирует URL-адрес для извлечения протокола (http) и полного доменного имени (myname.appspot.com) и использует протокол для определения порт (и на каком языке говорить) для подключения, затем найдите IP-адрес из полного доменного имени.

Вам необходимо удалить http:// из вашего полного доменного имени, что приводит к его поломке (нет хоста с именем http://myname.appspot.com) ). Тот факт, что вы подключаетесь к порту 80 и говорите на языке HTTP, означает, что вы используете HTTP.

Выражаясь более простым языком: если вам «нужно позвонить Фреду, чтобы поговорить о походе в паб», вы сначала находите номер Фреда в телефонной книге, а затем звоните по этому номеру. И только после того, как он ответит, вы говорите о походе в паб. Чего вы не делаете, так это пытаетесь найти номер, по которому можно позвонить, заглянув в телефонную книгу в раздел «Поговорим о походе в паб с Фредом». Его не будет.

Если вы программируете ESP8266 напрямую, вам следует рассмотреть возможность использования гораздо более простой встроенной библиотеки ESP8266HTTPClient.h.

,

Спасибо за быстрый ответ и объяснение - я этого не знал! Однако я попытался изменить его на «myname.appspot.com», но это не сработало? Я также пытался заставить его работать с библиотекой ESP8266HTTPClient.h, но мне тоже не удалось заставить это работать..., @T.Krebs

Верен ли мой «Тип контента»? Вот мой код для ESP8266HTTPClient.h: ['код'] (HTTPClient http;) http.begin("myname.appspot.com"); http.addHeader("Content-Type", "application/x-www-form-urlencoded"); int httpCode = http.POST("/query?city=Copenhagen&temp=20&id=ESP8266"); Извините за некорректное оформление - я новичок на этом форуме и не могу заставить комментарий работать...., @T.Krebs

У вас нет контента, поэтому тип контента не имеет смысла. Вам действительно следует выполнять запрос GET, а не запрос POST, если для POST нет контента., @Majenko

У меня есть контент? Я устанавливаю «Город» на «Копенгаген», «Темп» на «20» и «Идентификатор» на «ESP8266»., @T.Krebs

Нет, это не контент. Содержимое попадает в тело. У вас есть параметры URL. Параметры URL-адреса идут в конце URL-адреса. У вас нет тела и нулевая длина контента, а ваши параметры находятся в конце URL-адреса. Это не «контент»., @Majenko

Спасибо! Теперь я перешел на GET, и он работает, @T.Krebs