Как решить проблему с почтовыми запросами от arduino, только полученными 2-3 раза до сбоя - PullRequest
0 голосов
/ 17 июня 2019

EDIT5:

Я в конечном итоге исправил эту проблему, более или менее выбрасывая половину моего кода.Вместо того, чтобы отправлять данные на сервер ruby ​​с использованием HTTP, теперь я использую MQTT для посредника на сервере NodeJS.Часть NodeJS здесь не важна, но всем, кто имеет эту проблему, я настоятельно рекомендую отправлять все данные IoT с помощью MQTT, и именно это решило мою проблему.

В настоящее время я пытаюсь отправить данные, собранные с датчиков, наArduino WiFi rev2, на мой сервер рельсов, размещенный на Heroku.Я делаю это, отправляя свои данные в формате JSON.Моя проблема в том, что, хотя мои методы, кажется, работают изначально, с первыми несколькими запросами POST, полученными и обработанными нормально, после 2-3 запросов зависает arduino, и я получаю код состояния: -2.Я использую библиотеку ArduinoHttpClient.

Я пытался использовать локальный сервер, который имеет ту же проблему, а также отправку запроса POST через curl и почтальон.Кажется, что и curl, и почтальон работают должным образом, поэтому я предполагаю, что проблема связана с кодом arduino, хотя я не могу быть уверен.

  client.beginRequest();
  client.post("/input");
  client.sendHeader("Content-Type", "application/json");
  client.sendHeader("Content-Length", postData.length());
  client.beginBody();
  client.println(postData);
  client.endRequest();
  LED(0,128,0);
  Serial.println("Gone");

  int statusCode = client.responseStatusCode();
  String response = client.responseBody();

  Serial.print("Status code: ");
  Serial.println(statusCode);
  Serial.print("Response: ");
  Serial.println(response);

Когда этот код завершится ошибкой, arduino будет зависать примерно 20-40 секунд, и я получу «код состояния -3» от серийного номера.Однако я также получил код состояния -2 и -4 в прошлом.Когда это удается, я получаю следующее: «Код состояния: 204», что я и ожидал.

РЕДАКТИРОВАТЬ: С тех пор я пытался опубликовать на requestcatcher.com, и проблема не устранена.Поэтому я вполне уверен, что это проблема arduino, я также получил следующий вывод:

POST /input HTTP/1.1

Host: arduino.requestcatcher.com

Connection: close

Connection: close

Content-Length: 88

Content-Type: application/json

User-Agent: Arduino/2.2.0



{"inputs":[{"input_id":"1","value":1.778002}{"input_id":"2","value":18.037}],"id":"13"}

РЕДАКТИРОВАТЬ 2: Я случайно обнаружил, что запросы POST проходят нормально, если заголовок «Content-Length:»опущенОчевидно, что JSON на самом деле не отправляется, поэтому это не решает мою проблему, но вполне вероятно, что этот заголовок или сам JSON являются проблемой.

РЕДАКТИРОВАТЬ 3: Независимо от сервера, я получаю либо код состояния -4, либо -3, даже по запросу улавливателя.

РЕДАКТИРОВАТЬ 4: После различных настроек код теперь выглядит так, как показано ниже.Это, кажется, немного помогло, и это терпит неудачу реже, но все еще терпит неудачу.Я начинаю задаваться вопросом, если это проблема с ArduinoHttpClient.

String postData = "";
serializeJson(doc, postData);
serializeJson(doc, Serial);
Serial.println(postData)
client.post("/input", "application/json", postData.c_str());
LED(0,128,0);
Serial.println("Gone");

int statusCode = client.responseStatusCode();

Serial.print("Status code: ");
Serial.println(statusCode);
client.stop();
doc.clear();
lastCycle = millis();

1 Ответ

0 голосов
/ 17 июня 2019

Попробуйте заменить

  client.beginRequest();
  client.post("/input");
  client.sendHeader("Content-Type", "application/json");
  client.sendHeader("Content-Length", postData.length());
  client.beginBody();
  client.println(postData);
  client.endRequest();

только с

String contentType = "application/json";
client.post("/input", contentType, postData);

или

client.post("/input", "application/json", postData.c_str());

Вам не нужно явно указывать заголовки запроса - или вызывать beginRequest() и т. Д. - при использовании метода (ов) post() в этой библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...