Show Posts
Pages: [1]
1  International / Deutsch / Re: String/Array auflösen bei Webabfrage on: January 15, 2013, 04:06:06 pm
Uffff!


Werd mir das mal bei Gelegenheit anschauen, ob ich das verstehe, auf dem ersten Blick sehr... verwirrend.

Im Moment habe ich aber erstmal das Problem, daß ich (warum auch immer) heute keine DNS Auflösung bekomme (DNS failed). Meine Versuche ihm von Hand einen unterzuschieben funktionieren irgendwie nicht. Wobei es gestern auch so ging....

NARRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFF    smiley-yell

Hab im nun nen google DNS unter geschoben, funzt aber trotzdem nicht mehr. Ist doch alles sch***** :-(


Ich bekomme nicht mal mehr das getViaDNS Beispiel zum Laufen im heute...

Und bei dem Beispiel sollte man ja wohl erwarten, daß es funktioniert, oder?

Ich sehe grade, das Beispiel "getDHCPandDNS" ist fast mein Code (der seit 2 Tagen nicht funktioniert, das Beispiel auch nicht)...

Code:
// This demo does web requests via DHCP and DNS lookup.
// 2011-07-05 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

#define REQUEST_RATE 5000 // milliseconds

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// remote website name
char website[] PROGMEM = "google.com";

byte Ethernet::buffer[700];
static long timer;

// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[getDHCPandDNS]");
 
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");

  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
 
  ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
  ether.printIp("Server: ", ether.hisip);
 
  timer = - REQUEST_RATE; // start timing out right away
}

void loop () {
   
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb);
  }
}

Warum ging das vor 2 Tagen und jetzt nicht mehr?
2  International / Deutsch / Re: String/Array auflösen bei Webabfrage on: January 14, 2013, 03:43:05 pm
Uffff!


Werd mir das mal bei Gelegenheit anschauen, ob ich das verstehe, auf dem ersten Blick sehr... verwirrend.

Im Moment habe ich aber erstmal das Problem, daß ich (warum auch immer) heute keine DNS Auflösung bekomme (DNS failed). Meine Versuche ihm von Hand einen unterzuschieben funktionieren irgendwie nicht. Wobei es gestern auch so ging....

NARRRRFFFFFFFFFFFFFFFFFFFFFFFFFFFFF    smiley-yell
3  International / Deutsch / Re: String/Array auflösen bei Webabfrage on: January 14, 2013, 11:13:22 am
Das Problem ist aber, das dieser Konstruktor immer eine komplette Kopie des übergebenen Strings macht. Das frisst zusätzlich Speicher, da die ENC28J60 Lib schon 700 Bytes Buffer verwendet. Dazu kommt dann die Kopie von einem großen Teil des Buffers.

Hättest Du eine elegantere Möglichkeit? Ich bin halt noch am lernen, versuch das ganze zu begreifen. Nachdem meine Ausflüger bisher eher im Basic (damals der gute alte C 64) und später HTLM und Javascript waren erscheint mir hier alles etwas.... kompliziert, um es mal so auszudrücken.
Wichtig wäre mir eine Lösung, bei der ich irgendwie einzelne Stellen und Blöcke aus einer Datei (ob ich sie nun .txt nenne oder wie auch immer) auszulesen.

@jurs: wenn ich die ersten Stellen als "substring" ausgeben lasse, kommt irgendwas mit "HTTP/1.1.0 OK" oder so ein Kram, der mir gar keinen Sinn ergibt.
Ich würde den genauen Text ja gerne posten, aber aus irgendeinem Grunde bekomme ich grade "DNS failed" die letzten 15 Minuten, vorhin lief es wunderbar  smiley-confuse


2. Frage: Kann man die ENC28J60 Lib für den Fall nicht auch noch kürzen irgendwie? Im Moment läuft es so auf nem 328er (Uno), auf nem 168er bekomme ich es nicht zum Laufen, die 1kb SRAM reichen wohl nicht (hab auch schon versucht den Buffer kleiner zu machen, bringt nix). Wenn nicht, ist das auch nicht sooo schlimm, dann werd ich die 168er eben nur für stationäre Anwendungen nutzen, der 328er Pro Mini kost ja als Klon auch nicht mehr. Ist halt nur so, daß die 168er grade noch rumfliegen  smiley-grin
4  International / Deutsch / Re: String/Array auflösen bei Webabfrage on: January 14, 2013, 07:11:22 am
Keiner einen Plan, warum "endsWith" als Einziges geht und wie man da sonst Teilvariablen auslesen kann?
5  International / Deutsch / String/Array auflösen bei Webabfrage on: January 12, 2013, 12:36:24 pm
Moinsen!

Ich habe da ein "interessantes" Problem, bei dem mir nicht klar ist, warum das so ist und für mich ist es irgendwie unlogisch. Aber ich bin ja noch Greenhorn smiley-mr-green


Ich habe eine Webabfrage, der Ardu spricht in regelmäßigen Abständen einen Server an und holt den Inhalt einer Textdatei. Diese hat als Inhalt eine 6-stellige Zahlenkombination. An Hand der Kombination soll der Ardu nun reagieren.

Das tut er aber komischerweise nur mit der Funktion string.endsWith, alle anderen Abfragen werden ignoriert, bzw ergeben nur Grütze.

Kann mir einer verraten, warum das so ist?

Hier mal die wichtigen Code Ausschnitte:

// include usw... rausgekürzt

Code:

char website[ ] PROGMEM = "meineURL.de";

// called when the client request is complete
static void my_callback (byte status, word off, word len){

String  schalter = ((const char*) Ethernet::buffer + off);
 
  Serial.println (schalter); // liefert den kompletten 6-stelligen Textcode
 
  Serial.println (schalter.substring(0,3));  // liefert irgendwelche Grütze, aber keine Teile des o.g. Codes
 
 //Abfragen funktionieren, wenn der Code in der Textdatei entsprechend endet
 
 if (schalter.endsWith("000")) {
   digitalWrite(2, LOW);
 }

 
  if (schalter.endsWith("999")) {
  digitalWrite(2, HIGH);
 }
 
 
// Abfragen funktionieren nicht

  if (schalter.substring(3,7) = "000") {
    digitalWrite(3, LOW);
  }
 
  if (schalter.substring(3,7) = "999") {
    digitalWrite(3, HIGH);
  }


// Variante Abfragen funktionieren auch nicht

if (schalter.startsWith("000")) {
    digitalWrite(3, LOW);
  }
 
iif (schalter.startsWith("999")) {
    digitalWrite(3, HIGH);
  }



//um das void setup gekürzt


Code:


void loop () {

 
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer) {
    timer = millis() + 5000;
    ether.browseUrl(PSTR("/verzeichnis/"), "datei.txt", website, my_callback);   

  }


}



 

Auch nur einzelne Stellen mit Substring abzufragen funktioniert nicht.

OK, ich kann mir jetzt erstmal behelfen, indem ich mit eine mathematische Formel überlege, um alle Möglichkeiten mit möglichst wenig Code in solche "endsWith" zu bekommen, aber spätestens wenn es nicht nur zwei relevante Zustände und Empfänger (Schalter) sind, wird es unübersichtlich...

Jemand eine Idee, wie man das Problem lösen kann und warum das so ist?
6  International / Deutsch / Re: Täglich grüßt das Murmeltier - Ardu und Webabfrage on: January 12, 2013, 12:09:32 pm
OK, ich habe es grundsätzlich zum Laufen bekommen... Mal wieder ne Zeile vergessen gehabt (die Webseite über die DNS aufzulösen)...

Allerdings habe ich ein anderes Problem, was ich mit Tricks umgehen kann, mich würder aber interssieren, warum das nicht so geht und ggfls wie man das sonst machen müsste.


Aber ich glaube ich mal dazu mal einen neuen Thread auf, weil es mit dem Ursprung nicht mehr so viel zu tun hat...
7  International / Deutsch / Re: Täglich grüßt das Murmeltier - Ardu und Webabfrage on: January 12, 2013, 08:42:27 am

Werd ich dann mal machen, thnx. Wobei es nun erstmal darum geht das grundsätzlcih auf dem Uno zum laufen zu bekommen....
8  International / Deutsch / Re: Täglich grüßt das Murmeltier - Ardu und Webabfrage on: January 11, 2013, 01:21:34 pm
Ich habe 2 Dinge getan:

1. den mini Pro 168 gegen einen Uno getauscht, plötzlich taten auch die Beispiele. Ich werde bei Gelegenheit mal ein mini Pro 368 antesten.

2. ich habe den Code mal entsprechend dem Beispiel umgebaut.

Allerdings hakt es irgendwo immer noch und zwar im Bereich der void my_callback

Ich habe mal ein paar Serial Print eingebaut, um zu sehen, wo er ist und hakt.

Code:

Code:
#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];

static uint32_t timer;

//Webseite
char website[] PROGMEM = "meineURL.de";

// called when the client request is complete
static void my_callback (byte status, word off, word len){
 
  Serial.println("Blubber");
 
  Ethernet::buffer[off+300] = 0;
  String stringOne = ((const char*) Ethernet::buffer + off);
 
    Serial.println(stringOne);
 
 
 //Abfragen
 if (stringOne.substring(0,3) == "000") {
   digitalWrite(2, LOW);
 }
 
 if (stringOne.substring(0,3) == "999") {
  digitalWrite(2, HIGH);
 } 
 
 
  if (stringOne.substring(3,7) == "000") {
    digitalWrite(3, LOW);
  }
 
  if (stringOne.substring(3,7) == "999") {
    digitalWrite(3, HIGH);
  }
 

}

void setup () {

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);   
 
 
 
  Serial.begin(57600);
  Serial.println("\n[testDHCP]");

  Serial.print("MAC: ");
  for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();
 
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");

  Serial.println("Setting up DHCP");
  if (!ether.dhcpSetup())
    Serial.println( "DHCP failed");
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
}

void loop () {

 
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer) {
    timer = millis() + 5000;
    ether.browseUrl(PSTR("/verzeichnis/"), "schalter.txt", website, my_callback);   
    Serial.println("check");
   
  }


}



Die Ausgabe im Monitor:

[testDHCP]
MAC: 74:69:69:2D:30:31
Setting up DHCP
My IP: 192.168.2.118
Netmask: 255.255.255.0
GW IP: 192.168.2.1
DNS IP: 192.168.2.1
check
check
check
....

Daran sieht man, daß er zwar den void loop abarbeitet (check...), aber schon beim void my_callback bekomme ich kein Feedback mehr, er scheint da also nix auszuführen.

Den Teil habe ich so übernommen, mir ist nicht klar, was die Aspekte in den Klammern genau bedeuten sollen, irgendwie habe ich da beim googeln nix Hilfreiches gefunden.....
9  International / Deutsch / Re: Täglich grüßt das Murmeltier - Ardu und Webabfrage on: January 10, 2013, 10:22:39 am
Ich habe den ENC28J60, das passt schon...

Allerdings treiben mich die Beispielsketche grade zur Verzweiflung...


In dem "testDHCP" Code sind diverse Serial.print Befehle drin.

  Serial.println("\n[testDHCP]");
  Serial.print("MAC: ");

werden im Monitor irgendwie "ignoriert", einfach nicht "gedruckt".  Dann folgt die MAC adresse mit Doppelpunkten dazwischen in einer Reihe. Danach kommen mit Glück noch diverse IP Adresse, aber wieder (!) ohne die festgelegten Texte vorweg. Bei der 3. IP ist sind vorweg ein paar Leerzeichen und dann ein Å...

Lösche ich alles was mit der MAC/IP Variablen Ausdruckerei zu tun hat, schreibt er sauber die beiden oben genannten Zeilen aus. WTF?????

Habe schon diverse Baudraten probiert, gibt alles keine Besserung....

Hier noch mal der komplette Beispielsketch:

Code:
// Arduino demo sketch for testing the DHCP client code
//
// Original author: Andrew Lindsay
// Major rewrite and API overhaul by jcw, 2011-06-07
//
// Copyright: GPL V2
// See http://www.gnu.org/licenses/gpl.html

#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];

void setup () {
  Serial.begin(57600);

    Serial.println("\n[testDHCP]");
  
  Serial.print("MAC: ");
  
    for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");

  Serial.println("Setting up DHCP");
  if (!ether.dhcpSetup())
    Serial.println( "DHCP failed");
  
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

}

void loop () {}




Nachtrag, es muss irgendwie an " if (!ether.dhcpSetup()) " liegen, wenn ich das lösche, druckt er das "Formblatt" richtig, aber alle IPs sind nur 0.0.0.0
10  International / Deutsch / Täglich grüßt das Murmeltier - Ardu und Webabfrage on: January 10, 2013, 02:38:28 am

Sorry, wenn ich zum Xten Male das alte Problem anspreche, aber ich habe so viele verschiedene Seiten dazu gefunden, jeder macht es etwas anders, da möchte ich gerne durchsteigen und auch verstehen, was ich da mache und warum es klappt (oder in meinem Falle eben nicht so)

Zur Sache: Angedacht ist eine Webseite, welche Eingaben ermöglicht und diese dann in einer Datei speichert. Die Webseite ist kein Thema, das habe ich alles, funktioniert auch so wie es soll.

Nur der Ardu will nicht so ganz wie ich und ich habe irgendwie das Gefühl, daß es im Bereich der Verbindung/des Lesens hakt, daß der Kleine gar nicht erst ins weite Internet kommt, sondern irgendwo im Router hängenbleibt.

In der Datei sind im Moment die Daten als 6-stellige Zahlenfolge gespeichert. 000000 bedeutet beide Schalter aus, 999999 beide an. Die Zahlen dazwischen sollen später für andere Funktionen genutzt werden.
Zu finden im Web ist sie nach dem Schema "http://meineURL.de/test/test.txt"


Mein Sketch so weit:

Code:
#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
// ethernet interface ip address
static byte myip[] = { 192, 168, 2, 20 };
// gateway ip address
static byte gwip[] = { 192, 168, 2, 1 };
// subnet ip address
byte subnet[]  = { 255, 255, 255, 0 };


byte Ethernet::buffer[700];
static uint32_t timer;

//Webseite
char website[] PROGMEM = "http://meineURL.de/test";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Ethernet::buffer[off+300] = 0;
  String stringOne = ((const char*) Ethernet::buffer + off);
 
 
 //Abfragen
  if (stringOne.substring(1,3) == "000") {
    digitalWrite(2, LOW);
  }
 
  if (stringOne.substring(1,3) == "999") {
    digitalWrite(2, HIGH);
  } 
 
  if (stringOne.substring(4,6) == "000") {
    digitalWrite(3, LOW);
  }
 
  if (stringOne.substring(4,6) == "999") {
    digitalWrite(3, HIGH);
  }
}

void setup () {

  pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);   

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip); 
  ether.printIp("DNS: ", ether.dnsip); 
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer) {
    timer = millis() + 5000;
    ether.browseUrl(PSTR("/"), "test.txt", website, my_callback);   
  }
}

Rein logisch sollte er IMO alles so abfragen wie gedacht.  aber irgendwo hakt es da noch.

Wäre nett, wenn mir da mal jmd weiterhelfen könnte und den Code mal überfliegen, ggfls Verbesserungsvorschläge liefern könnte. Obwohl meine "Programmierung" großteils aus Copy und Paste besteht, versuche ich das, was da steht auch zu verstehen und ggfls abzuändern. Eigentlich dachte ich ich habe es hier so weit richtig, aber irgendwo hakt es eben leider noch...
Pages: [1]