Simple commande HTTP

Salut tout le monde :slight_smile:

Bon alors aujourd'hui j'ai une petite question qui va très certainement vous paraître débile mais je me lance quand même.

J'ai foobar d'installé sur un pc, avec le composant http. Je vais câbler sur l'arduino des BP et simplement suivant chaque BP actionné, envoyer une commande HTTP (ex : http://192.168.0.100:8888/default/?cmd=PlayOrPause )

Seulement, aucun script que j'ai trouvé me permet de faire cela (ou alors je suis vraiment mauvais ^^)

Et bonnes fêtes a tous :slight_smile:

Bonjour,

Un truc dans ce genre devrait fonctionner :

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,177 };
byte gateway[] = { 192,168,0,1 };
byte server[] = { 192,168,0,100 };

const int bpPlay = 10;

Client client(server, 8888);

void setup() {
  Ethernet.begin(mac, ip, gateway);
  Serial.begin(9600);
  
  pinMode(bpPlay, INPUT);
  digitalWrite(bpPlay, HIGH)
  
  delay(1000);

  if (!client.connect())
    Serial.println("Cannot connect to IP !");
}

void loop()
{
	if(digitalRead(bpPlay) == LOW) {
	  Serial.print("Send Play/Pause ...");
	  if (client.connected()) {
		Serial.println(" Done !");
		client.println("GET default/?cmd=PlayOrPause HTTP/1.0");
		client.println();
	  } 
	  else {
		Serial.println(" Failed !");
                          Serial.println("Disconnected !");
                          client.stop();
                          if (!client.connect())
                            Serial.println("Cannot connect to IP !");
	  }
	  delay(1000);
	}
}

Merci pour ta proposition, seulement cela ne fonctionne toujours pas j'ai ceci :

Send Play/Pause ... Failed !

Si la commande je la met dans n'importe quel explorateur cela fonctionne c'est pour ca que je comprend pas trop pourquoi cela ne marche pas :~

J'ai modifier un peu mon code, essaye la nouvelle version pour voir.

Si la commande je la met dans n'importe quel explorateur cela fonctionne c'est pour ca que je comprend pas trop pourquoi cela ne marche pas

Si ça marque "failed !" c'est que l'arduino à pas pu se connecter à l'ip, regarde au niveau des paramètres ip/gateway/...

Bah les champs sont bon logiquement, dans gateway j'ai mis l'adresse ip de ma freebox (192.168.0.254) et a part ca tout le reste devrais etre bon.

et l'adresse que j'ai donné en exemple fonctionne parfaitement

Donc la pour l'instant cela me donne ca :

Cannot connect to IP !
Send Play/Pause ... Failed !
Disconnected !
Cannot connect to IP !

DragonsNoirs77:
Bah les champs sont bon logiquement, dans gateway j'ai mis l'adresse ip de ma freebox (192.168.0.254) et a part ca tout le reste devrais etre bon.

et l'adresse que j'ai donné en exemple fonctionne parfaitement

Donc la pour l'instant cela me donne ca :

Cannot connect to IP !

Send Play/Pause ... Failed !
Disconnected !
Cannot connect to IP !

Pourtant il affiche "cannot connect to ip" donc soit l'ethernet shield c'est pas initialisé correctement soit il à pas trouvé l'ip cible.
Essaye de rajouter le submask de ton réseau au Ethernet.begin() : Ethernet - Arduino Reference

J'ai rajouté le subnet, mais cela ne change rien, la carte est bien initialisé puisque si je fait un ping dessus j'ai bien un retour

DragonsNoirs77:
J'ai rajouté le subnet, mais cela ne change rien, la carte est bien initialisé puisque si je fait un ping dessus j'ai bien un retour

Le ping est géré par la puce w5100 en hardware donc si la carte est initialisé mais que la partie tcp/ip ne l'est pas la shield ethernet repondra quand même au ping.
Tente d'uploader un skecth d'exemple comme webclient pour voir si de base ça marche.

Le skecth webclient ne fonctionne pas, même pas de ping :frowning:

Ca me marque ceci :

connecting...
connection failed

disconnecting.

DragonsNoirs77:
Le skecth webclient ne fonctionne pas, même pas de ping :frowning:

Ca me marque ceci :

connecting...

connection failed

disconnecting.

Même pas de ping ? Tu as ajouter le gateway et le submask (l'exemple de base est pour une utilisation sans routeur) ?
Pense aussi à remplacer l'ip de google dans l'exemple, elle n'est plus bonne depuis trés longtemps.

Exemple WebClient de base + gateway/sbmask + ip google correcte :

#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:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,177 };
byte gateway = { 192, 168, 1, 1 };
byte submask = { 255, 255, 255, 0 }
byte server[] = { 74, 125, 230, 211 }; // Google

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip, gateway, submask);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

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:
    for(;;)
      ;
  }
}

Ca fonctionne, au début cela ne marchais pas, j'ai testé au hasard en changeant l'ip en mettant "192.168.0.177" au lieu de "1.177" cela marche nickel, voici ce que je recois :

connected
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Date: Sun, 01 Jan 2012 21:01:23 GMT
Expires: -1
Cache-Control: private, max-age=0

Plus tout un blabla de choses plus ou moins intéressantes :slight_smile:

DragonsNoirs77:
Ca fonctionne, au début cela ne marchais pas, j'ai testé au hasard en changeant l'ip en mettant "192.168.0.177" au lieu de "1.177" cela marche nickel, voici ce que je recois :
(...)
Plus tout un blabla de choses plus ou moins intéressantes :slight_smile:

Ok, donc il ne te reste plus qu'as reprendre le code d'avant et de te servir de l'exemple webclient comme base :wink:

C'est bien ce que je me suis dit, le seul problème est que cela ne fonctionne pas ...

J'ai mis ceci en 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:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,177 };
byte gateway[] = { 192, 168, 0, 254 };
byte submask[] = { 255, 255, 255, 0 };
byte server[] = { 192, 168, 0, 100 }; // Google

const int bpPlay = 12;
// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 8888);

void setup() {
  pinMode(bpPlay, INPUT);
  digitalWrite(bpPlay, HIGH);
  
  delay(1000);
  // start the Ethernet connection:
  Ethernet.begin(mac, ip, gateway, submask);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");


  // if you get a connection, report back via serial:
  if (client.connect()) {
    Serial.println("connected");

  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
	if(digitalRead(bpPlay) == LOW) {
	  Serial.print("Send Play/Pause ...");
	  if (client.connected()) {
		Serial.println(" Done !");
		client.println("GET default/?cmd=PlayOrPause HTTP/1.0");
		client.println();
	  } 
	  else {
		Serial.println(" Failed !");
                          Serial.println("Disconnected !");
                          client.stop();
                          if (!client.connect())
                            Serial.println("Cannot connect to IP !");
	  }
	  delay(1000);
	}
}

et lorsque je lance la console ca me donne bien ceci :

connecting...
connected

Mais dès que j'appuie sur le bouton :

Send Play/Pause ... Failed !
Disconnected !
Cannot connect to IP !

Bizarre ... à croire que client.connected() retourne toujours false ...

essaye ça :

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,177 };
byte gateway[] = { 192, 168, 0, 254 };
byte submask[] = { 255, 255, 255, 0 };
byte server[] = { 192, 168, 0, 100 };

const int bpPlay = 12;
Client client(server, 8888);

void setup() {
  pinMode(bpPlay, INPUT);
  digitalWrite(bpPlay, HIGH);

  Ethernet.begin(mac, ip, gateway, submask);
  Serial.begin(9600);
  
  delay(1000);
}

void loop()
{
	if(digitalRead(bpPlay) == LOW) {
	  Serial.print("Send Play/Pause ...");
	  if (client.connect()) {
        client.println("GET /default/?cmd=PlayOrPause HTTP/1.0");
        client.println();
		delay(200);
        client.stop();
        Serial.println(" Done !");
      } else {
        Serial.println(" Failed !");
      }
      delay(1000);
    }
}

Toujours pareil (je test en même temps en envoyant la commande via chrome par exemple et ca fonctionne nickel).

Sinon c'est pas parceque le foobar renvoit une page ?

Voici un aperçu :

Voila en mieux :

Et sinon j'ai regardé la page que cela me donne sous charles proxy (si cela peut aider) :
URL : http://192.168.0.100:8888/default/?cmd=PlayOrPause
Status : Complete
Response Code : 200 OK
Protocol : HTTP/1.1
Method : GET
Content-Type : text/html; Charset=UTF-8
Client Adress : /127.0.0.1
Remote Adress : 192.168.0.100/192.168.0.100

bonjour et bonne année,
tu pourrais faire un schéma avec les ip et gateway de ton montage.

Voila mon installation faite rapidement (désolé j'ai fait ca a la va vite ^^)

C'est bizarre le webclient fonctionne mais pas le skecth final ... hummm

Tente de prendre le webclient (qui marche) et de remplacer /search?q=arduino par /default/?cmd=PlayOrPause (+ ip google par l'ip foobar + port) logiquement foobar devrait se mettre en pause (ou en play) au setup() de l'arduino, au moins on saura si il répond à une requête "simple".

Pas de réelle avancée ...

Je prend le script de google, je modifie avec l'adresse de la freebox, je recoit des données, je met l'ip du pc ou se trouve foobar, mais en mettant un autre port, je recoit des infos, mais avec l'adresse foobar ... rien ... :frowning:

DragonsNoirs77:
Je prend le script de google, je modifie avec l'adresse de la freebox, je recoit des données, je met l'ip du pc ou se trouve foobar, mais en mettant un autre port, je recoit des infos, mais avec l'adresse foobar ... rien ... :frowning:

ça se connecte au moins ?
Si ça ce trouve foobar ne prend pas en charge le standard HTTP 1.0 mais HTTP 1.1 ...
Tente de remplacer :

client.println("GET /default/?cmd=PlayOrPause HTTP/1.0");
client.println();

par

client.println("GET /default/?cmd=PlayOrPause HTTP/1.1");
client.println("Host: 192.168.0.100");
client.println();
client.println();