Bonjour,
C'est une ESPWROOM32 utilisé en WIFI.
dans mon projet actuel j'ai un automate de régulation génie climatique qui me sort du XML afin de récupérer touts les données.
j'arrive à connecter le wifi et à avoir ma tram d'infos avec un http.gtString() de httpclient que j'envois sur le port série.
Par contre je n'arrive pas à parse ce String afin d'y extraire les données voulu.
voilà le String que je reçois:
<!-- written by IQ4NC32 Iss3.51 Jun 29 2018 Saved 2023-5-21T18:41:24TZD -->
<TrendProject>
<Site CncAddress="101" TuaString="T/IQ3 - 00:10:70:XX:XX:XX/TCP,,,XXX.XXX.XXX.XXX,10101///9/80/">
<Lan IsLocal="True" LanNumber="9">
<Device DeviceNumber="80" VersionString="IQ4NC32 Iss3.51 Jun 29 2018">
<DeviceOverview DeviceType="q" MajorVersion="3" MinorVersion="5" HexEncoded="XXXXXXXXXXXXXXXX" Revision="1"/>
<Module Name="S1" SubTypeNumber="-1">
<Param Name="$" Type="2" Value="BASE_AI_T-EXTERIEUR"/>
<Param Name="V" Type="1" Value="151.217392"/>
</Module>
</Device>
</Lan>
</Site>
</TrendProject>
Les XX c'est pour cacher l'adresse ip et la mac adresse
J'ai tester tinyxml2 et d'autre j'y arrive pas.
Merci de votre aide.
Le MARSIEN
Salut,
C'est dans le ESP32, je récupère la tram via le wifi de l'esp32 (client) depuis l'automate (serveur).
Depuis l'eps32 j'envois un requête et l'automate me répond avec cette tram enfin c'est une partie de la tram, elle peux contenir beaucoup de données en fonction de ce que je paramètre dans la requête mais toujours sous le même format.
Ce que j'aimerais faire c'est de récupérer dans "Param Name="$" la "Value" et dans Param Name="V" la Value.
Après si pour y arrivé ça doit finir en tableau c'est pas un problème mais je ne sais pas comment me dépatouillé pour le transformer.
Bonsoir @le-marsien-voyageur
as-tu exploité ce tutoriel ?
https://techtutorialsx.com/2019/11/20/esp32-arduino-parsing-xml/
je n'ai pas encore eu a parser du XML, ayant eu le choix JSON ou XML jusqu'à présent
je mentionne ce lien car techtutorialsx m'a paru solide sur d'autres questions tournant autour des ESP32
C'est à dire, tu n'a pas de message d'erreur de la pars de la librairie ?
quel code utilise tu exactement et quel sont les erreurs que tu obtiens?
Sinon tu as essayer de simplement utiliser la fonction indexOf, sur la partie qui t'intéresse?
par exemple ret = chaine.indexOf("Param Name="$" Type="2" Value=");
si ton XML est toujours formater de la même façon ?
lesept
July 8, 2023, 11:00am
6
Il faudrait que tu en dises plus sur tes essais. Si tu traites les données ligne par ligne, dans des String ou des char* la manière de faire sera différente.
Mais le principe reste le même. D'abord obtenir les données ligne par ligne. Vérifier l'existence du tag recherché ($ ou V) puis chercher l'emplacement de 'Value' et extraire la valeur de la donnée.
Bonjour,
Voilà ce que j'ai déjà fais:
#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClient.h>
#include <tinyxml2.h>
const char* ssid = "MonSSID";
const char* password ="MonMDP";
String serverName0 = "http://XXX.XXX.XXX.XXX/ws/tsite.xml?Type=Read&Request=S1($,V)";
unsigned long lastTime = 0;
unsigned long timerDelay = 5000;
String serverPath0 = "";
String sensor;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connection en cours.");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connecté au WIFI avec l'adresse: ");
Serial.println(WiFi.localIP());
}
void loop() {
if ((millis() - lastTime) > timerDelay){
if (WiFi.status() == WL_CONNECTED){
WiFiClient client;
HTTPClient http;
serverPath0 = serverName0;
http.begin(client, serverPath0.c_str());
int httpResponseCode0 = http.GET();
if(httpResponseCode0>0){
Serial.print("HTTP code de réponse: ");
Serial.println(httpResponseCode0);
sensor = http.getString();
Serial.println(sensor);
}else{
Serial.print("Code erreure: ");
Serial.println(httpResponseCode0);
}
http.end();
}
lastTime = millis();
}
}
J'ai en retour dans une Sting :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!-- written by IQ4NC32 Iss3.51 Jun 29 2018 Saved 2023-5-25T10:36:5TZD --><TrendProject><Site CncAddress="101" TuaString="T/IQ3 - 00:10:70:XX:XX:XX/TCP,,,XXX.XXX.XXX.XXX,10101///9/80/"><Lan IsLocal="True" LanNumber="9"><Device DeviceNumber="80" VersionString="IQ4NC32 Iss3.51 Jun 29 2018"><DeviceOverview DeviceType="q" MajorVersion="3" MinorVersion="5" HexEncoded="711B1B1B41333531" Revision="1"></DeviceOverview><Module Name="S1" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_AI_T-EXTERIEUR" /><Param Name="V" Type="1" Value="19.277512" /></Module><Module Name="S2" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S3" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S4" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S5" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S6" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S7" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_AI_T-DEPART-BC" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S8" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_AI_T-RETOUR-BC" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S9" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_T-EXTERIEUR" /><Param Name="V" Type="5" Value="19.28" /></Module><Module Name="S10" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_AUTOMATE_JJ_MM" /><Param Name="V" Type="5" Value="25.05" /></Module><Module Name="S11" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_AUTOMATE_HH_MM" /><Param Name="V" Type="5" Value="10.36" /></Module><Module Name="S12" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 1 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S13" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S14" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR2_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S15" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR2_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S16" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 2 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S17" SubTypeNumber="-1"><Param Name="$" Type="2" Value="DEBIT HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S18" SubTypeNumber="-1"><Param Name="$" Type="2" Value="T FLUIDE HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S19" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="10.00" /></Module><Module Name="S20" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_LOI-EAU_COR-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S21" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_VANNE_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S22" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_STC_VERSION" /><Param Name="V" Type="5" Value="2.10" /></Module><Module Name="S23" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="1.00" /></Module><Module Name="S24" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_VN_DEP_CONSI_CALCULEE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S25" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S26" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S27" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_TEMP-RECEP" /><Param Name="V" Type="5" Value="7440128.50" /></Module><Module Name="S28" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S29" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S30" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_TEMP-RECEP" /><Param Name="V" Type="5" Value="7440128.50" /></Module><Module Name="S31" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S32" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S33" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_TEMP-RECEP" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S34" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-AMB_REF" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S35" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-AMB_CONSI" /><Param Name="V" Type="5" Value="19.00" /></Module><Module Name="S36" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S37" SubTypeNumber="-1"><Param Name="$" Type="2" Value="T AMB HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S38" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 0 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S39" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S70" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_T-BC_CONSI" /><Param Name="V" Type="5" Value="55.00" /></Module><Module Name="S71" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_VANNE-BC_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S72" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="3.00" /></Module><Module Name="S73" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_ETAT-TYPE-PROD" /><Param Name="V" Type="5" Value="3.00" /></Module><Module Name="S74" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_T-CH_CONSI" /><Param Name="V" Type="5" Value="55.00" /></Module><Module Name="S75" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="60.00" /></Module><Module Name="S76" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CASC_CALC_PROFIL-ETG" /><Param Name="V" Type="5" Value="2.00" /></Module><Module Name="S77" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S78" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="65.00" /></Module><Module Name="S81" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="2.00" /></Module><Module Name="S82" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="7.00" /></Module><Module Name="S85" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_BRUL_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S86" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_BRUL_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module></Device></Lan></Site></TrendProject>
Pour le moment tous ce que j'ai testé c'est soldé par la non compilation du projet.
Ce que je souhaiterais faire c'est contrôler la présence de, par exemple, "BASE_AI_T-EXTERIEUR" et d'inscrire la value de prame Name V dans une variable afin de l'utiliser.
Je ne peux pas me baser sur l'endroit où se trouve la variable dans la trame par ce que si demain je refait le programme de l'automate elle peux se retrouver n'importe où dans la trame (le Module Name="S1" peux changer en "S98" ou "S5" ou resté le même).
Une choe est sur c'est que le libellé ParameName="$"..Value= lui restera inchangé.
terwal
July 10, 2023, 8:19am
8
Ce n'est pas ce qui t'a était indiqué.
puisque ParameName="$" reste inchangé, c'est cette séquence de caractères qu'il faut chercher.
Une fois que tu as la position tu peux chercher ce qui t'intéresse vraiment à partir de cette position(Value=), pour pouvoir utiliser cette deuxième position alors pour extraire ta valeur.
C'est un peu plus laborieux au niveau du code, à faire, mais évite de perdre du temps et de la mémoire pour "parser" ton XML en entier.
Comme tu as une variable de type String, tu peux utiliser la fonction indexOf pour ça.
Essaye de coder ça et donne nous ton code et les erreurs éventuels pour que l'on puisse de guider si nécessaire.
Salut.
As-tu au moins essayé le tuto suggéré par al1fch ?
Merci à tous !
J'ai utiliser indexOf() pour trouver mon pointeur
j'ai ajouter ceci
int test = sensor.indexOf("BASE_AI_T-EXTERIEUR");
Serial.println(sensor);
Serial.print("Valeur= ");
Serial.println(test);
Serial.print(sensor[test + 55]);Serial.print(sensor[test + 56]);Serial.print(sensor[test + 57]);Serial.print(sensor[test + 58]);Serial.println(sensor[test + 59]);
et du coup ça me sort:
HTTP code de réponse: 200
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!-- written by IQ4NC32 Iss3.51 Jun 29 2018 Saved 2023-7-10T11:28:2TZD --><TrendProject><Site CncAddress="101" TuaString="T/IQ3 - 00:10:70:15:6E:69/TCP,,,192.168.1.100,10101///9/80/"><Lan IsLocal="True" LanNumber="9"><Device DeviceNumber="80" VersionString="IQ4NC32 Iss3.51 Jun 29 2018"><DeviceOverview DeviceType="q" MajorVersion="3" MinorVersion="5" HexEncoded="711B1B1B41333531" Revision="1"></DeviceOverview><Module Name="S1" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_AI_T-EXTERIEUR" /><Param Name="V" Type="1" Value="23.836708" /></Module></Device></Lan></Site></TrendProject>
Valeur= 536
23.83
j'ai trouvé ma valeur.
Testé avec une autre donnée et ça fonctionne. J'ai enfin compris comment utiliser indexOf()!
Encore merci à tous
terwal
July 10, 2023, 9:50am
11
Idéalement le décalage de 55, 56 devrait être plutot fait par un autre indexOF, mais cette fois si à partir de test test2 = sensor.indexof("Value="", test)
et un troisième indexOf pour te donner le caractère de fin de chaine "
avec un test3 = sensor.indexOf("", test2+"Value="".length())
ainsi tu aura la position du premier caractère de ton nombre et le dernier, donc quelque soit le nombre de chiffre dans ton nombre, tu va le récupérer entièrement dans une variable avec un substring je crois .
Par sûre d'être très claire
Je voudrais remercier al1fch et hbrachetti pour rappeler un tutorial très bien fait sur tinyxml2 pour Esp (je pensais que c'était "seulement" pour PC et RPi; les ESP ont manifestement assez de mémoire )
L'avantage d'un analyseur complet est double:
il peut sortir des messages d'erreur; si vous êtes sûr que jamais, au Grand Jamais, le programme ne recevra pas de données erronées (ça peut se produire du côté de Lourdes), cet avantage est superflu. Sinon, c'est rassurant de pouvoir détecter des messages mal formés.
la navigation est plus simple si vous rajoutez des grandeurs à transmettre que de bricoler avec indexOF (qui garderait tout son sens pour un UNO: comme les ESPxx sont moins souvent chers que les UNO, autant profiter de leur vitesse et de leur RAM)
Salut oui j'ai testé mais pas réussie à en sortir quoi que ce soit.
Je récupère une String et il me parle de char j'ai pas sue convertir ma String en char.
terwal:
Idéalement le décalage de 55, 56 devrait être plutot fait par un autre indexOF, mais cette fois si à partir de test test2 = sensor.indexof("Value="", test)
et un troisième indexOf pour te donner le caractère de fin de chaine "
avec un test3 = sensor.indexOf("", test2+"Value="".length())
ainsi tu aura la position du premier caractère de ton nombre et le dernier, donc quelque soit le nombre de chiffre dans ton nombre, tu va le récupérer entièrement dans une variable avec un substring je crois .
Par sûre d'être très claire
Si si bien clair, j'ai compris du premier coup
Je comprend vite mais faut m'expliqué longtemps
j'y ai fait:
int test = sensor.indexOf("BASE_AI_T-EXTERIEUR");
int test1 = sensor.indexOf("Value=", test) + 7;
int test2 = sensor.indexOf("/>",test1)-2;
// 2eme valeur
int test3 = sensor.indexOf("CH2_AI_T-DEPART_EAU");
int test4 = sensor.indexOf("Value=", test3) + 7;
int test5 = sensor.indexOf("/>", test4) - 2;
String valeur0 = sensor.substring(test1,test2);
String valeur1 = sensor.substring(test4,test5);
Serial.println(sensor);
//Serial.print("T°EXT: ");Serial.print(sensor[test + 55]);Serial.print(sensor[test + 56]);Serial.print(sensor[test + 57]);Serial.print(sensor[test + 58]);Serial.print(sensor[test + 59]);Serial.println(sensor[test + 60]);
Serial.print("T°EXT: ");Serial.println(valeur0);
Serial.print("T°CH2: ");Serial.println(valeur1);
et ça me sort:
HTTP code de réponse: 200
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!-- written by IQ4NC32 Iss3.51 Jun 29 2018 Saved 2023-7-10T14:43:7TZD --><TrendProject><Site CncAddress="101" TuaString="T/IQ3 - 00:10:70:15:6E:69/TCP,,,192.168.1.100,10101///9/80/"><Lan IsLocal="True" LanNumber="9"><Device DeviceNumber="80" VersionString="IQ4NC32 Iss3.51 Jun 29 2018"><DeviceOverview DeviceType="q" MajorVersion="3" MinorVersion="5" HexEncoded="711B1B1B41333531" Revision="1"></DeviceOverview><Module Name="S1" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_AI_T-EXTERIEUR" /><Param Name="V" Type="1" Value="19.688799" /></Module><Module Name="S2" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S3" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S4" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S5" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S6" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S7" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_AI_T-DEPART-BC" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S8" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_AI_T-RETOUR-BC" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S9" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_T-EXTERIEUR" /><Param Name="V" Type="5" Value="19.69" /></Module><Module Name="S10" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_AUTOMATE_JJ_MM" /><Param Name="V" Type="5" Value="10.07" /></Module><Module Name="S11" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_AUTOMATE_HH_MM" /><Param Name="V" Type="5" Value="14.43" /></Module><Module Name="S12" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 1 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S13" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S14" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR2_AI_T-DEPART_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S15" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR2_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S16" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 2 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S17" SubTypeNumber="-1"><Param Name="$" Type="2" Value="DEBIT HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S18" SubTypeNumber="-1"><Param Name="$" Type="2" Value="T FLUIDE HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S19" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="10.00" /></Module><Module Name="S20" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_LOI-EAU_COR-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S21" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_VANNE_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S22" SubTypeNumber="-1"><Param Name="$" Type="2" Value="BASE_CALC_STC_VERSION" /><Param Name="V" Type="5" Value="2.10" /></Module><Module Name="S23" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="1.00" /></Module><Module Name="S24" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_VN_DEP_CONSI_CALCULEE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S25" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S26" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S27" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-A_TEMP-RECEP" /><Param Name="V" Type="5" Value="7462093.00" /></Module><Module Name="S28" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S29" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S30" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-B_TEMP-RECEP" /><Param Name="V" Type="5" Value="7462093.00" /></Module><Module Name="S31" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_T-AMB" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S32" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_RSSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S33" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_MES_WIRL-AMB-C_TEMP-RECEP" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S34" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-AMB_REF" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S35" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CIR1_CALC_T-AMB_CONSI" /><Param Name="V" Type="5" Value="19.00" /></Module><Module Name="S36" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S37" SubTypeNumber="-1"><Param Name="$" Type="2" Value="T AMB HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S38" SubTypeNumber="-1"><Param Name="$" Type="2" Value="VOLUME 0 HYDRUS T171B" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S39" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_AI_T-RETOUR_EAU" /><Param Name="V" Type="1" Value="145.217392" /></Module><Module Name="S70" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_T-BC_CONSI" /><Param Name="V" Type="5" Value="55.00" /></Module><Module Name="S71" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_VANNE-BC_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S72" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="3.00" /></Module><Module Name="S73" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_ETAT-TYPE-PROD" /><Param Name="V" Type="5" Value="3.00" /></Module><Module Name="S74" SubTypeNumber="-1"><Param Name="$" Type="2" Value="ECS1_CALC_T-CH_CONSI" /><Param Name="V" Type="5" Value="55.00" /></Module><Module Name="S75" SubTypeNumber="-1"><Param Name="$" Type="2" Value="PRIM_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="60.00" /></Module><Module Name="S76" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CASC_CALC_PROFIL-ETG" /><Param Name="V" Type="5" Value="2.00" /></Module><Module Name="S77" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S78" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_T-DEPART_CONSI" /><Param Name="V" Type="5" Value="65.00" /></Module><Module Name="S81" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="2.00" /></Module><Module Name="S82" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_ETAT-FONCT" /><Param Name="V" Type="5" Value="7.00" /></Module><Module Name="S85" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH1_CALC_BRUL_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module><Module Name="S86" SubTypeNumber="-1"><Param Name="$" Type="2" Value="CH2_CALC_BRUL_CDE" /><Param Name="V" Type="5" Value="0.00" /></Module></Device></Lan></Site></TrendProject>
T°EXT: 19.688799
T°CH2: 145.217392
Plus qu'à travailler sur le nombre d'infos et affiché sur l'écran.
Merci à tous ça m'a fait avancé d'un grand pas sur mon projet
toCharArray() - Arduino Reference a l'air de savoir convertir des strings en tableaux de charactères.
Nota:
si vous montriez vos essais, vous pourriez avoir de l'aide un peu substantielle.
En regardant votre code avec indexOf, je me suis demandé ce qui se passerait si (liste non exhaustive) :
aucun champ "Value" n'était détecté.
aucun champ "/>" n'était détecté.
Vous avez un tas de petites horreurs qui ne demandent qu'à être déclenchées si vous fournissez une trame XML très déchirée...
Autant tenter de faire les choses un peu plus "proprement", si vous avez assez de RAM, de puissance de calcul et de tutoriaux...
terwal
July 10, 2023, 9:47pm
16
C'est un bon début.
En général on test le retour de indexOf, qui renvoit -1, si il n'a pas trouvé ce que tu demande.
cela évite de faire des substrings avec la valeur -1, même si je crois que substring sait gérer ce genre de cas.
De façon générale, je préconise mais ca n'engage que moi de toujours tester les codes retours des fonctions qui le propose.
pourquoi rechercher />, puisque visiblement c'est plutôt les guillemets que tu veux ?
plutôt que de mettre des décalages en dure, tu peux utiliser des constantes ou macros contenant les chaines que tu recherche et ainsi faire
#define BASE_TEMPS "BASE_AI_T-EXTERIEUR"
Salut,
J'ai bien testé tinyxml2 avec le tuto ainsi que toCharArray().
avec une trame XML complète qui contient 22807 caractères ça déborde.
C'est ce que j'ai fait hier afin de vérifier la présence ou non.
test = sensor.indexOf("BASE_AI_T-EXTERIEUR");
if(test> 0){
test1 = sensor.indexOf("Value=", test) + 8;
if(test1>0){
test2 = sensor.indexOf("/>",test1) - 2;
valeur0 = "T°EXT: " + sensor.substring(test1,test2);
Serial.println(valeur0);
}
}else{
Serial.println("Pas de valeur trouvée");
valeur0 = "NUL";
Serial.println(valeur0);
}
pour ce qui est des décalage en dur quand il y a plusieurs guillemets dans le champs le compilateur interprète des morceaux comme des déclarations.
par exemple:
test = sensor.indexOf("Param Name="$"");
J'ai bien testé avec des ' et non des ":
test = sensor.indexOf('BASE_AI_T-EXTERIEUR');
if(test> 0){
test1 = sensor.indexOf('Value="', test) + 8;
if(test1>0){
test2 = sensor.indexOf('"/>',test1);
valeur0 = "T°EXT: " + sensor.substring(test1,test2);
Serial.println(valeur0);
}
}else{
Serial.println("Pas de valeur trouvée");
valeur0 = "NUL";
Serial.println(valeur0);
}
du coup ça sort tout sauf ce que je cherche.
terwal
July 11, 2023, 7:36am
19
le-marsien-voyageur:
pour ce qui est des décalage en dur quand il y a plusieurs guillemets dans le champs le compilateur interprète des morceaux comme des déclarations.
par exemple:
test = sensor.indexOf("Param Name="$"");
Oui, mais non
Si je ne me trompe pas sur la partie que je t'ai indiqué qui lit la valeur numérique, il y a peu de chance que la valeur contienne des guillemets ?
je pensais à un truc comme ça
C'est cool ça marche
Merci beaucoup pour le coup de main
Là de suite c'est un bordelle sans nom dans mon prog j'ai plein de // ou de /* */ partout lol
un gros nettoyage s'impose.