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();