Отправка переменной в IFTTT через ESP32 с помощью Асинхронного веб-сервера

Я пытался отправить три переменные в IFTTT с моего ESP32, используя асинхронный веб-сервер. Однако я не мог установить "URL", который должен был быть ответом, который вызовет мой IFTTT. Вот мой код:

server.on("/ifttt", HTTP_GET, [](AsyncWebServerRequest *request){

String jsonObject = "{\"value1\":\"" + Global_T + "\"" + ",\"value2\":\"" + Global_H  + "\"" + ",\"value3\":\"" + Global_K +  "\"}";

AsyncWebServerResponse *response = request->beginResponse(200, "application/json", jsonObject);  

response ->addHeader("Host", server_ifttt);
request ->send(response);
});

Он должен срабатывать каждый фиксированный интервал, который я установил, и войти сюда, чтобы отправить его в IFTTT, но это так выглядит. Я не уверен, где я должен добавить в "URL", чтобы ответ мог быть направлен на IFTTT.

, 👍2

Обсуждение

разве вы не должны использовать веб-клиент для отправки данных в IFTTT?, @jsotola

Извини, я был немного новичком в этом деле. Это означает, что я не могу отправлять данные в IFTTT, если использую асинхронный веб-сервер?, @Kai Liang Chng

нет, это не то, что я имею в виду ... у вас может быть код веб-сервера, но вам также нужен код веб-клиента для подключения к серверу IFTTT, @jsotola


1 ответ


1

Как уже было сказано в комментариях, вам нужен код клиента - Вот готовы использовать блоки для вашего сценария - никогда не использовать класс String , если вы хотите иметь стабильную работу устройств Интернета вещей, поэтому определение глобальных массивах char (составлена для прошивки) и сохранить фрагментации кучи, как минимум, код прокомментирован, чтобы вы начали меняться с вашими потребностями:

/* Ваши константы */
#define READ_THIS_PIN 4
const char MakerIFTTT_Key[] = "r8X-blahblahYourKeyGoesHere";
const char MakerIFTTT_Event[] = "stack_exchange_example";


/* Определите глобальные массивы символов, чтобы избавиться от класса string */
    char numBuf[20];       // We "just know" this is big enough for (un)signed longs
    char postRequest[256];    // Hand-calculated to be big enough (size to your needs)
/* Вспомогательные функции для построения данных POST
    добавьте строку или int в буфер, верните результирующий конец строки */

char *appendStr(char *tempChr, char *s) {
    while ((*tempChr++ = *s++))
        ;
    return tempChr-1;
}

char *appendUl(char *tempChr, unsigned long u) {
    return appendStr(tempChr, ultoa(u, numBuf, 10));
}
/*
 Это вызывается один раз за итерацию, чтобы прочитать pin
 и отправить сообщение для запуска события IFTTT/Maker
*/

void updateEvent() {
    WiFiClient client;

    /* Подключение к серверу событий Maker */
    client.connect("maker.ifttt.com", 80);

    /* Создать запрос на публикацию */

    postRequest[0] = {'\0'}; /* Reset char array */
    char *p = postRequest;
    p = appendStr(p, "POST /trigger/");
    p = appendStr(p, "MakerIFTTT_Event");
    p = appendStr(p, "/with/key/");
    p = appendStr(p, "MakerIFTTT_Key");
    p = appendStr(p, " HTTP/1.1\r\n");
    p = appendStr(p, "Host: maker.ifttt.com\r\n");
    p = appendStr(p, "Content-Type: application/json\r\n");
    p = appendStr(p, "Content-Length: ");

    /* Нам нужно помнить, куда будет идти длина контента, которая: */
    char *contentLengthHere = p;

    /* Это всегда две цифры, поэтому зарезервируйте для них место (NN) */
    p = appendStr(p, "NN\r\n");

    /* Конец заголовков */
    p = appendStr(p, "\r\n");

    /* Создайте JSON; запомните, с чего мы начали, чтобы мы знали длину */
    char *jsonStart = p;

    // В этом примере сообщается, что pin, время безотказной работы и "стек приветствий" изменяются в соответствии с вашими потребностями */
    p = appendStr(p, "{\"value1\":\"");
    p = appendUl(p, 12);    //analogRead(READ_THIS_PIN));
    p = appendStr(p, "\",\"value2\":\"");
    p = appendUl(p, millis());
    p = appendStr(p, "\",\"value3\":\"");
    p = appendStr(p, "hello, stack!");
    p = appendStr(p, "\"}");

    /* Вернитесь и заполните длину JSON
       мы просто знаем, что это не более 2 цифр (и нужно заполнить обе цифры) */
    uint8_t i = strlen(jsonStart);
    contentLengthHere[0] = '0' + (i/10);
    contentLengthHere[1] = '0' + (i%10);

    // наконец, мы готовы отправить СООБЩЕНИЕ на сервер!
    client.print(postRequest);
    client.stop();
} 
,