[résolut]PB page web chargé mais imcompléte.

Salut , j'ai besoin d'aide pour comprendre ce qui ce passe dans le chargement de mes page web.

etat des lieux:
mon systeme , l'orsqu'il est appeler en local(LAN) ou en distant(WAN) va en fonction de sont etat généré du code html pour cree un affichage sur une page web.

exemple de generateur de partie de code :

void ReptilduinoClient::WebForm(const __FlashStringHelper *ptr_name,char *ptr_placeholder,const __FlashStringHelper *ptr_label)
{

    m_client.print(F("<div id= 'SCadre'>"
                     "<form method='POST' action=' http://"));
    if (m_etatIP==0)
    {
        m_client.print(Ethernet.localIP());
       /* m_client.print(F(":"));
        m_client.print(PORT);*/
    }
    else
    {
        m_client.print(ipWan);
        m_client.print(F(":"));
        m_client.print(PORT);
    };
    m_client.print(F("'>"));
    m_client.print(F("<label for='"));
    m_client.print(ptr_name);
    m_client.print("'>");
    m_client.print(ptr_label);
    m_client.print(F("</label>"));
    m_client.print(F("
<input type='text' name='"));
    m_client.print(ptr_name);
    m_client.print("' id='");
    m_client.print(ptr_name);
    m_client.print(F("' placeholder='"));
    m_client.print(ptr_placeholder);
    m_client.print(F("' size='20' maxlength='20' /><input type='submit' value='Envoyer' /></form></div>"));

    return;
}

mon probleme :

en local , pas de souci il ne maque rien tout est bien affiché.
en distant : tout ne s'affiche pas en général dans les derniere partie de la page .

pour verifier j'essayer de voir le code source de la page et apparament toute les balise sont bien fermé , mais parfoit il manque une ligne compléte.

est il possible que des informations soit perdu en chemin ? ou que l'arduino debite les infos mais que vue le debit de la connection tout ne soit pas reçu dans les temps et ecrassé?
bref cela me ferai pensé a un probléme de vitesse et/ou buffer

j'atind mes limite dans ce qui est transfert de donnée sur le resau, et encor une foi en local tout s'affiche quasiment instantanément est sans manque .

voici un exemple de page html ou il manque une ligne

<html>
<head>
<title>Reptilduino V1.2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" media="screen" type="text/css" title="menu" href="http://christophe.boulic.free.fr/arduino/cssReptilduino.css">
</head>
<body>
<div id="Cadre">
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="deconection" value="ok">deconection</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="CONFRTC" value="ok">config RTC</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="OPTSERVER" value="ok">config server</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="OPTNOTIF" value="ok">config notification</button>
    </form>
  </div>
</div>
<div id="Cadre">
  <h1>selecteur terrarium</h1>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="terra0" value="ok">terra0</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="terra1" value="ok">terra1</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="terra2" value="ok">terra2</button>
    </form>
  </div>
  <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="terra3" value="ok">terra3</button>
    </form>
  </div>
</div>
</body>
</html>

la il manque par exemple apres la dernier partie :

 <div id="SCadre">
    <form method="POST" action=" http://xx.xx.xx.xx:x">
      <button class="Null" name="Piece" value="ok">Piece</button>
    </form>
  </div>

edit: en 4G parfois j'ai tout et l'instant d'apres avec un rafraichisement il m'en manque vers la fin !

Salut,

Ton instance m_client correspond à quoi ?

À ta place (et je pense que ton soucis vient de là), je constituerais ma page entière dans une string et je la donnerais une fois complète à mon m_client.

À plus,

--
N.

le m_client et une instance de la classe ethernetclient dans ma class reptilduino_server
pour le string je pense pas que ça puisse étre possible car la mémoire de l'arduino serai saturé !

Heloderma-kris:
le m_client et une instance de la classe ethernetclient dans ma class reptilduino_server
pour le string je pense pas que ça puisse étre possible car la mémoire de l'arduino serai saturé !

J'ai joué recemment avec un shield ethernet (Wiznet) et sur un test simple =lire les valeurs ana des canaux (avec reactualisation de page periodique automatique ) ça partait "dans les choux" assez rapidement = au lieu d'avoir une page basique HTML , je recuperais de la bouillie de flux HTML.

Salut

Perso je ne serais pas surpris que ce soit lié à ton instruction client.print

Je ne sais pas quelle librairie ethernet tu as derrière, mais en principe cette instruction va te faire un write de chaque caractère.
C'est-à-dire que chaque caractère est transmis tout seul dans un paquet.
Cela fait une grosse quantité de trames protocolées pour transmettre une simple page html.
Une véritable usine à gaz en terme de transmission.
Pas impossible que cela soit la cause de ton problème.

Dans mon cas j'ai obtenu de bien meilleurs résultats (surtout en terme de perf & temps de réponse) en bannissant cette instruction.

J'utilise un buffer en mémoire, que je remplis par une fonction printbuf(char *message) au lieu du client.print.
Et quand il est plein, ou que ma page est terminée, je l'envoie au client par un write(buffer, len).

Merci a vous ça me donne des piste pour chercher :
en y regardant de plus prés je trouve dans la class EthernetClient.h

 using Print::write;

dans le .cpp on trouve

size_t EthernetClient::write(uint8_t b) {
  return write(&b, 1);
}

size_t EthernetClient::write(const uint8_t *buf, size_t size) {
  if (_sock == MAX_SOCK_NUM) {
    setWriteError();
    return 0;
  }
  if (!send(_sock, buf, size)) {
    setWriteError();
    return 0;
  }
  return size;
}

donc comme je le comprent la fonction la methode print appelle la methode Write (1) puis celle ci boucle sur sa soeur en lui envoyant un buffer et ça taille , ça corespont bien a l'envoi d'un buffer mais de 1 caractere

donc a la limite j'ai cas cree une methode qui va servire de tampon et directement utilisé la 2eme methode write.

bon je vai bien voir ce que ça peut donné, je vous tien au jus! :grin:

PS au passage dans la lib ethernet.h on trouve

#define MAX_SOCK_NUM 4

c'est bien ce que je pense si je modifi a 1 une seul conection sur le server serra possible a la foi?
merci
kris

au passage quelqu'un conait il une solution pour remplacer dans mon code grace au preprossesseur une partie du code , j'ai essayer ça
#define m_client.print(x) print(x)mais visiblement le "." pose probleme, et je vous avous que pour testes si ça marche mes modification je voudrai essayer de ne pas exploser tou mon code.

voila ce que je veux faire comme modification( histoire de tester si ça me charge bien tout):

void reptilduinoClient::print(const __FlashStringHelper *ptr_)
{   int i=0;
    int j=0;
    int taille =sizeof(*ptr_);
    for ( i=0 ; i<taille; i++){
        Buff_Envoi[j]=*ptr_;
        if(j>=254){m_client.write(Buff_Envoi, 256);
        j=0;}
    }

}

donc voila j'ai ma fonction qui est operationel et qui permet d'envoyer par groupe de 256 caracter, mes teste montre que ça marche en local apparament mais voila que c'est encor plus long en chargement que avant .

j'ai donc remi mon code comme avant la modif et la toujours aussi lent , alors j'ai peut'etre un probleme de vitesse de transfer bref je sait plus trop bien maintenant. :roll_eyes:

je vous met la fonction au cas ou ça vous intérése: :wink:

void ReptilduinoClient::print(prog_uchar *ptr_)
{
    int i=0;
    char c=0;
    int taille=0;


     c =(char)pgm_read_byte(ptr_);

    while( c!=0)
    {   //Serial.print(c);
        Buff_Envoi[i]=uint8_t(c);// onrecupere les donne depuis la flash et on les stock dans le bufer
        c =(char)pgm_read_byte(++ptr_);
        taille++;// on increment la taille pour savoir combien on envoi de caracter
        if(i>=254 || c==0) // si on atein les 255 caracter ou que le caracter corepon a une fin de chaine 
        {
        //Serial.println("envoi donnes");
        //Serial.print("taille:");Serial.println(taille);
            m_client.write(Buff_Envoi, taille);// on demande l'envoi des donne
            i=0;
        }
        i++;
    }

salut je revien a la chage car vraisemblablement ça fonction beaucoup mieux maintenant , j'ai bien galéré a ecrire dans mon fichu buffer et automatiser tout l'envoi donc voici ce que j'ai fini par ecrire comme fonctions permetant decrire dans le buffer mais aussi d'utiliser le meme langage "print" , a vous de voir si ça peut vous etre utile :

Ps: c'est probablement incomplé pour tout passer dans le buffer mais dans mon cas ça me suffi donc a vous de complété le cas echeant :grin:

// declaration d'un bufer global et de sont curseur:
#define tBufferEnvoi 32
uint8_t Buff_Envoi[tBufferEnvoi];
int cursBuffer=1;/// curseur de buffer


///*************************************************************///
void print/*(prog_uchar *ptr_)*/(const __FlashStringHelper*pData)
{
    char c=0;
    prog_char *ptr_ = ( prog_char * ) pData;
    c =(char)pgm_read_byte(ptr_);/// lit  le 1er caractere de chaine

    while( c!=0)/// tant que le carractere de chaine et different du caractere de fin de chaine
    {
        writeInBuff(c);
        //Serial.print(c);
        c =(char)pgm_read_byte(++ptr_);///lire le caractere suivant
    }
    return;

}
///*************************************************************///

void print(char*tabChar)
{
    char c=0;
    byte i=0;
    c =tabChar[i];/// lit  le 1er caractere de chaine
    i++;
    while( c!=0)/// tan que le carra tere de chaine et different du caractere de fin de chaine
    {
        writeInBuff(c);
        //Serial.print(c);
        c =tabChar[i];///lire le caractere suivant
        i++;
    }
    return;

}
///*************************************************************///
void println(char*tabChar)
{
    char c=0;
    byte i=0;
    c =tabChar[i];/// lit  le 1er caractere de chaine
    i++;
    while( c!=0)/// tan que le carra tere de chaine et different du caractere de fin de chaine
    {
        writeInBuff(c);
        //Serial.print(c);
        c =tabChar[i];///lire le caractere suivant
        i++;
    }
    if ( c==0)
    {
        print(F("\r\n"));
    }
    return;

}
///*************************************************************///
void println(const __FlashStringHelper*pData)
{
    char c=0;
    prog_char *ptr_ = ( prog_char * ) pData;
    c =(char)pgm_read_byte(ptr_);/// lit  le 1er caractere de chaine

    while( c!=0)/// tant que le carractere de chaine et different du caractere de fin de chaine
    {
        writeInBuff(c);
        //Serial.print(c);
        c =(char)pgm_read_byte(++ptr_);///lire le caractere suivant
    }

    if ( c==0)
    {
        print(F("\r\n"));
    }
    return;

}
///*************************************************************///
void writeInBuff(char c)
{
    Buff_Envoi[cursBuffer-1]=uint8_t(c);/// ecrire dans le buffer le caractere reçu

    if(cursBuffer==tBufferEnvoi)/// on verifi que l'on ne depasse pas la taille du buffer
    {
        sendBuff();
    }
    else
    {
        cursBuffer++;   ///sinon on incremente notre curseur
    }
    return;
}
///*************************************************************///
void sendBuff()
{
    /* Serial.println("envoi donnes :");
     Serial.print("taille: ");
     Serial.println(cursBuffer);*/

    client.write(Buff_Envoi, (cursBuffer));/// on envoi le buffer
    delay(1);
    for (int i=0; i<tBufferEnvoi; i++) /// on efface les donné du buffer
    {
        Buff_Envoi[i]=uint8_t(0);
    }
    cursBuffer=1;/// on reposition notre curseur en debut de buffer
    //Serial.println("fin envoi donnes :");
    return;
}

ne pas oublier de convertire les float les int en chaine de caractere et de faire un sendBuff(); a la fin d'envoi d'une page pour etre sur d'avoir tout envoyer.
voila bon peut'etre qu'il y avait plus simple mais bon j'ai pas trouvé !
a+