Arduino protocol websocket,Ajax ou autre, domotique et plus encore

Non satisfais des solutions web statique et vu que je cible plus particulièrement la domotique, il me fallait une solution permettant d’utiliser un client léger (tout est relatif) facile à intégré , portable et surtout une solution full duplex.
La seul façons d’atteindre mes objectifs à été d’utiliser les sockets et plus particulièrement les websocket presque normalisé et déjà implémenté dans safari, chrome et Firefox (pas réussi avec celui ci).
J’ai d’abord chercher les serveurs compatible websocket et j’ai décidé d’utilisé celui ci en php que j’ai pu remanier à ma sauce pour le rendre compatible avec l’arduino (sans le surchargé de la couche handshake des websocket).
Donc mon (mes) client(s) ce connecte au serveur via les websocket, l’arduino comme socket simple.
Pour la communication entre mon (mes) client(s) et l’arduino j’ai écris mon propre protocole simple et parfaitement adapté à la domotique inspiré du protocole plcbus(x10).
Il est simple à comprendre , il consiste à envoyer une trame du genre format hex 0x02|0x04|0x03|0x05|0x01|0x00|0x03 .
0x02: début de trame
0x04: t’aille des données ici 4 octet (0x03|0x05|0x01|0x00) donc taille maximum de 255 octet (256-la commande) pour l’envoie de donné sur le port série ou autre par exemple.
0x03: la commande par exemple analogWrite (256 possibilités de commandes)
0x05: le numéro de l’entrée correspondant
0x01: HIGH
0x00: ack non demandé (à l’inverse 0x01 ack demandé)
0x03 fin de trame (le fait de mettre un début et une fin de trame permet de vérifié ça validité, pas à 100% mais presque)

Le tout est envoyé au format Json vers le serveur ensuite parser par le serveur qui transmet la trame à l’arduino, l’arduino retourne la trame sous forma JSon directement au client (le support JSon est natif en javascript donc …) .
Pour l’instant je n’en suis qu’au début du développement et des testes , il pourra y avoir encore des modifications mais je suis assez satisfait du résultat actuel.

un petit schéma pour visualiser tout ça.

Deux petite vidéos faites avec les moyens du bord, je tente de montré que les deux client (safari et chrome) sont bien synchrone, l’arduino retourne bien le statut ainsi que l’envoie de la valeur d’une photo résistance toute les 5 sec (analog 5) et l’appuis d’un bouton poussoir en local qui retourne en même temps le statut de la sortie arduino au client web (On vois bien tout l’intérêt des websocket et non celui d’une page web statique qui ne permet pas de modifié le statut d’une entré ou sortie: ma lampe est allumée ou éteinte ???).

La librairie avec 2 petit exemples de possibilités pour l’arduino.
http://only.dommel.be/docs/DDuino.zip

le serveur et l’exemple pour mes testes.
http://only.dommel.be/docs/DDuinowsoc.zip
Vous pouvez utiliser Mamp, Wamb, … comme serveur web pour le faire fonctionné.

http://www.mamp.info/en/index.html

Pour le serveur il faut modifier cette ligne dans le fichier websocket.start.php avec vos propre valeurs (l’adresse du serveur, le port serveur , l’adresse de l’arduino)

$master = new WebSocket("192.168.1.100",9390, "192.168.1.109");

pour lancé le serveur il suffit soit via la console de taper la commande si dessous (en s’étant placé dans le répertoire), soit en lançant le fichier websocket.start.php via le navigateur.

php -q websocket.start.php

pour le client de teste il faudra également modifier cette ligne dans le fichier client.html avec vos propre paramètres (adresse du serveur et port).

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

Côté arduino ajouter la librairie et mettre vos propre donnée (adresse arduino, ip serveur, port serveur, …)

#include <DDuino.h>

Le code arduino est assez simple, vu que l’arduino agira comme client on tente une connexion, ici je fais une tentative toute les 5 sec pour mes testes.

 if(!client.connected()  && millis() > delay1) 
  {
    client.connect();
    if(client.connected())
    {
      Serial.println("conect ...");
    }
    else
    {
      Serial.println("disconet ...");
    }
    delay1 = millis()+5000;
  }

On réceptionne les données clients, appel à une fonction action une fois toute les données reçues .

 if(client.available()) 
  {
    uint8_t lengthData = client.available();
    
    uint8_t data[lengthData];
    
    int i = 0;
    while(client.available() > 0)
    {
      data[i] = client.read();
      i+=1;
    }
    
    action(data);
     
    client.flush();
  }
}

l’objet ce charge d’effectuer les traitements et de renvoyé des données ack (si demandé “1”) ou relevé sonde, … au clients web

void action(uint8_t* data)
{
  String str = dduino.sendCmdJsonReturn(data);

  if(str != "0")
  {
    client.print(str);
  }
}

Note: mon protocole n’est pas uniquement valable que pour la communication avec un ethernet shield, il peux aussi être utiliser entre arduino vi un port série, i2c, …
Une autre méthode aurait alors été utilisé pour l’envoie de données aux client(s) sendCmdDataReturn(uint8_t *data) qui retourne un tableau d’octet, il suffit d’adapter le code aux mode de communications.

Voir le code minimum pour faire fonctionné l’arduino via le web, c’est très light et on peux presque tout faire sans y touché.

#include <SPI.h>
#include <Ethernet.h>
#include <DDuino.h>

DDuino dduino = DDuino();
unsigned long delay1 = 0;

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x6D, 0x86 };
byte ip[] = { 192,168,1,109 };
byte server[] = { 192,168,1,100 };
 
Client client(server, 9390);

void setup() 
{
  Ethernet.begin(mac, ip, subnet);
  client.connected();
  Serial.begin(9600);
}

void loop()
{  
  if(client.available()) 
  {
    uint8_t lengthData = client.available();
    uint8_t data[lengthData];
    
    int i = 0;
    while(client.available() > 0)
    {
      data[i] = client.read();
      i+=1;
    }
    
    action(data);
    client.flush();
  }
}

void action(uint8_t* data)
{
  String str = dduino.sendCmdJsonReturn(data);

  if(str != "0")
  {
    client.print(str);
  }
}

Le code web est assez simple en utilisant les fichiers Javascript fourni.
exemple de code html, un simple appel de méthode qui active une sortie numérique de l’arduino digitalWrite(8, 1, 1) active la sortie numérique 8 avec demande de ack, il n’y a rien de plus à mettre, il ne faut pas être un grand développeur pour l’utiliser.

<div><button id="dw8" onclick="digitalWrite(8, 1, 1)">on</button></div>

pour le retour de statut il suffit de modifier l’intérieure de la fonction appropriée dans le fichier response.js et agir selon les données reçues sur le code html via javascript.

function digitalWriteResp(pin, value, ack)
{
   id="dw"+pin;
   if(pin == 8)
   {
     if(value == 1)
     {
       $(id).innerHTML="off";
       $(id).setAttribute('onclick', "digitalWrite("+pin+", 0, "+ack+")");
     }
     else
     {
       $(id).innerHTML="on";
       $(id).setAttribute('onclick', "digitalWrite("+pin+", 1, "+ack+")");
     }
  }
}

Les commandes actuels ± testé, // fonctions javascript correspondantent

#define PIN_MODE 0x01  //pinMode(pin, value)
#define DIGITAL_WRITE 0x02 //digitalWrite(pin, value, ack)
#define DIGITAL_READ 0x03 //digitalRead(pin)
#define ANALOG_REFERENCE 0x04 //analogReference(value)
#define ANALOG_WRITE 0x05 //analogWrite(pin, value, ack)
#define ANALOG_READ 0x06 //analogRead(pin)
#define SHIFT_OUT 0x07 //shiftOut(latch, data, clock, bitOrder, value, ack)
#define SHIFT_IN 0x08 //shiftIn(dataPin, clockPin, bitOrder)
#define PULSE_IN 0x09 //pulseIn(pin)
#define TONE 0x0A //tone(pin, value, ack)
#define TONE_DURATION 0x0B //toneDuration(pin, value, duration, ack)
#define NO_TONE 0x0C //noTone(pin, ack)

#define SERIAL_WRITE 0x0D //serialWrite(chaine)

#define EEPROM_READ 0x0E // eepromRead(address_start, address_end)
#define EEPROM_WRITE 0x0F //eepromWrite(address, value, ack)

#define SERVO_WRITE 0x10 //servoWrite(item, value, ack)
#define SERVO_WRITEMS 0x11 //servoWriteMS(item, value, ack)

#define STEP 0x12 //stepperStep(item, value)
#define SETSPEED 0x13 //stepperSetSpeed(item, value)

#define SPI_PARAM 0x14 //spiParam(BitOrder, ClockDivider, DataMode)
#define SPI_TRANSFER 0x15 //spiTransfer(slave, data)

Suite ...

une dernière petite explication concernant certaines librairies comme EEPROM, Servo, Stepper, ... par défaut elles sont désactivées dans DDuino.h afin d'allégé un peux la librairie, pour les réactivé il suffit de passé leurs directive à 1. Exemple

#ifndef SERVO_D
#define SERVO_D 0
#endif

Pour la librairies servo et stepper on peux rajouter des objets Servo ou Stepper dans le code arduino après les avoirs initialisé, on peux en ajouter autant que le permet l'arduino (ou ça mémoire). Exemple.

  dduino.addServo(3); //on attache un servo à la sortie digital 3
  dduino.addServo(9);

  dduino.addStepper(pas, broche1, broche2); // on donne le pas et attribue les broches du moteur 
 dduino.addStepper(pas, broche1, broche2, broche3, broche4);

Dans le code html javascript ça sera aussi un peux différent, on ne s'adresse pas à une entrée de l'arduino mais on donne la position de l'objet dans le tableau. Exemple:

servoWrite(0x00, value, 0x01);

On donne la position du servo dans le tableau, donc ici le premier 0x00 qui correspond à la première entrée dans le tableau [ 0 ].

Voilà J'ai fini ma petite présentation, il y a encore beaucoup à faire, beaucoup de testes et de debug mais si ça intéresse je partage ce que je cherchais à faire depuis longtemps. (Je ne suis pas satisfait des sockets php, pas mal de problème genre je reçois les données octet par octet si je laisse pas une pause de 1sec entre l'envoi arduino et ça réponse donc j'ai du improvisé mais c'est pas génial il y a des manques côté php et difficile à résoudre, je n'aime pas ce typage de variables trop permissif et hasardeux ... Peut être un serveur java perso à la place plus tard)

MàJ:

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 ou un simple "0" (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

Salut,

Super bouleau ! Franchement bravo c'est vraiment classe !

Je suppose par contre que les websocket sont pris en charge que par firefox ^_^ (opera user inside :grin:) ?

osaka: (Je ne suis pas satisfait des sockets php, pas mal de problème genre je reçois les données octet par octet si je laisse pas une pause de 1sec entre l'envoi arduino et ça réponse donc j'ai du improvisé mais c'est pas génial il y a des manques côté php et difficile à résoudre, je n'aime pas ce typage de variables trop permissif et hasardeux ... Peut être un serveur java perso à la place plus tard)

Tu parle des sockets php, j'ai justement un projet avec et j'ai ce type de problème (je perd un ou deux byte de la réponse de l'arduino à cause des timings foireux) tu pourrai m'en dire plus là dessus ?

Ps: Pourquoi vouloir faire un serveur java !? Coté but/perf java c'est une cata ...

Quoi qu'il en soit c'est du bon bouleau, avec un petit gui en jquery ça pourrai faire un truc vraiment sympa !

skywodd: Je suppose par contre que les websocket sont pris en charge que par firefox ^_^ (opera user inside :grin:) ?

Normalement oui je les ai activé dans firefox 6 mais j'ai droit à une beau "ReferenceError: Undefined variable: WebSocket", idem pour opera, peut être pas encore activé pour les versions d'osx. Par contre sous chrome et Safari pas de problème, je suppose que les autres vont suivre bientôt.

skywodd:

osaka: (Je ne suis pas satisfait des sockets php, pas mal de problème genre je reçois les données octet par octet si je laisse pas une pause de 1sec entre l'envoi arduino et ça réponse donc j'ai du improvisé mais c'est pas génial il y a des manques côté php et difficile à résoudre, je n'aime pas ce typage de variables trop permissif et hasardeux ... Peut être un serveur java perso à la place plus tard)

Tu parle des sockets php, j'ai justement un projet avec et j'ai ce type de problème (je perd un ou deux byte de la réponse de l'arduino à cause des timings foireux) tu pourrai m'en dire plus là dessus ?

J'ai du utilisé une variable qui retient chaque entrée jusqu'à la fin du message "}"

 function sendAllclients($msg)
 {
    $this->bufCli.=$msg;
    
    if(substr_count($this->bufCli, '{') && substr_count($this->bufCli, '}'))
    {
        $this->bufCli= $this->wrap($this->bufCli);
        foreach($this->users as $user)
        {
            if($user->socket!= $this->arduino)
            {
                socket_write($user->socket,$this->bufCli,strlen($this->bufCli));
                
            }
        }
        $this->bufCli = "";
    }
 }

c'est pas génial et un peux boiteux mais mieux que d'avoir une latence d'1 seconde entre chaque échange :~

skywodd: Ps: Pourquoi vouloir faire un serveur java !? Coté but/perf java c'est une cata ...

Ci tu n'utilise pas awt-Swing (et encore) java est très performant et très peux consommateur de ressource. J'avais fais un serveur de socket Java en mode cli pour mon projet de fin d'étude qui permettais la communication entre divers clients et du matériels plcbus/OneWire/... via port série et sa consommation étaient extrêmement faible tant en mémoire que processeur tout en étant plus fiable et allant beaucoup plus loin que ce que permet php par exemple . Java est très loin de ce qu'il était à ses début, mais garde sa mauvaise réputation quand à sa consommation et ressource. ;)

osaka: Si si tu peux faire des includes de .h dans tes .pde, c'est juste le type de fichier utilisé par l'application arduino. L’intérêt de ma lib et d'utilisé les websockets est justement de ne pas devoir inclure le code web dans l'arduino, donc plus de possibilitées pour l'interface comme l'arduino et le shield sont limité à 2000 octet par connexion (4 simultanée) . La lib donc mon protocole permet la communication entre l'arduino et n'importe quel moyen de transmission comme tcp/ip, serie, i2c, ... sans même devoir introduire de code dans l'arduino cible (à part l'instanciation de la lib et le moyen de transmission). Les websockets me permet la communication socket donc full duplex, l'arduino peux envoyé des informations au client web et celui ci peux affiché l'information en temps réel sans devoir en faire la demande en rafraichissant la page ou par bouton, etc. Par exemple ici chico appuie sur un bouton poussoir physique de son mur, sur sa page web l’état de son ampoule est toujours "off", moi l'arduino aura notifier à la page que la lampe vient de passer à "on" en temps réel sans intervention de ma part. On peux même imaginer faire des macros à l'infini à partir de la page web sans que ça prenne un gramme de place dans l'arduino.

Je continue ici c'est plus approprié:

Effectivement ça autorise plus de connexions simultanées, et allège l'Arduino. Mais pourquoi mets tu en avant le full duplex ? C'est comme pour le javascript avec json, c'est toujours le même côté qui initie la conversation non ?

De plus, quelle taille prend ta lib ?

Oliv4945: Mais pourquoi mets tu en avant le full duplex ? C'est comme pour le javascript avec json, c'est toujours le même côté qui initie la conversation non ?

He bien non là est tout l’intérêt de pouvoir utilisé les socket et donc les websocket ...

Je met en avant le côté full duplex parce que l’intérêt des socket est là justement. http://fr.wikipedia.org/wiki/Socket http://fr.wikipedia.org/wiki/Websocket http://fr.wikipedia.org/wiki/Duplex_%28canal_de_communication%29

  • Le protocole WebSocket vise à développer un canal de communication bidirectionnel et full-duplex sur un socket TCP pour les navigateurs et les serveurs web.
  • full-duplex pour lesquels l'information est transportée simultanément dans chaque sens

Mon arduino peut très bien informé le client web (ici le navigateur) qui suivant le message reçu modifiera instantanément son contenu (via javascript) Regarde bien les vidéos j'envoie une trame à l'arduino en cliquant sur le bouton, le socket client (web) informe l'arduino qui exécute l'action demandée, l'arduino renvoie directement à la page web des données au forma JSon (si ack demandé), javascript ce charge de parser les informations (JSon) et agira sur la page directement pour les deux clients (chrome et safari en parallèle ici pour l'exemple, tu vois bien l’état des boutons et autre bouger simultanément des deux côtés). Regarde aussi la partie AnalogRead pin5 de la page (en bas) qui est le relevé d'une photo résistance, je ne fais aucune action sur la page, c'est l'arduino qui envoie cette information sans que je l'ai demandé et sans avoir besoin de rafraichir la page. La fenêtre avec le code JSon que tu vois c'est le message renvoyé par l'arduino, ça donne une idée de la vitesse entre l'appuis du bouton ou autre et le message de retour. Pour de la domotique être informé directement d'un état (ça va la lumière est éteinte ouf :sleeping:. He be non madame l'a allumé localement ]:D) ou une alarme ou autre est un minimum pour avoir quelque chose de fiable, imagine que tu ais le feu chez toi, tu préférerais pas être informé directement plutôt qu'au prochain rafraichissement de la page :roll_eyes:?

En taille 6ko pour la mémoire programme +-, ça dépand de ce que tu utilise de la lib, en sram je ne sais pas lol ;).

Étant très intéressé par ton projet j'ai voulu tester l'exemple que tu fournis en zip... mais je suis incapable de verifier le code.. j'ai une bonne petite liste d'erreur :

In file included from /Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:42:
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.h:53:19: error: Servo.h: No such file or directory
In file included from /Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:42:
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.h:80: error: 'Servo' has not been declared
/Users/chesnelDocuments/Arduino/libraries/DDuino/DDuino.h:104: error: ISO C++ forbids declaration of 'Servo' with no type
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.h:104: error: expected ';' before '*' token
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp: In member function 'uint8_t* DDuino::runCMD(uint8_t*)':
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:209: error: 'class DDuino' has no member named 'servo'
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:211: error: 'class DDuino' has no member named 'servo'
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:222: error: 'class DDuino' has no member named 'servo'
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:224: error: 'class DDuino' has no member named 'servo'
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp: At global scope:
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:385: error: variable or field 'setServo' declared void
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:385: error: 'Servo' was not declared in this scope
/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.cpp:385: error: 'servos' was not declared in this scope

aurais-je raté quelque chose ? :/

osaka:
Suite …

une dernière petite explication concernant certaines librairies comme EEPROM, Servo, Stepper, … par défaut elles sont désactivées dans DDuino.h afin d’allégé un peux la librairie, pour les réactivé il suffit de passé leurs directive à 1.
Exemple

#ifndef SERVO_D

#define SERVO_D 1
#endif

Ca doit venir d’ici, je ne les ai pas inclus par défaut afin de gagner un petit peux de place :. (qui est précieuse pour l’arduino :~) et comme pas indispensable si on à pas besoin de servo ou ou autre objet des lib “standard”.
Dans “/Users/chesnel/Documents/Arduino/libraries/DDuino/DDuino.h” ligne 32

Normalement avec le premier exemple “dDuino1” il ne devrait pas y avoir besoin de modifié la lib. :wink:

Edit: A l’inverse pour le premier exemple, mettre la directive à 1 dans DDuino.h sans inclure <Servo.h> dans le .pde peux donner cette erreur. c’est un des côté du c/c++ où j’ai du mal à comprendre certain comportement…

okay merci je testerais ce soir en rentrant :)

J'ai surement du être peux claire dans certaine de mes explications donc n'hésite pas à demandé. ;) Edit: j'ai fais quelque modification et ajout.

J'ai regardé un peu plus en détail et mieux compris… chapeau ! :)

Bon après mettre rendu compte que je m'acharner à faire fonctionner sour Firefox... et que malgrès le wesocket activé j'avais cette erreur dans la page : ReferenceError: WebSocket is not defined (D'ailleurs Firefox est sensé pouvoir gérer le websocket ce n'est pas normal d'avoir cette erreur :/) Je suis passé sous chrome eh là j'ai franchi une étape de plus...

WebSocket - status 0
Disconnected - status 3

Et mon websocket se déconnecte... as-tu déjà eu ce soucis ?

Ps : apparament cela provient du coté arduino ou il n'a aucune réponse donc il se déconnecte. Pourtant j'ai pingé l'ip de mon arduino est j'ai un retour... Je continue à chercher.

En fait j'ai seulement vu il y a peu qu'avec firefox côté javascript la connexion ce fait via MozWebSocket et non webSocket ... de plus ils sont passé à la version 7 du protocole ..., j'ai réussi à obtenir une connexion mais nouveauté bizarre de la part de mozilla la communication semble crypté ou sous un autre type d'encodage ... arf ... on dirait qu'ils ont fais leur truc à leur sauce comme le fait microsoft :| (même en envoyant une chaine de caractère identique à l'arrivée elle est toujour différente et sous forme "?[?P$" ou ?œ?4?? ou ??,זCm ....) Également un nouveau phénomène avec chrome, on dirais qu'ils sont passé à la version 8 du protocole sans que j'ai fais de mise à jour ou autre :fearful: ... il est similaire au handshaque qui a été radicalement modifié à partir de la version 6 du protocole mais je n’obtiens pas la connexion =( qui pourtant marche avec firefox ... ]:D mon upgrade et la clef sont pourtant bon et conforme à la norme ... Ca marche toujours pour Safari et Opera (j'avais oublier de l'activé précédemment) qui sont toujours sous le protocole antérieure au 6 ... Beaucoup de choses sont en trains de bouger niveau websocket, vivement que la normalisation définitive ...

Au niveau de chrome l'endroit ou sa bloque c'est à la ligne 36 du websocket.class.php

if($socket==$this->master)

le $socket = Resource id #6 le $this->master =Resource id #5

J'ai pas chercher plus loin et j'ai tester sous Safari et là autre erreur... Arduino disconnect :D

http://only.dommel.be/docs/DDuinowsoc.zip je remet le fichier à jour histoire d'avoir la dernière version avec le nouveau handshake.

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

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 ^^

http://only.dommel.be/docs/DDuino.zip corrigé :grin:

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 :~.

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)

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

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

pour le code arduino

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

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

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

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

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...