HTTP-POST возвращает 400 при учете значения от датчика

Я пытаюсь опубликовать данные total, но он возвращает 400. но когда я пробую образец данных, как

int httpResponseCode = http.POST("{\"сумма\":\"итого\"}"); (400)

в

int httpResponseCode = http.POST("{\"сумма\":\"15\"}"); это работает (201).

Как заставить его работать? Спасибо!

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const byte interruptPin = 4;
const int interval = 500;
volatile unsigned long tiptime = millis();
volatile float rainrate = 0.3;
volatile float total;
void ICACHE_RAM_ATTR count();

void loop() {
  if ((millis() - lastTime) > timerDelay) {
    //Проверить состояние подключения Wi-Fi
    if (WiFi.status()== WL_CONNECTED) {
      HTTPClient http;
      
      // Ваше доменное имя с URL-путем или IP-адрес с путем
      http.begin(serverName);

      // Указать заголовок типа содержимого
      http.addHeader("Content-Type", "application/json");

      // Данные для отправки с помощью HTTP POST
      int httpResponseCode = http.POST("{\"amount\":\"total\"}");

      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
        
      // Бесплатные ресурсы
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

void count() {
  // Захват текущего количества мс для общих вычислений
  unsigned long curtime = millis();
  
  // Убедитесь, что мы не записываем отскоки
  if ((curtime - tiptime) < interval) {
    return;
  }

  // Сколько времени прошло с последнего чаевого?
  unsigned long tipcount = curtime - tiptime;
  tiptime = curtime;

  total += rainrate;
  Serial.println(total);
}

, 👍-1

Обсуждение

В целях отладки не могли бы вы попытаться последовательно вывести точные строки, которые отправляются в обоих случаях, чтобы, возможно, найти, в чем важная разница между ними? Вы можете опубликовать результаты как редактирование вашего вопроса. Удачи вам!, @Offer


1 ответ


Лучший ответ:

5

Ваша линия

int httpResponseCode = http.POST("{\"amount\":\"total\"}");

это не то, что вы думаете, что он делает. Вы помещаете в строку не содержимое переменной total, а слово total.

Вместо этого вам нужно создать строку из компонентов перед отправкой. Я бы использовал что-то вроде:

char temp[32];
snprintf(temp, 32, "{\"amount\":\"%.2f\"}", total);
int httpResponseCode = http.POST(temp);

Это предполагает, что функция http.POST() будет принимать параметр char *. Если нет, то вам, возможно, придется прибегнуть к строке:

String temp = "{\"amount\":\"";
temp += String(total, 2);
temp += "\"}";

Однако лучше избегать String, так как это может привести к фрагментации кучи, в результате чего ваш код со временем станет нестабильным.

,

Обратите внимание, что его "total" - это "float", поэтому формат должен иметь "% f" или "% g`., @Edgar Bonet

@EdgarBonet Так оно и есть..., @Majenko

Если вы собираетесь пойти по маршруту sprintf, было бы лучше использовать snprintf: char temp[32]; snprintf(temp, sizeof temp, "{. Причин использовать старую версию non-n очень мало., @timemage

Я собирался это сделать, но не смог сразу вспомнить порядок первых двух аргументов., @Majenko

Спасибо! это сработало :), @Giddsec