Pages: 1 2 3 [4]   Go Down
Author Topic: Composants pour interface web  (Read 6130 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 217
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Globalement, comment se positionne cette manière de faire par rapport au simple fait d'envoyer un message UDP?
Je comprends bien que ça fonctionne, néanmoins, cela m'apparait un peu comme babare  smiley-eek

Par contre de charger ce que l'ont reçois entièrement dans la chaineTotale ralentie pas mal l'exécution de la suite smiley-sad
Pourrais-tu préciser ?
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 177
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vais peut-être dire des âneries mais que ce soit UDP ou par le GET tu reçois une chaine de caractère dans arduino qui faut de toute manière retraiter pour récupérer les différentes info envoyées.
le GET envoi un peu plus d'information que l'UDP.

Là ou il y a peut-être un avantage en passant par l'UDP c'est que la requête n'est pas directement visible ou imitable par l'url, contrairement au GET.

Entre les deux méthode je préfère l'UDP mais je n'ai malheureusement pas réussi à la faire marché depuis mon site web.

Quote
Pourrais-tu préciser ?

Voici ce que tu reçois quand tu envois coté arduino quand tu lui transmet des informations en GET

Code:
GET /?led1=255z HTTP/1.1
Host: XX.XX.XX.XX
Origin: http://sous_domaine.site_internet.net
User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; fr-fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
Accept: */*
Referer: http://sous_domaine.site_internet.net/client_switch_light.php
Accept-Language: fr-fr
Accept-Encoding: gzip, deflate
Connection: keep-alive

C'est à partir de tout ceci que tu récupère les valeurs qui t'intéresse. et pour faire la vérification qui permet de savoir d'où proviens la requete GET je charge dans le String chaineTotale plus de caractère donc ça ralentie l’exécution de la suite du code... je sais pas si je suis plus claire :s

et il est vrai que coté UDP tu reçois juste :

Code:
Received packet of size 32
Contents:
12345678abcdefghijklmnop¾Û

smiley
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 177
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yeah ! Bonne nouvelle ! j'ai pris contact avec la compagnie qui héberge mon site internet et j'ai eu comme information que tout les ports n'était pas ouvert. Donc il m'a fourni la liste et j'ai pus créer un échange via UDP avec le port DNS ! Je vais pouvoir tester la version UDP maintenant pour voir la différence et je vous reviens la dessus smiley

Par contre le petit inconvéniant si on souhaite garder le tout dynamqiue, c'est que l'envoi par get ce fait plutôt facilement avec jquery pour la requête UDP il va falloir passer par une méthode POST envoyé sur une page contenant la requête UDP...
« Last Edit: June 07, 2011, 05:09:36 pm by chesnel » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 177
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon j'ai testé avec le transfert par UDP. Comme je l'ai mentionné juste avant j'appelle une page contenant la requête UDP via Jquery donc l'envoi ce fait comment en deux temps... c'est lent et vraiment moins réactif qu'en utilisant un GET directement vers l'arduino. Dommage car coté code arduino les informations sont plus facile à récupérer.

Je vous mets en pièces jointes les deux fichiers pour tester le code si vous le voulez.

Coté arduino j'ai utilisé l'exemple Ethernet > UDPSendReceiveString et j'ai juste ajouté dans le loop  
Code:
analogWrite(9, atoi(packetBuffer));
Le atoi(); permet de transformer le char en int.

* php_udp_control_led.php (0.36 KB - downloaded 8 times.)
* udp_control_led.php (1.99 KB - downloaded 9 times.)
« Last Edit: June 07, 2011, 11:21:17 pm by chesnel » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 177
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis désolé de ce monologue... je suis vraiment captivé par tout ceci et je le partage peut-être un peu trop  smiley-red

Bon il y à une erreur présente ou quelque chose de mal programmé dans le code de base  du UDPSendReceiveString. Lors de l'envoi de l'UDP le char packetBuffer ne ce vide pas à chaque nouvelle réception de donnée. Un exemple : Si la première valeur transmise est 244 et ensuite 0 nous allons parfaitement recevoir 244 mais nous allons recevoir 044 pour le suivant... J'ai fait différents essai, mais sans succès. Donc en attendant de trouver une meilleur solution j'ai ajouté ce code. C'est un peu barbare comme dirais Ojal :p Mais au moins le contrôle avec Slide de la lumière fonctionne parfaitement et est très fluide en local ! Par contre en ligne, vite surchargé de requête, la fluidité se perd.

Code:
   // read the packet into packetBufffer and get the senders IP addr and port number
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    
    Serial.println("Contents:");
    
    //je convertis le char en string pour pouvoir utiliser substring
    String packetBuffer_str = String(packetBuffer);

    //je ne garde que les caractères qui sont entre 0 et le nombre total d'octet transmis
    packetBuffer_str = packetBuffer_str.substring(0,packetSize);

    //String en int est possible avec ses changements http://code.google.com/p/arduino/issues/detail?id=468
    long packetBuffer2 = packetBuffer_str.toInt();
    
    Serial.println(packetBuffer2);
    
    analogWrite(9, packetBuffer2);


Le soucis viens de cette partie :
Code:
 // read the packet into packetBufffer and get the senders IP addr and port number
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);

le UDP_TX_PACKET_MAX_SIZE est initialisé dans le fichier UDP.h de la libraire à 24 de base. J'ai essayé de le remplacer par le packetSize mais ça ne fonctionne pas. À réfléchir et pour le moment dodo ! :p

« Last Edit: June 07, 2011, 11:33:13 pm by chesnel » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 217
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir chesnel  smiley

J'avais remarqué le bug de réception en UDP, mais je ne suis pas allé plus loin pour le moment...
Aujourd'hui j'ai eu une journée très chargée et pas eu du tout le temps d'ARDUINISER...
Je vois que l'appellation "barbare" t'a plue  smiley-grin

Je reviens sur ce sujet dès que possible, demain peut être  smiley

Tu as donc réussi aussi à faire fonctionner le slider en local? Super!
Pour éviter de surcharger les envois de requêtes, je pensais mettre une graduation sur le slider de façon à ne déclencher que lorsq'un cran est franchi, mais il y a peut être mieux dans la bibkliothèque JQUERY... L'idéal aurait été d'envoyer un callback - je crois que c'est le nom - au maximum tous les 1/10 ème de secondes...

@ suivre ;-)

Bizarre, mais j'ai l'impression que le sujet ne passionne pas les foules??? On ne serait que 2 dans ce cas??  smiley-roll
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non, non, passionnant, mais je n'ai pas grand chose à amener au moulin.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

faut dire que pour en placer une sur ce topic enflammé... smiley-wink

j'utilises beaucoup l'UDP dans mon projet. Voici comment je procède en gros:

Code:

if(Udp.available()){
byte packetBuffer[MAX_SIZE]; //buffer to hold incoming packet
int valeur;

// initialize the new buffer
memset(packetBuffer, 0, MAX_SIZE);

packetSize = Udp.readPacket(packetBuffer,MAX_SIZE,remoteIp,(uint16_t *)&remotePort); // read the RX buffer

sscanf(packetBuffer, "%i", &valeur);
}

Si ça peut vous aider.

pour ne pas avoir le problème d'anciennes valeurs qui réapparaissent dans le buffer, il est important de l'initialiser systématiquement avant utilisation, même si il vient d'être créée. On ne peut pas savoir ce qui il y avait dans l'espace mémoire occupée auparavant (ancien buffer par exemple).
Utiliser par exemple:
Code:
memset(packetBuffer, 0, MAX_SIZE);

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Full Member
***
Karma: 0
Posts: 177
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je pensais mettre une graduation sur le slider de façon à ne déclencher que lorsqu'un cran est franchi,

Rien de plus simple, l'API du slider embarque déjà cette possibilité

Code:
$( "#slider" ).slider({ max: 255 },{ value: 0 },{step : 5});

Il suffit juste d'ajouter comme paramètre le step et par combien de tranche cela doit être transmis ! Ça réduit pas mal le nombre de requête transmise mais il ne faut pas s'attendre, de toute manière, à avoir quelque chose de réactif via le web :p

J'ai aussi pris le temps de refaire un essai avec le GET, la première méthode que j'ai testé. Je confirme que le transfert par UDP est bien plus rapide. De plus même si il y à existe une surchage d'envoi de requête dans les deux modes au moins par UDP l'ordre d'envoi est respecté, contrairement au GET ou l'ordre de réception est parfois aléatoire.



Logged

Pages: 1 2 3 [4]   Go Up
Jump to: