Problem bei der Übertragung von Sensordaten an eine Website


  • Mod

    aguspg schrieb:

    bzw. @Alle zusammen, dieses Programm sieht aus wie Chipkit code, was is ähnlich zu Arduino, was ist eine Mischung zwischen C und C++ 🙂 ).

    Danke. Ich verschiebe es mal nach C++, da besteht wohl noch die größte Ähnlichkeit.



  • Ich bin noch ein blutiger Anfänger was programmieren betrifft, darum konnte ich das Thema auch nicht richtig einschätzen, ob C oder C++ da beides irgendwie drin ist und ich es selber auch nicht richtig auseinander halten kann.

    @aguspg Vielen Dank für den Hinweis und ja du hast recht, ich verwende ein Chipkit-Board und habe das mal grob umgesetzt.

    void Beschleunigung_auslesen(){
      static int  millisecond = millis();
      if( millisecond > millis ())
      return;
      String idBeschleunigung_x="54feea367625426433a9baae";
      String idBeschleunigung_y="54feecb47625426949be93ac";
      String idBeschleunigung_z="54feecc07625426b484947b2";
      MPU6000 mpu6000;
      MPU6000_RAW_DATA Raw_Accel; 
      Raw_Accel = mpu6000.getRawAccelData(); 
      Serial.print(" Beschleunigung in x-Richtung = ");
      float B_Wert_x = Beschleunigung_Wert_umrechnen(Raw_Accel.x);
      String string_B_Wert_x = float_string(B_Wert_x);
      Serial.print(" Beschleunigung in y-Richtung = ");
      float B_Wert_y = Beschleunigung_Wert_umrechnen(Raw_Accel.y);
      String string_B_Wert_y = float_string(B_Wert_y);
      Serial.print(" Beschleunigung in z-Richtung = ");
      float B_Wert_z = Beschleunigung_Wert_umrechnen(Raw_Accel.z);
      String string_B_Wert_z = float_string(B_Wert_z);
      if(save_value3(string_B_Wert_x, idBeschleunigung_x, string_B_Wert_y, idBeschleunigung_y, string_B_Wert_z, idBeschleunigung_z)){
        Serial.println(string_B_Wert_x);
        Serial.println(string_B_Wert_y);
        Serial.println(string_B_Wert_z);
        Serial.println();
      }
      millisecond += 1000;
    }
    
    boolean save_value1(String valor,String idvariable){
      String token="aOosnUjMzRCQlmswDdl9eKryplkd1hkHziP1VIjetJheOlUeW0g47xxqwHHF";
      int cbRead=0;
      String var = "{\"value\":"+ valor + "}";
      int num = var.length();
      String le = String(num);
      String message = "POST /api/v1.6/collections/values HTTP/1.1\nContent-Type: application/json\nContent-Length: "+le+"\nX-Auth-Token: "+token+"\nHost: things.ubidots.com\n\n"+var+"\n\n";
      Serial.println(message);
      byte rgbWriteStream[message.length()]  ;
      message.getBytes(rgbWriteStream,message.length() + 1);
      int cbWriteStream = sizeof(rgbWriteStream);
      state_machine(rgbWriteStream,cbWriteStream);
      return true;
    }
    
    boolean save_value3(String v1, String var1, String v2, String var2, String v3,String var3){
      Serial.println(v1);
      String token="aOosnUjMzRCQlmswDdl9eKryplkd1hkHziP1VIjetJheOlUeW0g47xxqwHHF";
      int cbRead=0;
      Serial.println(cbRead);
      String body = "[{\"variable\":"+ var1 +",\"value\":"+ v1 +"},{\"variable\":"+ var2 +",\"value\":"+ v2 +"},{\"variable\":"+ var3 +",\"value\":"+ v3 +"}]";
      Serial.print(body);
      int num = body.length();
      String le = String(num);
      Serial.println(le);
      String message = "POST /api/v1.6/collections/values HTTP/1.1\nContent-Type: application/json\nContent-Length: "+le+"\nX-Auth-Token: "+token+"\nHost: things.ubidots.com\n\n"+body+"\n\n";
      Serial.println(message);
      byte rgbWriteStream[message.length()]  ;
      message.getBytes(rgbWriteStream,message.length() + 1);
      int cbWriteStream = sizeof(rgbWriteStream);
      state_machine(rgbWriteStream,cbWriteStream);
      return true;
    }
    

    Habe den Temperatursensor über save_value1(String valor,String idvariable) und die Beschleunigungssesnoren über save_value3(...) realisiert.
    Auf der Website kam nichts an, jedoch im SerialMonitor wurde der Temperatursensor richtig ausgegeben, aber beim Beschleunigungssensor steht im string body eine "0" und danach stellt das Programm sofort seine arbeit ein.

    PS: wie kann ich Beispiele minimiert anzeigen lassen?



  • Wie lang darf ein string denn maximal sein, da ich festgestellt habe, dass wenn die string message größer 1byte also 255 Zeichen ist, dann ist der string leer.
    Wie kann ich einen string vergrößern bzw welche Alternative gibt es für meine Aufgabenstellung?

    Vielen Dank



  • ein_weiterer_Markus schrieb:

    PS: wie kann ich Beispiele minimiert anzeigen lassen?

    "Minimierte Beispiele bringen" ist ein Prozess, der Deine Mitarbeit und Deine grauen Zellen benötigt.
    Die Idee ist, dass wenn Du ein Beispiel bringst, Du dieses bis auf des Pudels Kern entrümpelst und dabei bestenfalls selbst über die Fehlerursache stolperst.

    Du bist ja schon auf dem besten Weg, den Fehler selbst zu lokalisieren.

    Verstehe ich das richtig, dass in diesen Zeilen

    String body = "[{\"variable\":"+ var1 +",\"value\":"+ v1 +"},{\"variable\":"+ var2 +",\"value\":"+ v2 +"},{\"variable\":"+ var3 +",\"value\":"+ v3 +"}]";
      Serial.print(body);
    

    nur eine "0" ausgegeben wird?

    ein_weiterer_markus schrieb:

    Wie lang darf ein string denn maximal sein, da ich festgestellt habe, dass wenn die string message größer 1byte also 255 Zeichen ist, dann ist der string leer.

    Du verwechselst da was. 1 Byte kann 256 verschiedene Werte darstellen - wenn man voraussetzt, dass 1 Byte aus 8 Bit besteht. Jedes Zeichen Deiner Nachricht wird aber ein Byte sein. Also 255 Zeichen => 255 Byte.
    Ansonsten würde es mich wundern, wenn ein Chipkit String nur 255 Zeichen aufnehmen kann.

    Was mir allerdings nicht ganz koscher vorkommt sind diese Zeilen:

    byte rgbWriteStream[message.length()]  ;
      message.getBytes(rgbWriteStream,message.length() + 1);
    

    Wenn ich das richtig interpretiere wird da ein Zeichen mehr kopiert als das Array lang ist.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Furble Wurble schrieb:

    ein_weiterer_Markus schrieb:

    PS: wie kann ich Beispiele minimiert anzeigen lassen?

    "Minimierte Beispiele bringen" ist ein Prozess, der Deine Mitarbeit und Deine grauen Zellen benötigt.
    Die Idee ist, dass wenn Du ein Beispiel bringst, Du dieses bis auf des Pudels Kern entrümpelst und dabei bestenfalls selbst über die Fehlerursache stolperst.

    Alles klar,so war das gemeint.

    Furble Wurble schrieb:

    Verstehe ich das richtig, dass in diesen Zeilen

    String body = "[{\"variable\":"+ var1 +",\"value\":"+ v1 +"},{\"variable\":"+ var2 +",\"value\":"+ v2 +"},{\"variable\":"+ var3 +",\"value\":"+ v3 +"}]";
      Serial.print(body);
    

    nur eine "0" ausgegeben wird.

    ein_weiterer_markus schrieb:

    Wie lang darf ein string denn maximal sein, da ich festgestellt habe, dass wenn die string message größer 1byte also 255 Zeichen ist, dann ist der string leer.

    Du verwechselst da was. 1 Byte kann 256 verschiedene Werte darstellen - wenn man voraussetzt, dass 1 Byte aus 8 Bit besteht. Jedes Zeichen Deiner Nachricht wird aber ein Byte sein. Also 255 Zeichen => 255 Byte.
    Ansonsten würde es mich wundern, wenn ein Chipkit String nur 255 Zeichen aufnehmen kann.

    Also nach mehrmaligen Tests mit unterschiedlich langen string, hat sich herausgestellt, dass immer wenn der string kürzer 256 Zeichen, alles richtig ist, jedoch wenn dieser länger als 256 zeichen ist, dann nicht eine '0' ausgibt, sondern unterschiedliche Zeichenfolgen. Mal nur eine '(' oder ein Teil des eigentlichen Inhalts.

    Furble Wurble schrieb:

    Was mir allerdings nicht ganz koscher vorkommt sind diese Zeilen:

    byte rgbWriteStream[message.length()]  ;
      message.getBytes(rgbWriteStream,message.length() + 1);
    

    Wenn ich das richtig interpretiere wird da ein Zeichen mehr kopiert als das Array lang ist

    Diese Zeilen habe ich aus einem Beispielcode von der ubidots Website und hab mich auch über die +1 gewundert.



  • Also es liegt eindeutlig an der String-Länge.
    Ich hab dies mal veranschaulicht.

    http://img4.fotos-hochladen.net/uploads/cforumua6fg8qmc7.jpg

    Man kann erkennen, wenn der String zu lang ist, dann wird dieser nicht richtig beschrieben. Lasse ich das static weg, dann schafft er es beim 2 bzw 3 durchlauf, den String komplett zu beschrieben.

    Kennt jemand den Grund für dieses Verhalten bzw eine Lösung um das zu umgehen?



  • Das wird wohl ein Fehler in der Bibliothek sein.

    Versuch halt eine neuere Version von der Herstellerwebsite zu laden.



  • Stimmt Markus, es sieht aus wie ein Problem mit dem String Operator.

    Obwohl das Ubidots Beispiel gut funktioniert für die Übertragung von wenigen Daten, ich würde dir empfehlen kein String Operator in dein Program zu benützen. Statt solltest du die "char *" und "sprintf" Funktionen verwenden.

    Dieses "Memory" Problem is ganz normal in eingebettete Systeme und Plattformen wie Arduino, ChipKIT, Spark, usw. Wenn man nicht so viel Vorhandenen Speicher hat, dann wird die Konkatenation von Strings problematisch.

    Hier ein paar Links darüber:

    http://chipkit.net/forum/viewtopic.php?f=7&t=241&start=10
    http://chipkit.net/forum/viewtopic.php?f=13&t=3101
    http://chipkit.net/forum/viewtopic.php?f=7&t=705

    Ich würde zuerst ein kürz Beispiel schreiben wo man ein "char *" miteinander durch die "sprintf" Funktion konkateniert.



  • @aguspg vielen dank
    Ich habe mal das Programm gewechselt. Anstatt mpide verwende ich jetzt uecide und siehe da, sogar der alte Programmcode funktioniert.
    Wenn ich genug Zeit habe, dann kann ich es ja noch mit char* versuchen


Anmelden zum Antworten