Hulp gevraagd bij het verzenden van een URL

Hallo allemaal.

Ik ben Marcel en ben nu ongeveer een half jaar bezig met Anduino, en vindt het geweldig :slight_smile: .

Inmiddels heb ik mijn eerste project af, een alarminstallatie. Maar nu wil ik hem gaan uitbreiden met een internetshield de W5100. Deze heb ik aangesloten op mij Aduino mega en de voorbeelden die hier van zijn doen het ook.

Wat moet deW5100 gaan doen.
Als er alarm is dat hij een URL versturen namelijk (http://192.168.1.15:2500/control/control?set&section=actionhandler&ah1_arming=disable)
Deze de URL of Api gaat naar een IP camera, die ik dan een actie kan laten uitvoeren bijvoorbeeld een foto versturen of in mijn geval een nummer bellen.

Wat is nu mijn vraag.
Heb ik een andere librarie voor nodig of kan het met de bestaande.
En wie wil mij hier een beetje op weg helpen hiermee.

Ik vraag geen kant en klare oplossing hiervoor maar wel een zetje in de goede richting.

Alvast bedankt.

Dus als ik het goed begrijp:
a) Arduino Ethernet shield krijgt alarm signaal
b) deze stuurt een URL uit naar een IPAdres met evt aanvullende data
en klaar want de ontvanger doet de rest...

Gewoon een ethernet client inrichten. Zijn al meerdere voorbeelden van gemaakt. Ook waarbij bijvoorbeeld met Google gekoppelt wordt. Op het NL forum is als eens ziiets uitgewerkt in het verleden...

Dus gewoon de standaard ethernet library

@Nico,

Ik krijg inderdaad een input op mijn Mega en wil dan een URL vesturen.
De ontvanger doet dan de rest, in dit geval de camera.

Ik ben met een voorbeeld van webclient bezig geweest maar ik krijg het niet voor elkaar :frowning:
De camera ontvangt de URL niet. Wel krijg ik een IP adders van mijn router en kan de cleint contact maken met d server.

zie hieronder mijn code

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network.
// gateway and subnet are optional:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dnsServer(192,168,1, 1);

byte server[] = { 192, 168, 1, 15 };

EthernetClient client;


void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
    

  // start the Ethernet connection:
  Serial.println("Trying to get an IP address using DHCP");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // initialize the ethernet device not using DHCP:
    Ethernet.begin(mac, ip, gateway, subnet);
  }
  // print your local IP address:
  Serial.print("My IP address: ");
  ip = Ethernet.localIP();
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(ip[thisByte], DEC);
    Serial.print("."); 
  }
    
   if (client.connect(server, 2500)) {
    Serial.println("connected");
    client.println("http://192.168.1.15:2500/control/control?set&section=actionhandler&ah1_arming=disable");
    client.println();
  } else {
    Serial.println("connection failed");
  }
  }

void loop() { 
 
  }

Ik hoop dat iemand mij verder kan helpen.

Moet je dat niet via een GET doen? zie: Ethernet - Arduino Reference

warsteiner:
@Nico,

Ik krijg inderdaad een input op mijn Mega en wil dan een URL vesturen.
De ontvanger doet dan de rest, in dit geval de camera.

Ik ben met een voorbeeld van webclient bezig geweest maar ik krijg het niet voor elkaar :frowning:
De camera ontvangt de URL niet. Wel krijg ik een IP adders van mijn router en kan de cleint contact maken met d server.

Bedoel je met "wel krijg ik een IP adres" dat de arduino server een IP krijgt of bedoel je dat de camera er een krijgt ?

Weet je zeker dat de camera goed ingesteld is ?
Meestal moet je eerst de wifi-camera met UTP aan de netwerkkaart van de PC hangen om de camera te configureren.
Eerder kan de camera geen contact met het wifi-netwerk maken.

De arduino krijgt een IP.
De camera (Mobotix)is goed ingestelden dat weet ik zeker!
Als ik in de webbrowser de URL in voer gaat de camera de opdracht uitvoeren.
Dit is dat wat ik invoer: http://192.168.1.15:2500/control/control?set&section=actionhandler&ah1_arming=disable

@Nico,

Ik dacht dat er juist geen GET voor moet omdat ik wat wil verzenden en niks meer wil ontvangen.
Maar ik kan het mis hebben, ga het morgen wel even testen.

Tja zou kunnen. Ben nooit een kei geweest in HTML calls. En volgens mij moet je wel iets terugkrijgen lijkt mij 200 OK boodschap.
Zou ook wel eens een PUT kunnen zijn : Sending a PUT request with an arduino - Stack Overflow

Als ik de sketch uitvoer met de IP en port aangepast aan mijn situatie krijg ik: connected

betekent dus connected met mijn IP camera.
Alleen kan mijn camera niets doen met het commando.
Ik zal eens proberen de handleiding van die camera te downloaden en zien of ik daar wijs uit kan.

Je zou misschien eens kunnen proberen dit in de loop te zetten en kijken wat de camera terugstuurt.

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

edit:
mijn camera geeft als antwoord op jouw code:
Access Error: Page not found
Bad request type
In html in de monitor ziet het er zo uit:

HTTP/1.1 400 Page not found
Server: GoAhead-Webs
Date: Wed Dec 3 00:37:12 2014
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html

Document Error: Page not found

Access Error: Page not found

Bad request type

disconnecting.

Dus jouw camera zal ook wel iets terug te melden hebben.
Aan de hand daarvan kun je kijken wat er fout gaat.

Het is gelukt! :smiley:

Ik moest er wel GET van maken al weet ik niet zo goed waarom :slightly_frowning_face:
Zo is de regel geworden: client.println("GET /control/control?set&section=actionhandler&ah1_arming=disable HTTP/1.0");
Kan iemand ook uit leggen wat hier nu gebeurt, zo dat ik het ook begrijp :wink:

@cartoonist
Ook had ik de code in de loop gezet wat je zei, zo dat je ziet wat er gebeurd.
Dit was wat ik zag:

Trying to get an IP address using DHCP
My IP address: 192.168.1.40.connected
HTTP/1.0 200 OK
Content-type: text/plain; charset=utf-8
Cache-Control: no-cache

ah1_arming=enable

disconnecting.

Bedankt voor de hulp.

if (client.connect(server, 2500)) {}
server = 192.168.1.15 port = 2500
achteraf gezien logisch dat http://192.168.1.15:2500 dubbelop was in de request van arduino aan de camera.

De browser maakt van deze regel: http://192.168.1.15:2500/control/control?set&section=actionhandler&ah1_arming=disable

GET /control/control?set&section=actionhandler&ah1_arming=disable HTTP/1.1
Host: 192.168.1.15:2500
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

Dat verklaart waarom je met de Arduino GET moet gebruiken, deze bootst immers een webbrowser na.

Met de volgende code kun dat zelf checken in je monitor venster. Browser openen en een verzoek naar de arduino server sturen, de arduino toont in de monitor alles wat de browser verstuurt.

#include <SPI.h>
#include <Ethernet.h>

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 177); // IP address, may need to change depending on network
EthernetServer server(2500);  // create a server at port 80

void setup()
{
    Serial.begin(9600);
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                Serial.print(c);
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println(F("HTTP/1.1 200 OK"));
                    client.println(F("Content-Type: text/html"));
                    client.println(F("Connection: close"));
                    client.println();
                    // send web page
                    client.println(F("<!DOCTYPE html>"));
                    client.println(F("<html>"));
                    client.println(F("<head>"));
                    client.println(F("<title>Arduino Web Page</title>"));
                    client.println(F("</head>"));
                    client.println(F("<body>"));
                    client.println(F("<h1>Here my code</h1>"));
                    client.println(F("<p>A web page from the Arduino server</p>"));
                    client.println(F("</body>"));
                    client.println(F("</html>"));
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

code geleend van Basic Ethernet Shield Arduino Web Server

@cartoonist,

Bedankt voor je uitleg, ik heb weer wat om uit te zoeken.

Ik heb nog een vraag over de volgende stukje code, wat aan het einde van mijn functie loop staat

void loop() { 
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
  }

Nu weet ik dat dit het einde van mijn if opdracht is, zo dat hij dit niet gaat herhalen. Nu wil ik graag weten waarom er nu tussen de 2 haakjes ; staat en ook wat ze betekenen. Ik weet dat je de ; altijd achter een opdracht zet, maar dit kan ik even niet goed plaatsen.

Dat is een lege for loop.
Die staat hier beschreven.
Het is een complete for loop maar met helemaal niets er in.
In assembler (in ieder geval voor de 6510 van de commodore 64) is er een NOP commando om heel even niets te doen.
Dit lijkt daar op.
Geen idee of er een speciale truc is die hiermee uitgehaald word.
[edit]Ik vermoed overigens dat de IDE dit er tijdens het compileren uit sloopt omdat het niet veel meer dan ballast is.[/edit]

for(;:wink: // edit dit is leuk maar er moet staan:
for ( ; ; )
;

Dit is een eindeloze loop van niets doen.
Daar gezet omdat het 't einde is van het programma en de loop niet opnieuw moet worden gestart.

Inderdaad, daar staat eigenlijk doe drie keer niets.
Die had ik nog niet eerder gezien, je komt vaker een lege while tegen die even weinig doet.

Twee ultieme voorbeelden van blokkerende code, die bewijzen dat delay() niet de enige doodzonde is.

Dat verklaard waarom ik dit stukje niet snapte :wink: Er gebeurd hier gewoon niks! :slight_smile:

Niet zo negatief over delay zijn MAS3.

Ik gebruik het ook graag :grin:

Vooral de delayMicroseconds(), die is zo praktisch als je een IR of RF code wil versturen, je datalijntje zoveel microseconde HIGH en dan weer zoveel microseconde LOW. noInterrupts() aan het begin van de routine en Interrupts() aan het einde.
Lang leve Delay(Microseconds)() :disappointed_relieved:

En iedereen die begint met de arduino begint met delay(). Er zijn volop toepassingen waarin het geen rol speelt dat je programma niet reageert op input en daar is een delay prima op zijn plaats. Het maakt code zo eenvoudig en overzichtelijk.

Maar ik vind ook dat als het de boel blokkeert dat het eruit moet. Niets is zo frustrerend als een toets indrukken die niet reageert omdat je programma ergens in een delay() zit.