Requête GET avec un ENC28J60

Bonjour à tous!

Je souhaiterai que mon Arduino envoie une requête GET à mon serveur en LAN pour remplacer leur liaison 433 MHz actuelle.

En DHCP, j’obtiens “DHCP failed” via le port série.

En IP fixe, j’obtient
“Server: 192.168.42.201
Gateway found”

Les LEDs de lien et d’activité sont allumées

Cependant, mon serveur ne reçoit rien.
L’Arduino n’est pas présent dans la liste des périphériques de mon routeur.
Il ne répond pas non plus au ping.

Une idée ?

Voici mon code :

#include <EtherCard.h>

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,42,152 };
// ethernet interface ip netmask
static byte mask[] = { 255,255,255,0 };
// gateway ip address
static byte gwip[] = { 192,168,42,254 };
// remote website ip address and port
static byte hisip[] = { 192,168,42,201 };
// remote website name

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

static void my_callback (byte status, word off, word len) {
  //Ethernet::buffer[off+300] = 0;
  //Serial.println("Contenu HTML");
  //String tout = (const char*) Ethernet::buffer + off;
  //Serial.println(tout);
}

void setup ()
{
  Serial.begin(115200);
  
  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) Serial.println( "Failed to access Ethernet controller");

  ether.staticSetup(myip, gwip, NULL, mask);
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);

  while (ether.clientWaitingGw()) ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
}

void loop ()
{
  ether.packetLoop(ether.packetReceive());
  ether.browseUrl(PSTR("/core/api/jeeApi.php?apikey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&plugin=virtual&type=virtual&id=xxxx&value=42"), "", "192.168.42.201", my_callback);		// Test requete GET
  delay(30000);		// 30sec de délai pour éviter de saturer le serveur entre les essais
}

Si tu travailles en ip fixe et que ta carte Ethercard réclame l'adresse ip

static byte myip[] = { 192,168,42,152 };

Qui te dis que le routeur est OK pour la lui accorder ? Quelle manip as tu faite sur ton routeur pour gérer les IP fixes ?

D'autre part l'adresse MAC choisie est-elle bien unique sur le réseau ?

Remarque : le circuit intégré ENC28J60 est un circuit rudimentaire, qui ne peut fonctionner qu'avec une librairie particulière assez lourde complétant ses limites..... les € gagnés en optant pour un module à ENC28J60 sont vites perdus en galères et temps de mise au point si on compare avec une solution utilisant un circuit W5200 ou W5500. ou une solution WiFI répandue.

Qui te dis que le routeur est OK pour la lui accorder ?

L’adresse en question n’est pas utilisée donc je ne vois pas pourquoi mon routeur ne voudrait pas la donner à l’ENC28J60 s’il lui la demande, sachant que cette adresse est hors de la plage DHCP

Il n’y a aucun autre ENC28J60 sur le réseau (qui aurait pu avoir un code similaire avec la même adresse MAC ni aucun autre équipement

Je reconnais que l’ENC28J60 m’a déjà fait perdre beaucoup de temps mais j’en ai sous la main et ce n’est pas tant le prix mais plutôt les 3 semaines de livraisons qui me poussent à m’accrocher à ces modules

Bonjour

le terminal retourne le : “Gateway found”

J4l13n: Bonjour

le terminal retourne le : "Gateway found"

Bonsoir

Oui, comme précisé dans mon exemple, il retourne le Gateway found en série

Bon, déjà j'ai remplacé l'adresse IP par ether.hisip dans la fonction loop

L'attribution de l'IP fonctionne visiblement puisque je n'ai pas d'erreur en série et la bestiole répond désormais au ping (alors que je n'ai pas touché au code pour la partie initialisation, c'est assez bizarre)

J'ai également dé-commenté tout ce qui se trouve dans la fonction callback, cependant je ne reçois rien en série et bien évidemment mon serveur ne se met pas à jour

Je pense à une erreur syntaxique (comme des virgules au lieu des points pour l'adresse IP, d'où le remplacement par ether.hisip)

J'ai enfin réussi, partiellement.

Je suis parvenu à faire bouger une valeur de mon serveur domotique, mais uniquement en incluant la nouvelle valeur directement dans le stach prepare.

J'ai alors essayé comme suit :

static void sendToJeedom ()
{
  int val = 18;
    Serial.println("Sending to Jeedom");
    byte sd = stash.create();

    stash.print("&value=");
    stash.print(String(val));

    stash.save();
    int stash_size = stash.size();

  // Compose the http POST request, taking the headers below and appending
  // previously created stash in the sd holder.
    Stash::prepare(PSTR("GET http://$F/core/api/jeeApi.php?apikey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&plugin=virtual&type=virtual&id=459 HTTP/1.1" "\r\n"
    "Host: $D" "\r\n"
    "User-Agent: Arduino/1.0" "\r\n"
    "Content-Length: $D" "\r\n"
    "\r\n"
    "$H"),
  website, website, stash_size, sd);

  // send the packet - this also releases all stash buffers once done
  // Save the session ID so we can watch for it in the main loop.
    session = ether.tcpSend();
}

Je reçois une confirmation de succès via série (HTTP/1.1 200 OK), la valeur se met à jour dans mon serveur mais vaut toujours 0.

L'argument value n'est pas pris en compte lorsque je le mets dans stach print alors que tout se passe à merveille lorsqu'il est dans stach prepare

Une idée pour utiliser une variable (un entier) comme valeur ?