Go Down

Topic: Arduino protocol websocket,Ajax ou autre, domotique et plus encore (Read 5557 times) previous topic - next topic

chesnel

#15
Sep 24, 2011, 08:03 pm Last Edit: Sep 24, 2011, 08:25 pm by chesnel Reason: 1
Ton deuxième lien ne pointe vers rien :) un httpdocs de trop

Bon dans le shell la connexion à l'air de fonctionné...

Voici mon erreur maintenant au niveau de ton interface " Error: INVALID_STATE_ERR: DOM Exception 11. apparament c'est une erreur par rapport xmlhttprequest.. je continue mes recherche ^^

osaka

http://only.dommel.be/docs/DDuino.zip corrigé  :smiley-mr-green:

Sous chrome que tu as cette erreur ? et la connexion reste "WebSocket - status 0" ?

Si oui c'est ce que j'expliquais précédemment, changement du protocole de la version 00 ou antérieure à 06 à la version 08.
Pour l'instant chez moi il n'y a que safari et opéra qui fonctionne, faut que je trouve pour le problème de données transmise par firefox et le problème de handshake de chrome.
Enfin temps que la normalisation n'est pas définitive (dernière ligne droite normalement) ça risque encore d'arrivé  ce genre de soucis :~.

chesnel

#17
Sep 24, 2011, 08:28 pm Last Edit: Sep 24, 2011, 08:29 pm by chesnel Reason: 1
oh ok excuse moi je viens de voir que j'étais resté sur chrome d'ou mon erreur vis-à-vis du xmlhttprequest... Mais par contre je n'arrive tjrs pas à le faire fonctionner sous safari... arduino deconect comme message dans le shell...

Quelle version as-tu de safari? pour ma part Version 5.1 (7534.48.3)

osaka

#18
Sep 24, 2011, 08:42 pm Last Edit: Sep 24, 2011, 08:45 pm by osaka Reason: 1
Si au niveau navigateur tu as "Welcome - status 1" c'est que c'est bon de ce côté, donc mauvaise donnée pour l'ip ou port serveur pour l'arduino, enfin normalement ce sont les même que pour les clients (dans client.html) .

chez moi avec les derniers fichiers.

dans websocket.start.php
Code: [Select]

$master = new WebSocket("192.168.1.100",9390, "192.168.1.109"); //ip serveur, port serveur , ip arduino


pour le code arduino
Code: [Select]

byte ip[] = { 192,168,1,109 }; //ip arduino
byte server[] = { 192,168,1,100 }; //ip serveur

Client client(server, 9390); // ip serveur, port 9390


et dans client.html
Code: [Select]

<body onload="init('ws://192.168.1.100:9390', 'DDuino' )">


même moi je fini par ne plus m'y retrouvé lol ;)
Pour Safari je suis à la 5.0.6 (Je suis sous léopard)

chesnel

tout est correct de mon coté aussi j'ai bien rentré les adresse au bonne endroit j'ai essayè différent port et ip pour l'arduino

Code: [Select]
conect:127.0.0.1
////////////////////////////////////////////////////
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: 127.0.0.1:9850
Origin: http://localhost:8888
Sec-WebSocket-Protocol: DDuino
Sec-WebSocket-Key1: 1?)502' i  875{ 9 2 0 (
Sec-WebSocket-Key2: Yk 40 4Z$1h5 091h0 S ;f0

%?R*C?
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://localhost:8888
Sec-WebSocket-Location: ws://127.0.0.1:9850/
Sec-WebSocket-Protocol: DDuino

??^?IA???MK?`n

////////////////////////////////////////////////////
arduino disconect


Si tu voix quelque chose de louche...

viknet

Bonjour, je me permet de poset ici car votre projet est plutot trés bien fait,

ayant le meme probleme j'ai opté pour une solution un peu differente (mais moins propre) que vous pouvez trouver ici.

http://arduino.cc/forum/index.php/topic,73352.0.html

je n'ai pas encore tout a fait compris comment votre systeme fonctionne mais votre cahier des charges ressemble etrangement au mien :-)

bon courage

Viknet

osaka

#21
Sep 25, 2011, 02:42 pm Last Edit: Sep 25, 2011, 03:07 pm by osaka Reason: 1

tout est correct de mon coté aussi j'ai bien rentré les adresse au bonne endroit j'ai essayè différent port et ip pour l'arduino

Code: [Select]
conect:127.0.0.1
////////////////////////////////////////////////////
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: 127.0.0.1:9850
Origin: http://localhost:8888
Sec-WebSocket-Protocol: DDuino
Sec-WebSocket-Key1: 1?)502' i  875{ 9 2 0 (
Sec-WebSocket-Key2: Yk 40 4Z$1h5 091h0 S ;f0

%?R*C?
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://localhost:8888
Sec-WebSocket-Location: ws://127.0.0.1:9850/
Sec-WebSocket-Protocol: DDuino

??^ʶIA???MK?`n

////////////////////////////////////////////////////
arduino disconect


Si tu voix quelque chose de louche...


Tu as mis quoi comme adresse serveur dans l'arduino comme ici tu reste en localhost (avec 127.0.0.1 difficile de vérifié si ça marche en dehors de ton pc serveur) je suppose que tu n'as pas mis 127.0.0.1 dans l'arduino ? (privilégié une adresse statique plutôt que de passé par dhcp aussi).
J'ai oublié de préciser la redirection du port dans ton routeur (Port Forwarding), rediriger le port vers l'ip de ton serveur.
(J'ai oublié d'enlever les sorties console pour le debug mais ce que tu vois c'est la transaction de connexion avec le handshake, tu pourras voir la différence avec le dernier protocole avec firefox)
Merci pour tes tests ça me permet de voir ou ça peux rater ;)
(je pense avoir trouver le problème de communication avec firefox, il semble qu'on ai ajouter une couche de sécurité par masque pour la transaction de données page->serveur)

viknet je vais regarder ton projet avec grande attention dès que possible. ;)
(Je comprend que certain points de mon projet soient difficile à comprendre comme je suis plutôt mauvais une fois qu'il faut expliquer les choses lol)

chesnel

Quote
J'ai oublié de préciser la redirection du port dans ton routeur (Port Forwarding), rediriger le port vers l'ip de ton serveur.


Pour le moment je ne fais que des tentatives pour faire fonctionner en local donc je ne pense pas que la redirection  soit nécessaire au niveau de mon routeur, à mois que je n'ai pas compris et que tu me parles d'autre chose :p .  le 127.0.0.1 et l'adresse correspondant à localhost avec MAMP et c'est la seul qui fonctionne pour lancer le websocket.

Voici ce que j'ai au niveau des adresses, pour l'arduino :

Code: [Select]
byte ip[] = { 192,168,1,200 };
byte server[] = { 127,0,0,1};
byte subnet[] = {255,255,255,0};
Client client(server, 9850);


Pour la websocket start :

Code: [Select]
      $master = new WebSocket("127.0.0.1",9850, "192.168.1.200");

et pour la page client.html

Code: [Select]
<body onload="init('ws://127.0.0.1:9850', 'DDuino' )">


osaka

#23
Sep 25, 2011, 07:35 pm Last Edit: Sep 26, 2011, 12:31 am by osaka Reason: 1

Quote
J'ai oublié de préciser la redirection du port dans ton routeur (Port Forwarding), rediriger le port vers l'ip de ton serveur.


Pour le moment je ne fais que des tentatives pour faire fonctionner en local donc je ne pense pas que la redirection  soit nécessaire au niveau de mon routeur, à mois que je n'ai pas compris et que tu me parles d'autre chose :p .  le 127.0.0.1 et l'adresse correspondant à localhost avec MAMP et c'est la seul qui fonctionne pour lancer le websocket.


En fait localhost ou "127.0.0.1" désigne la machine elle même, c'est une manière de s'adresser à sois même par tcp/ip.
Le wiki l'expliquera mieux que moi lol http://fr.wikipedia.org/wiki/Localhost .

Par défaut normalement dans mamp le port apache est 8888 , donc dans ton routeur tu peux redirigé le port 8888 vers la machine serveur (ou mamp/apache est installé) et tu y auras accès de n'importe quel machine de ton réseau local (donc l'arduino).
ex: 192.168.1.100:8888 je demande à atteindre le programme (ici le serveur apache ayant comme entrée le port 8888) se trouvant sur la machine dont l'ip est 192.168.1.100 et vu que je suis sur un réseau multipoint je dois le notifié à mon routeur pour qu'il dirige la transaction vers la bonne machine possédant le programme avec le port spécifié.  

Pour le programme php WebSocket serveur il faudra également que ton routeur sache que la cible (le programme serveur possédant le port 9850)  à atteindre est sur la machine dont l'ip est 192.168.1.100 .

pour de meilleurs explication:
http://fr.wikipedia.org/wiki/Port_%28logiciel%29
http://fr.wikipedia.org/wiki/Redirection_de_port

Ici l'arduino ne le sais pas et même le routeur ne sauras pas ou transmettre la demande de connexion.


Voici ce que j'ai au niveau des adresses, pour l'arduino :

Code: [Select]
byte ip[] = { 192,168,1,200 };
byte server[] = { 127,0,0,1};
byte subnet[] = {255,255,255,0};
Client client(server, 9850);



En fait 127.0.0.1 en adresse serveur c'est comme si tu disais à l'arduino que le serveur c'est lui même.



Pour la websocket start :

Code: [Select]
      $master = new WebSocket("127.0.0.1",9850, "192.168.1.200");

et pour la page client.html

Code: [Select]
<body onload="init('ws://127.0.0.1:9850', 'DDuino' )">



ici donc ça marche pour le client html comme tu es en local par rapport à ta machine contenant le programme serveur, par contre l'arduino lui ne sais pas ou se trouve la machine contenant le programme serveur ciblé par le port 9850.

Sur un réseau on cible d'abord une machine via son ip puis on cible un programme (de la machine) via son port.

Un bon exemple donné dans le wiki:
Quote

Pour faire une comparaison grossièrement, l'adresse IP peut être apparentée à l'adresse postale d'un immeuble. Un port peut être apparenté à une boîte à lettres de cet immeuble. Et nous avons besoin de ces deux données pour que quelque chose puisse arriver à son destinataire.


(Pas toujours facile de comprendre ce que je baragouine  :smiley-mr-green: lol)
;)

chesnel

je suis juste un peu nié... J'ai tellement l'habitude de faire mes essais directement en ligne que j'ai pas percuté que mon arduino essayé de ce connecter sur le localhost qui bien évidemment n'est pas accessible si je ne fais pas de redirection -_-

osaka

#25
Sep 27, 2011, 11:24 am Last Edit: Sep 27, 2011, 11:58 am by osaka Reason: 1
Lol si tu voyais les bourdes que je peux faire parfois  :*.

Je viens de faire une version ajax du projet, il n'y a pas eu grand chose à modifier juste la méthode de transmission, rien de changer pour la librairie indépendante de la partie communication mais j'ai quand même corriger quelques trucs (il y en aura surement encore).

La seule chose à modifier est l'adresse arduino dans socket.php, pour les testes j'ai également fais en sorte qu'il y ai un relevé d'une entrée analogique toute les minutes (voir init() dans webAjax.js) .
A chaque échange il y a automatiquement une valeur de retour toujours sous format JSon (response.js pour agir sur la page selon les valeurs de retour).

http://only.dommel.be/docs/DDuinoAjax.zip

Inclus un exemple spécifique DDuinoAjax.pde pour ce cas de figure, l'arduino devient serveur.
http://only.dommel.be/docs/DDuino.zip

chesnel

Bon je n'ai eu le temps de tester que maintenant.. mais cela fonctionne enfin :)
J'aimerais pouvoir faire aussi des essais avec une page sur un site internet... mais créer une connexion websocket avec un serveur partagé je ne suis pas certains que cela fonctionne étant donnée que c'est une adresse IP pour plusieurs site web.. Encore une raison supplémentaire pour que je passe à un serveur dédié :)

Par contre j'ai testé le contrôle avec le Slide d'une led et le temps de réaction est plutôt lent en comparaison du système que j'utilise avec le protocole UDP.

osaka

#27
Oct 03, 2011, 02:04 pm Last Edit: Oct 03, 2011, 04:04 pm by osaka Reason: 1

J'aimerais pouvoir faire aussi des essais avec une page sur un site internet... mais créer une connexion websocket avec un serveur partagé je ne suis pas certains que cela fonctionne étant donnée que c'est une adresse IP pour plusieurs site web.. Encore une raison supplémentaire pour que je passe à un serveur dédié :)


Normalement il n'y a pas de problème, c'est à ça que servent les port, comme par exemple tu t'adresse à apache via le port 8888 pour obtenir tes différentes pages, pour les websockets ici tu t'adresses au serveur php via le port 9390.
On va dire que le serveur php qui ce charge de la connexion websocket c'est déjà un serveur dédié (au websocket).


Par contre j'ai testé le contrôle avec le Slide d'une led et le temps de réaction est plutôt lent en comparaison du système que j'utilise avec le protocole UDP.


Je suppose que tu as essayé le slide sans relâchement, en continu ? (pour cet exemple par exemple je ne demande pas de retour d'état tant qu'il n'y a pas eu de relâchement pour gagner un peux de temps mais au relâchement tout les clients sont mis à jours)
C'est vrai qu'il y a une petite latence :smiley-sleep: entre ma version Ajax (ta version mais en tcp  :) ) et WebSocket, j'ai mesuré plus ou moins entre 20Ms et 80Ms entre 2 commandes pour la solution Ajax et 200Ms pour la version websocket lors d'envois continu avec le slide par exemple.
Sans doute du à la différence de traitement côté socket php selon les versions.
Mais bon je dirais que leur utilisations ce fait selon les besoins si maintenant on a besoin de clients multiples qui soient synchrones et d'une connexion full duplex on visera les webSockets (fiabilité domotique), par contre si on a besoin d'une solution plus "rapide" avec transmission continue et soutenue pour un servo par exemple (sauf si on donne directement une position du premier coup) on visera la solution Ajax.
Entre () c'est là qu'on vois l'intérêt de séparé la partie protocole de la partie transmission, il n'y a rien à modifier côté protocole et très peux à faire du côté transmission (pour qu'une application sois pérenne il faut supprimer un maximum les dépendances).
J'ai fais une tentative avec solution existante pour que l'arduino puisse directement faire office de serveur de websockets et évité un intérmédiaire, mais je n'ai rien obtenu de convaincant du au limite de l'arduino et du shield même (connexion simultanée, ram, ... ) :~ .

Maintenant par exemple faire une action comme on-off sur une lampe la différence ne se sentira pas, c'est au choix.
;)

Go Up