Sketch von oSM mit WiFi, Daten werden nur beim ersten Mal gesendet


#1

Hi zusammen. Das von oSM runtergeladene Sketch führt im loop das submitValues() durch. Dieses sendet nur immer beim ersten Mal erfolgreich Daten. Zum zweiten Durchlauf läuft es immer in einen Timeout und connection failed und zum Restart der Box. Was ist anzupassen?

void submitValues() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
delay(1000); // wait 1s
WiFi.begin(ssid, pass);
delay(5000); // wait 5s
}
// close any connection before send a new request.
// This will free the socket on the WiFi shield
if (client.connected()) {
client.stop();
delay(1000);
}
bool connected = false;
char _server[strlen_P(server)];
strcpy_P(_server, server);
for (uint8_t timeout = 2; timeout != 0; timeout--) {
  Serial.println(F("connecting..."));
  connected = client.connect(_server, 443);
if (connected == true) {
  DEBUG(F("Connection successful, transferring..."));
  // construct the HTTP POST request:
  sprintf_P(buffer,
            PSTR("POST /boxes/%s/data HTTP/1.1\nHost: %s\nContent-Type: "
                 "text/csv\nConnection: close\nContent-Length: %i\n\n"),
            SENSEBOX_ID, server, num_measurements * 35);
  DEBUG(buffer);

  // send the HTTP POST request:
  client.print(buffer);

  // send measurements
  writeMeasurementsToClient();

  // send empty line to end the request
  client.println();

  uint16_t timeout = 0;
  // allow the response to be computed

  while (timeout <= 5000) {
    delay(10);
    timeout = timeout + 10;
    if (client.available()) {
      break;
    }
  }

  while (client.available()) {
    char c = client.read();
    DEBUG_WRITE(c);
    // if the server's disconnected, stop the client:
    if (!client.connected()) {
      DEBUG();
      DEBUG("disconnecting from server.");
      client.stop();
      break;
    }
  }

  DEBUG("done!");

  // reset number of measurements
  num_measurements = 0;
  break;
}
delay(1000);
}

if (connected == false) {
 // Reset durchführen
DEBUG(F("connection failed. Restarting System."));
delay(5000);
noInterrupts();
NVIC_SystemReset();
while (1)
  ;
}
}

#3

Hallo zusammen, kommer hier leider nicht weiter.
Beim ersten “connecting…” connected = client.connect(_server, 443); kommt eine Verbindung zustande und die Daten werden übertragen. Bei den weiteren Loops wird nicht mehr eine Verbindung aufgebaut “connection failed. Restarting System.”.


#4

Bitte nochmal ein Firmwareupdate machen:
https://sensebox.github.io/books-v2/home/de/additional-info.html


#5

Leider kein Erfolg.
Habe es mit Firmware 19.5.4 und 19.6.1 getestet, wie auch Zertifikate eingespielt (senseBox:home v2 - Upload zu openSenseMap funzt nicht)


#6

Moin @sense-it, hier noch ein paar Lösungsvorschläge:

  • Programmer auf “AVRISP mkII” eingestellen
  • Im Router Sicherheitsetting WPA-PSK/WPA2-PSK mit TKP+AES Verschlüsselung auswählen, zudem WPS deaktivieren und checken ob 443 geblockt wird
  • SSL Client deaktivieren und Anfrage über Port 80 laufen lassen

Pushover script
Telegram Bot - kein Connect
#7

SSL Client deaktivieren und Anfrage über Port 80 laufen lassen führt zu einer korrekten Datenübertragung, auch nach mehreren Durchläufen. Dennoch ist nicht klar woran das liegt, 443 ist nicht geblockt in der Firewall.
Es gibt einen Unterschied in der Rückmeldung nachdem die Daten übertragen worden sind, kann eventuell hierüber das Problem eingegrenzt werden?

  • Rückmeldung über Port 443 nach erster Übertragung der Messwerte:
    Leer, keine Rückmeldung.

  • Rückmeldung über Port 80 nach Übertragung der Messwerte:
    HTTP/1.1 201 Created
    Content-Length: 27
    Content-Type: application/json; charset=utf-8
    Date: “DateTime”
    Deprecation-Warning: If your client supports TLS, please use https://ingress.opensensemap.org
    Connection: close
    “Measurements saved in box”