Bonjour,
Voici quatre autres remarques :
1) Ce petit morceau de HTML dans le HEADER est important, car sinon le navigateur fait toujours une deuxième requête au serveur pour obtenir une icône
(la aussi, bug très chiant qu'on comprend uniquement en épluchant les échanges avec Wireshark)
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
2) Il n'y a pas UNE mais DEUX fonctions EthernetClient::connect() à modifier en remplaçant :
Ethernet.socketDisconnect(sockindex);
par
Celle que j'ai montrée est la fonction connect() qui utilise une URL (l'adresse IP du serveur est obtenue avec DNS)
Mais il y a une autre fonction connect() qui utilise directement une adresse IP ; c'est cette fonction là qu'on utilise quand le serveur est un object connecté sur le réseau local (un autre Arduino ou un Raspberry Pi)
3) Wireshark peut montrer un packet unique alors qu'il est fragmenté
Ou alors, quand j'utilise Telnet avec mon PC, le Raspberry Pi envoi des paquets plus gros que quand j'utilise Telnet avec mon Arduino 
Là aussi, c'est extrêmement difficile à comprendre...
La solution, c'est de prévoir dans le code Arduino des fonctions de débogage, typiquement afficher dans les résultats la valeur retournée par
4) Pour recevoir plusieurs fragments, il faut s'y prendre de la façon suivante :
- "vider" le fragment reçu en lisant tous les caractères
- ensuite, attendre de nouveau que des caractères soient disponibles, avec un timeout
Il semblerait que le W5500 envoi une commande au serveur lorsque tous les caractères sont lus, ce qui permet au serveur d'envoyer le fragment éventuel suivant.
Cela est très surprenant, car à priori le W5500 ne gère pas la fragmentation de packets
C'est peut être lié au fonctionnement du Raspberry Pi, qui envoi sagement les fragments dans l'ordre, en attendant que le fragment envoyé soit lu avant d'envoyer le suivant.
Voyez le code de la fonction Example_Application_MoodeAudio_ExtractData_Close() ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| byte Example_Application_MoodeAudio_OpenAndSendCmd(int len) {
byte website_ip[] = {192,168,123,28}; // Moode Audio IP
byte err = client2.connect(website_ip, 6600);
if (err==CLIENT_CONNECT_OK) client2.write(Buffer_HTTP, len); // WARNING - connect() FUNCTION IS CHANGED TO RETURN CUSTOM ERROR CODES
return err;
}
void Example_Application_MoodeAudio_Close() {
client2.stop();
}
#define MOODE_TIMEOUT 1000
int Example_Application_MoodeAudio_GetDataLen() {
int len=0;
unsigned long t = millis();
while(len==0){
len = client2.available();
if (millis() -t > MOODE_TIMEOUT) break;
}
return len;
}
int Example_Application_MoodeAudio_PrepareToRead() {
int len;
int i;
byte k;
for (k=0;k<2;k++) {
len = Example_Application_MoodeAudio_GetDataLen();
if ((len>0)&&(k==0)) {
for (i=0;i<len;i++) {
client2.read(); // We don't need the first fragment data, it just contains "OK MPD 0.22.0"
}
} else {
return len;
}
}
}
void Example_Application_MoodeAudio_ExtractStatus_Close() {
// Moode audio return several text lines :
int len;
char c;
byte k = 0;
byte j = 0;
int SongID = 0;
int PlaylistLen = 0;
len = Example_Application_MoodeAudio_PrepareToRead();
#define Max_Char_For_Int 5
while (len>0) {
c = client2.read();
len--;
if (c==10) {
k=0;
j++;
} else {
if (j==7) { // Line 7 is "playlistlength: 1044"
if ((k>15)&&(k<15+Max_Char_For_Int)) {
PlaylistLen = PlaylistLen * 10 + c-48;
}
k++;
}
if (j==11) { // Line 3 is "songid: 513"
if ((k>7)&&(k<7+Max_Char_For_Int)) {
SongID = SongID * 10 + c-48;
}
k++;
}
}
}
Example_Application_MoodeAudio_Close();
MoodeSongID = SongID;
MoodePlaylistLen = PlaylistLen;
}
void Example_Application_MoodeAudio_ExtractData_Close() {
char c;
byte k;
byte t = 0;
byte j = 0;
byte s = 0;
int len = Example_Application_MoodeAudio_PrepareToRead();
bool other_fragment = len == 1024; // ONLY OK FOR MOODE AUDIO
while (len>0) {
c = client2.read();
len--;
if (c==10) { // Line feed
k=0;
if (j<11) {
j++;
} else { // Song data takes 11 lines - We reached the next song:
j = 0;
t = 0;
s ++;
}
} else {
if (j==3) { // Line 3 is "title: Like my fire"
if (k>6) {
if ((s < MOODE_LIST_SONG_NB)&&(t < MOODE_SONG_TITLE_LEN)) {
Buffer_HTTP[Buffer_HTTP_Len - (MOODE_LIST_SONG_NB - s)*MOODE_SONG_TITLE_LEN + t] = c;
}
t++;
}
k++;
}
}
// Moode Audio Telnet MPD cuts data into 1024 bytes fragments
// W5500 has 2048 bytes buffer
// But we ask MOODE_LIST_SONG_NB songs data it's about 4ko
// that is to say, 3 or 4 1024 bytes fragments
if ((len==0)&&(other_fragment)) {
len = Example_Application_MoodeAudio_GetDataLen();
other_fragment = len == 1024; // ONLY OK FOR MOODE AUDIO
}
}
Example_Application_MoodeAudio_Close();
} |
Partager