Formatage chaîne de caractères

Bonjour,

je me prend la tête sur un résultat que je ne comprend pas. Je veux envoyer des données sur à partir d'un ESP01. Ca ne marche pas alors pour voir ce que j'envoie j'ai pompé du code afin de voir sur une page web ce qui est envoyé. J'ai créé une chaîne de caractère "/json.hrm?type=command", une 2ème "&par" et une troisième "am=udevice&idx=20&nvalue=0&svalue=20;50;1" or si je concatène les trois j'ai "/json.hrm?type=command¶m=udevice&idx=20&nvalue=0&svalue=20;50;1".

Pourquoi &para est remplacé par pi et comment contourner ce problème???

Merci à qui pourra m'aider!

Il faudrait en savoir plus pour te répondre.
Est-ce que tu utilises des String ou des tableaux de char? Comment fais-tu la concaténation ?

Trois chaines Json syntaxiquement correctes concaténées ne font pas une chaine Json syntaxiquement correcte. Utiliser un site de vérification syntaxique du Json.

lesept:
Il faudrait en savoir plus pour te répondre.
Est-ce que tu utilises des String ou des tableaux de char? Comment fais-tu la concaténation ?

des string (String deb1 = "/json.hrm?type=command"; ) et pour concaténer des + (String deb=deb1+deb2+deb3).

JiPe38:
Trois chaines Json syntaxiquement correctes concaténées ne font pas une chaine Json syntaxiquement correcte. Utiliser un site de vérification syntaxique du Json.

clairement le résultat n'est pas le bon, un site ne ferait que le confirmer.

C'est un truc de fou :
String a="&p";
String b="&pa";
String c="&par";
String d="&para";
client.print(a);
client.println("
");
client.print(b);
client.println("
");
client.print(c);
client.println("
");
client.print(d);

résultat :
&p
&pa
&par

pourquoi &para se transforme, je n'arrive pas à contourner ça et franchement...

Le problème vient peut-être du PC et pas de l'Arduino

C'est du html ? Alors le "/" est inutile sur la balise

Rajoute en dernière instruction : client.println("
");

le "ln" après "print" indique que tu rajoutes le ou les caractères de fin de ligne 0x8d 0x0A
Le
indique à un navigateur de passer à la ligne suivante, en html

Je ne vois pas ce que l'indication "json" vient faire dans ta question. Tu empiles trois bugs l'un sur l'autre : voir mon premier post.

Bonjour,
comme c'est de l'HTML tu a un souci d'interprétation car &para est une balise de caractère spéciaux
cf : https://www.commentcamarche.net/contents/489-caracteres-speciaux-html

pfffff15:
Bonjour,
comme c'est de l'HTML tu a un souci d'interprétation car &para est une balise de caractère spéciaux
cf : https://www.commentcamarche.net/contents/489-caracteres-speciaux-html

Ça ça m'aide.
Je voudrais mettre à jour l'idx 20 (température humidité) sur domoticz. Excusez-moi, je suis débutant. J'ai lu qu'on peut envoyer une chaîne json formatée vaguement comme j'ai fait. Comme ça ne marchait pas j'ai trouvé un script pour allumer une led, j'ai bidouillé pour afficher ce que j'envoie et j'ai ce foutu pi qui me perturbe.
Finalement je ne sais pas si ce qui était envoyé était correct ou si param était remplacé par pi. Si je voulais afficher &para et pas pi comment il faudrait m'y prendre.
Merci de prendre le temps d'apprendre à un débutant autre chose qu'un nombre utile

tu peux essayer avec "&param" mais sans grande conviction niveau interprétation

niveau interpretation on verra mais merci, parfait

en HTML &para c'est le symbole de paragraphe ¶, donc normal que ce soit cela que vous voyez si vous affichez le résultat dans une page HTML.

Mais si c'est dans l'URL ça ne sera pas interprété, c'est juste l'affichage par le navigateur

En principe, ces caractères d'échappement html doivent se terminer par un ";". Sans ce caractère de fin, les navigateurs ne sont pas censés afficher le caractère d'échappement en question. Mais entre ce que les navigateurs sont censés faire et ce qu'ils font...

oui.. bon si c'est interprété envoyer &para devrait résulter en &para

J'ai réussi à faire ce que je voulais, merci à vous (mesure de t° et envoi sur domoticz. Montage avec DHT22)

int pinGPIO2 = 1;

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#include <ESP8266WiFi.h>
#include <DHT.h>
#define DHTTYPE DHT22       // DHT type (DHT11, DHT22)
#define DHTPIN 0          // Broche du DHT / 

DHT dht(DHTPIN, DHTTYPE);
float t;
float h;
const int attendre = 10000;
#include <ESP8266HTTPClient.h>
const char* host = "*";//adresse IP du raspberry
const int   port = 8080;
const char* SSID = "*";
const char* password = "*";
// Create the ESP Web Server on port 80
WiFiServer WebServer(80);
// Web Client
WiFiClient client;
HTTPClient http;

void setup() {
  // put your setup code here, to run once:
  dht.begin();
  pinMode(DHTPIN, INPUT);
  pinMode(pinGPIO2, OUTPUT);
  digitalWrite(pinGPIO2, LOW);
  WebServer.begin();
  // Connect to WiFi network
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}
void loop() {
  allume();
  delay(attendre);
  eteint();
  clig();
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  // put your main code here, to run repeatedly:

  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (isnan(t) || isnan(h)) {
  }
  else {
    eteint;
    String url = "/json.htm?type=command&param=udevice&idx=18&nvalue=0&svalue=";
    url += t;
    url += ";";
    url += h;
    url += ";1";
    clig();
    sendDomoticz(url);
  }
  allume();
  clig();
  eteint();
  clig();
  WiFi.disconnect();
  eteint();
}

void allume() {
  for (int m = 0; m <= 1023 ; m++) {
    analogWrite(pinGPIO2, m);
    delay(m / 10);
  }
}


void eteint() {
  for (int m = 1023; m > 0; m--) {
    analogWrite(pinGPIO2, m);
    delay(1);
  }
}
void clig() {
  analogWrite(pinGPIO2, 1023);
  delay(100);
  analogWrite(pinGPIO2, 0);
  delay(100);
}


void sendDomoticz(String url) {
  http.begin(host, port, url);
  int httpCode = http.GET();
  if (httpCode) {
    if (httpCode == 200) {
      String payload = http.getString();
      client.println(payload);
    }
  }
  http.end();
}

Bravo!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.