Cosm.com - Obtención de retorno -1 cuando cosmclient.put

1

He implementado con éxito en el pasado, pero de repente dejó de funcionar, una integración entre Arduino con Ethernet Shield, que se comunica con cosm.com para poner en valor el valor de un sensor de temperatura. Estoy seguro de que mi código no cambió, pero después de volver a iniciar mi aplicación después de unas semanas, en lugar de ejecutar con éxito un comando "poner" en la API cosm, devolví -1. No estoy seguro de qué significa eso para intentar arreglarlo.

Confirmé que mi Arduino + Ethernet funciona, cargando el ejemplo de WebServer sketch, y obtuve los resultados deseados al acceder a la IP (en este caso, 192.168.0.178)

Cuando voy a la página de depuración de la API de cosm.com, no veo que mis comunicaciones lleguen a su sitio, así que estoy seguro de que en algún lugar entre mi Arduino y la API de cosm hay algo roto. Y sí, mi internet está funcionando y sí, la tarjeta Ethernet tiene acceso a él (lo hice llamar a uno de mis servidores y registró el éxito en apache)

Aquí está el código para mi boceto:

incluir

#include <Ethernet.h>
#include <HttpClient.h>
#include <Cosm.h>
#include <OneWire.h>

//===================================================
// COSM Setup:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 178 };
//IPAddress ip(192,168,0,177);
char cosmKey[] = "k8G6bvz0f_PCO_TOOK_PART_OF_THIS_AWAY_FOR_THE_USUAL_REASONS_FwQT0g";
char sensorId[] = "DS18B20";
CosmDatastream datastreams[] = {
  CosmDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
CosmFeed feed(95874, datastreams, 1 /* number of datastreams */);
EthernetClient client;
CosmClient cosmclient(client);

//===================================================
// 1-Wire Setup:
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
float mavg5readings = -1000;
float mavg10min = -1000;
float mavg60min = -1000;
float mavg12h = -1000;
float mavg24h = -1000;
#define REFRESHRATE = 1000;

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

void setup(void) {
  Serial.begin(9600);
  Serial.println("Serial Port Reset!");
  pinMode(3, OUTPUT);

  Ethernet.begin(mac, ip);
//  while (Ethernet.begin(mac) != 1)
//  {
//    Serial.println("Error getting IP address via DHCP, trying again...");
//    delay(1000);
//  }
  Serial.println("Setup DONE");

  // make sure we don't get bullshit from the device when we reboot it
  for (int i = 0; i < 3; i++) {
    digitalWrite(3, HIGH);
    float temperature = getTemp();
    digitalWrite(3, LOW);
    Serial.print("Sync Setup Temperature: ");
    Serial.println(temperature);
    delay(1000);

  }
}

IPAddress server(216,52,233,121); // api.cosm.com

void loop(void) {
  delay(5000);

  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);

  float temperature = getTemp();
  if (mavg10min <= -1000) { // i.e. we haven't set it yet
    mavg10min = temperature;
    mavg60min = temperature;
    mavg12h = temperature;
    mavg24h = temperature;
    mavg5readings = temperature;
  } else {
    mavg10min = (mavg10min*600-mavg10min+temperature)/600;
    mavg60min = (mavg60min*3600-mavg60min+temperature)/3600;
    mavg12h = (mavg12h*43200-mavg12h+temperature)/43200;
    mavg24h = (mavg24h*86400-mavg24h+temperature)/86400;
    mavg5readings = (mavg5readings*5-mavg5readings+temperature)/5;
  }
  Serial.print(temperature);
  Serial.print(" (10min: ");
  Serial.print(mavg10min);
  Serial.print(" | 60min: ");
  Serial.print(mavg60min);
  Serial.print(" | 12h: ");
  Serial.print(mavg12h);
  Serial.print(" | 24h: ");
  Serial.print(mavg24h);
  Serial.print(")");
  Serial.print("\n\r");

  if (temperature < 50) { // we had a post of 85 when we restarted it once

    if (client.connect(server, 80)) {
      datastreams[0].setFloat(mavg5readings);
      Serial.print("Read sensor value ");
      Serial.println(datastreams[0].getFloat());

      Serial.println("Uploading it to Cosm");
      digitalWrite(3, HIGH);
      int ret = cosmclient.put(feed, cosmKey);
      digitalWrite(3, LOW);
      Serial.print("cosmclient.put returned ");
      Serial.println(ret);

      Serial.println();
    } else {
      for (int i = 0; i < 10; i++) {
        digitalWrite(3, HIGH);
        delay(100);
        digitalWrite(3, LOW);
        delay(50);
      }
      Serial.println("HUH?");
    }

  }

  for (int i = 0; i < 5; i++) {
    digitalWrite(3, HIGH);
    delay(50);
    digitalWrite(3, LOW);
    delay(5000); //just here to slow down the output so it is easier to read
  }
}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1001;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1002;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1003;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

Por lo tanto, esta sección de código es el primer lugar en el que van las cosas:     int ret = cosmclient.put (feed, cosmKey); Cuando llego a ese punto, se supone que debo recuperar un código 200 o incluso 404, pero en lugar de eso obtengo -1.

Luego, en mi bucle donde intento publicar el resultado de mi sensor de temperatura, trato de conectarme al servidor en el puerto 80, y si eso falla, solo hago un pequeño bucle para ver un efecto en un LED para poder ver qué hay. Cocinar sin tener que trollear el puerto serie:

if (client.connect(server, 80)) {
    
pregunta Sarel

1 respuesta

0

Esto se debe a que el -1 indica que hay un problema con la tarjeta de Ethernet en su Arduino, por lo que la solicitud no está saliendo.

Encontré esto me ayudó, me muestra dónde lo barfs. -1 parece que no puede crear el zócalo. Podrías echar un vistazo y ver si tienes

 if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT || s == SnSR::CLOSE_WAIT) {

en la línea 44 de [su directorio de arduino] \raries \ Ethernet \ EthernetClient.cpp

como si tuviera el original

if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT) {

entonces, si el servidor se cuelga en espera cercana, te quedas sin sockets y no puedes hacer más, y obtienes el -1

    
respondido por el ermine

Lea otras preguntas en las etiquetas