Envoi d'une requête http

Bonjour,

Je viens tout juste de recevoir un arduino uno wifi. Pour se connecter à mon réseau Wifi et afficher via serial la température d'une termistance, je n'ai pas de soucis. Le truc c'est que je voudrais envoyer cette valeur à mon serveur domoticz. Normalement, il suffit d'une requete http du type : http://ip:port/json.htm?type=command¶m=udevice&idx=63&nvalue=0&svalue=20 (63 étant l'idx de mon dispositif sur mon serveur et 20 (pour l'exemple) la valeur à envoyer)

D'après ce tutoriel, cela ne devrait pas être si compliqué : https://www.arduino.cc/en/Tutorial/HttpClient

Mais la commande suivante "client.get(http://ip:port/json.htm?type=command¶m=udevice&idx=63&nvalue=0&svalue=20);" ne met pas à jour mon dispositif.

Pourriez-vous m'aiguiller pour que cela fonctionne ?

D'avance merci.

Bonjour et bienvenue,

tu remplaces bien ip:port par les bonnes valeurs ?

Oui, pas de soucis. J’ai testé l’url dans mon navigateur sur PC et elle met bien à jour mon dispositif.

Voici mon bout de code :

#include <SPI.h>
#include <WiFiNINA.h>
// #include <Bridge.h>
#include <HttpClient.h>

[... setup et tout ça...]

HttpClient client;
  // Construction l'url
  String url = "http://192.168.1.xx:yyyy/json.htm?type=command&param=udevice&idx=63&nvalue=0&svalue=";
url += Tc;
  
  client.get(url);
  while (client.available()) {
    char c = client.read();
    // Serial.print(c);
  }
  Serial.flush();

  delay(5000);

En retour j’ai un message, genre chiffré, en boucle qui ne respecte pas du tout les 5000ms.

Normalement la commande get retourne un code de retour en cas d'erreur. Je ne trouve pas la doc exacte mais en attendant qu'un autre forumeur sois plus inspiré tu peux peut-être l'afficher sur la console ?

Et comment l'afficher sur la console ?

Merci pour tes réponses et de prendre le temps de m'aider au fait ;)

Pas de quoi, et ce n'est pas garanti ;-)

Pour afficher sur la liaison série pour visu dans la console (carte branchée en USB au PC) :

1 dans le setup :

Serial.begin(9600); // elle peut-mettre quelques sec. a s'initialisée sur le uno je crois delay(3000);

  1. Dans le loop

int ret=client.get(url); Serial.print("ret:"); Serial.println(ret);

  1. Une fois le programme compilé et téléversé ouvre la console (menu outils -> moniteur série), tu dois voir s'afficher "ret:XX". Si ce n'est pas le cas vérifie dans la console la vitesse (9600).

Alors voici le code ret: 29226 La vitesse est bonne (9600)

Et voici mon retour :

Contacte le SETI !

Bon là je sèche… Tu as un lien vers ta carte (même modèle) ?

Ma carte c'est l'officielle Arduino Uno Wifi Rev 2.

Si jamais c'est plus simple de faire compliquer, mon but est le suivant : un script tourne sur Domoticz et envoi une requête http vers l'arduino pour lui demander la température (et d'autres choses par la suite). Ca me permettrai de choisir l'intervalle des mesures dans ce script. Donc peut-être que sous cette forme d'échange, il y aurait une solution plus accessible...

Oui c'est intéressant. Mais je n'ai pas d'expérience sur cette carte. Comme c'est la fusion de 2 cartes tu dois peut-être utiliser obligatoirement la bibliothèque qu'ils décrivent sur le site officiel ?

Il ne font pas un client HTTP comme tu montres mais comme ça .

Merci pour le lien.

J'ai déjà vu cette page mais je comprenais pas le truc du GET... mais là j'ai eu une illumination !

J'ai réussi à injecter une valeur mais je ne parviens pas à injecter la valeur de la variable. Il va falloir que je trouve comment découper cette partie "GET /json... HTTP/1.1")

C'est quoi le type de Tc (un float, un int) ?

Un float.
Je pense qu’il va falloir que je le tronque à 0.1 et non 0.01.

Tu cherches à passer de :

http://ip:port/json.htm?type=command¶m=udevice&idx=63&nvalue=0&svalue=20

à :

GET /json... HTTP/1.1

Si c'est cela qui bloque je peux aider.

Voilà, mon arduino communique bien la température à mon serveur domoticz.

Bon, c'est pas parfait car, bien qu'il tourne en boucle, il n'envoie la valeur que la première fois... Ce n'est pas très grave vu que ce n'est pas le fonctionnement que je veux au final.

Je vais passer à la partie serveur sur l'arduino pour recevoir la requête de domoticz maintenant.

Re. J'ai bien avancé, j'ai un interrupteur virtuel sur Domoticz qui envoie une commande à mon arduino qui répond bien en changeant la valeur de mon dispositif de température.

Par contre, j'ai un problème de conversion/comparaison de chaine de caractère.

Pour récupérer l'url saisie par domoticz, un tableau est déclaré comme ceci (j'ai trouvé ça dans un tuto) :

char *url = (char *)malloc(100);

Et rempli comme ceci :

char carlu = client.read();
if(carlu != '\n') {
   url[index] = carlu;
   index++;
   } else {
   url[index] = '\0';
   }

J'ai tenté de le convertir en String en faisant :

String surl;
surl = String(url);
...
String mess;
mess = String("GET /test HTTP/1.1");
  if (surl == mess) {
    ...
  }

Mais ça ne fonctionne pas. Je n'entre jamais dans le "if". Si j'affiche mes 2 variables String, elles sont identiques mais je soupçonne un défaut de construction de ces variables. Idem en ajoutant "\0" à la fin de "mess".

Pouvez-vous m'aider ?

Ça devrait fonctionner, rien d'incohérent à première vue de mon coté :-(.

Le tableau "url" est initialisé comme ceci :

*url = '\0';

Quand je fais un "surl.length()" j'obtiens 19 contre 18 pour "mess.length()". Et si je rajoute un "\0" à la fin de mess, j'ai toujours 18.

Edit : J'ai essayé avec une espace à la fin et "\n", je passe bien à 19 caractères mais ça ne rentre toujours pas dans le si.

Edit 2 : J'ai résolu le problème en changeant de méthode. Je cherche le mot clé "test" grâce à indexOf et si le résultat est supérieur à 0, ça rentre dans le si. Une bonne chose de faite !

Salut manubis_sanchez,

je suis justement en train de plancher sur le même problème que toi https://forum.arduino.cc/index.php?topic=631576.0

(Merci supercc au passage ;-) )

manubis_sanchez: Voilà, mon arduino communique bien la température à mon serveur domoticz.

Bon, c'est pas parfait car, bien qu'il tourne en boucle, il n'envoie la valeur que la première fois... Ce n'est pas très grave vu que ce n'est pas le fonctionnement que je veux au final.

Je vais passer à la partie serveur sur l'arduino pour recevoir la requête de domoticz maintenant.

As-tu le code qui fonctionne ?

@+