Pages: [1] 2   Go Down
Author Topic: Transfert de fichier d'une carte S vers un PC par Websocket  (Read 2477 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Je souhaiterais réaliser un transfert de fichier provenant dune carte SD par Websocket mais je ne sais absolument pas comment faire.
Quelqu'un aurait il une idée ou un exemple?
Merci d'avance
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Juste pour être sur que nous avons la même compréhension : les WebSocket ce sont des points de connexion TCP qui sont géré depuis le navigateur web dans du code HTML5.
Coté Arduino, il faut utiliser EthernetServer
Ensuite il faut te faire un petit protocole pour que la WebSocket demande à l'Arduino le contenu de la carte SD.
L'Arduino traite la requête en lisant la carte SD et en renvoyant le contenu sur EthernetServeur (connecté à l'autre bout à la WebSocket)
« Last Edit: October 28, 2012, 02:33:57 pm by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Si par "websocket" tu entends html5 :
https://github.com/brandenhall/Arduino-Websocket

Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


Je viens de passer 2 soirs à essayer cette lib.
C'est pas gagné

J'ai des plantages incompréhensibles qui semblent liés à l'utilisation de String.
Ce n'est pas un problème de manque de mémoire car ça par en live assez rapidement et freeMemory() de donne plus de 1KO de dispo.

J'ai du ré-écrire une bonne partie du code de parsing du handshake en virant les String et en passant en tableau de char. La connexion passe maintenant mais ça se vautre plus loin.

Il arrive que même freeMemory() lui-même se vautre.

Fais ch... de pas pouvoir faire de pas à pas. Je crois je vais finir par me payer un AVRDragon.

Bref, je soupçonne :
- soit un bon gros jardinage qui me fout en l'air soit la stack soit le heap (vu que même freeMemory part en sucette)
- soit que realloc() est buggé

Skywodd, n'avais tu pas dis déjà qu'il y avait un problème avec la gestion de mémoire dynamique ?
Un upgrade de la chaîne WinAVR permettrait-il de régler le problème ?
(je suis toujours avec la chaîne par défaut de l'IDE v1.0.1)
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je me répond à moi-même

J'ai upgradé le WinAVR à la version 20100110 et ca marche impec.
Même le code d'origine avec tout ses strings marche très bien.

Conclusion : IL FAUT UPGRADER SON WINAVR !!!!!!


Sinon, Y'a pas de doute, ces WebSocket ca à l'air pas mal.
Plus simple a utiliser que du Ajax d'un point de vue code JavaScript, surtout coté Arduino.
Pas besoin de Webduino pour parser des requêtes POST/GET donc le code devrait pouvoir être plus léger.
Programmation complètement asynchrone et bidirectionnelle : l'Arduino peut envoyer de lui même des trames et cela déclenche un callback onmessage().
Par contre c'est une connexion persistante donc potentiellement il faire plus attention aux aspects connexion/déconnexion.

Il faudrait que je relise le topic d'Osaka qui est très pro-websocket car apparemment il a fait les choses un peu différemment sans gérer le handshake sur l'Arduino.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Tout d'abord merci pour vos aide.
Et comment faites vous pour Upgrader votre AVR?
Cela marche avec une arduino Mega?
Et auriez vous un exemple web socket qui marche?
Vous fonctionner avec du Wifi ou de l'Ethernet (WS5100)?
Merci d'avance.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'utilise un W5100
J'ai du légèrement adapter l'exemple (je viens de te répondre sur ton topic avec le code source adapté)
Mais je n'ai pas eu à toucher à la lib
Je n'ai utilisé que Chrome

Pour mettre à jour le compilo WinAVR il faut :
- Télécharger l'installeur ici http://sourceforge.net/projects/winavr/files/WinAVR/20100110/
- Installer où tu veux
- renommer c:\arduino\hardware\tools\avr en avr_original
- déplacer le répertoire avr nouvellement installé à la place de l'ancien : tu dois garder le même niveau de répertoire
- dans le nouveau avr, il supprimer :
     avr/bin/avrdude.exe
     avr/bin/avrdude.conf
     avr/etc/avrdude.conf
et les remplacer par ceux de l'ancien avr_original (il n'y a pas de bin/avrdude.conf dans l'ancien, c'est pas grave)

Mais avant de te lancer la dedans, soit sur d'avoir des problèmes qui le justifie.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Fais ch... de pas pouvoir faire de pas à pas. Je crois je vais finir par me payer un AVRDragon.
C'est hyper fragile les AVRdragon, au moindre faux contact ... cramé ...

Skywodd, n'avais tu pas dis déjà qu'il y avait un problème avec la gestion de mémoire dynamique ?
Un upgrade de la chaîne WinAVR permettrait-il de régler le problème ?
(je suis toujours avec la chaîne par défaut de l'IDE v1.0.1)
La version fourni de base est complétement buggé au niveau de la gestion des new / delete, etc
Le problème a été remonté à la team arduino plusieurs fois sans réponse de leur pars ...

Sinon, Y'a pas de doute, ces WebSocket ca à l'air pas mal.
Plus simple a utiliser que du Ajax d'un point de vue code JavaScript, surtout coté Arduino.
Pas besoin de Webduino pour parser des requêtes POST/GET donc le code devrait pouvoir être plus léger.
Programmation complètement asynchrone et bidirectionnelle : l'Arduino peut envoyer de lui même des trames et cela déclenche un callback onmessage().
Par contre c'est une connexion persistante donc potentiellement il faire plus attention aux aspects connexion/déconnexion.
Les websockets sont de plus en plus utilisés mais il faut aussi prendre en compte la compatibilité avec les navigateurs.
Et pour ça c'est pas encore gagner ...

- dans le nouveau avr, il supprimer :
     avr/bin/avrdude.exe
     avr/bin/avrdude.conf
     avr/etc/avrdude.conf
et les remplacer par ceux de l'ancien avr_original (il n'y a pas de bin/avrdude.conf dans l'ancien, c'est pas grave)
Même pas besoin de toucher à avrdude.exe et avrdude.conf smiley-wink

Point 1, 2 et 3 pour la mise à jour de winAVR :
http://skyduino.wordpress.com/2012/07/07/hack-utiliser-teensyduino-avec-une-carte-arduino-leonardo-ou-compatible-leonardo/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Même pas besoin de toucher à avrdude.exe et avrdude.conf smiley-wink

Hum.
Il me semble que l'AVRdude d'Arduino est modifié, notamment pour la léonardo.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hum.
Il me semble que l'AVRdude d'Arduino est modifié, notamment pour la léonardo.
Ha bon ? Moins j'ai aucun soucis avec l'avrdude d'origne de winAVR.

Celui fourni avec la dernière version contient déjà le patch pour supporter le mode "arduino".
Aprés s'ils ont fait un nouveau patch pour la leonardo je l'ai même pas remarquer smiley-small
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, Je ferais des essais quand je serais rentré lundi
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Newbie
*
Karma: 0
Posts: 27
Mess with the best, die like the rest...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Suite à mes premiers tests, l'Arduino a du mal a gérer les websockets: la meilleures solutions (et il me semble qu'Osaka avait conclue à la même chose) c'est de faire un server mixte.

C'est à dire que côté clients web on fonctionne bien en websockets mais côté Arduino lors de l'authentification au server il faut que ce dernier saisisse qu'il discute à l'Arduino (via IP ou analyse de trame spécifique) puis courcicuite la phase de Handshake pour directement ajouter l'Arduino dans sa liste des users.

De cette facon, on arrive a un système completement fluide (aussi bien via Ethernet que via GPRS).

Au niveau navigateurs: ca fonctionne bien sous safari/safari mobile/chrome/chrome mobile/FF.

Logged

vlp

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si je comprend bien tu fais intervenir un serveur entre les 2
Code:
Navigateur ---(websocket)---> Serveur Web / PHP ---(socket simple)---> Arduino

C'est ca ?

parce qu'il n'y a pas moyen que le navigateur court-circuite le handshake
Or moi je parle d'une solution directe
Code:
Navigateur ---(websocket)---> Arduino

Donc avec handshake géré par l'Arduino.

Le problème (que j'ai re-soulevé sur ton autre post ailleurs) c'est que les hébergeurs généralement désactivent les sockets PHP.

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Jr. Member
**
Karma: 3
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Pour faire marcher mes websocket directement entre le navigateur web et l'arduino, je procède comme suit:

côté navigateur, un peu de javascript pour initier la connexion:

Code:
var source;
var data;
var object;


if (typeof (EventSource) == undefined)
{
// websockets non supportés par le navigateur
}
else
{
souce = new EventSource ("mon_event_handler");
souce.onmessage = function (event)
{
// ici, eval.data contient les données renvoyées par l'arduino
// cette partie est appelée à chaque envoi de données de l'arduino
}
}

et côté arduino:

pour préparer la socket, StartEventHandler doit être appelé dans le code du serveur web de l'arduino lorsqu'on détecte la bonne requête:

Code:
// ligne contient la 1ère ligne de texte lue sur la socket obtenue avec client = server.available ()

if (strcmp (ligne, "GET /mon_event_handler HTTP/1.1") == 0)
{
// fermeture de l'ancienne (on en garde qu'une à la fois)
if (_socketEventHandler)
_socketEventHandler->stop ();

// renvoi de l'entête
_socketEventHandler = client;
_socketEventHandler->println ("HTTP/1.1 200 OK\n");
_socketEventHandler->println ("Connection: keep-alive");
_socketEventHandler->println ("Cache-control: no-cache");
_socketEventHandler->println ("Content-Type: text/event-stream");
_socketEventHandler->println ("");
}

ensuite chaque fois qu'on veut envoyer des données dynamiquement au navigateur web, on écrit sur la socket _socketEventHandler:

Code:
_socketEventHandler->println ("data: ");

// écrire ici les données avec println
_socketEventHandler->println ("coucou :)");

// signaler la fin des données
_socketEventHandler->println ();

y'a sûrement quelques fautes, car c'est tiré de mon projet et adapté, mais le principe est là.

si ça peut aider quelqu'un…
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok
mais si je comprend bien, ce n'est pas des WebSocket mais des Serveur-Sent Events

Je découvre mais çà ne semple pas être tout a fait la même chose:
- Mise en oeuvre apparemment plus simple puisqu'on se contente de garder la connexion HTTP en keep alive (pas de Upgrade handshake)
- Mais mono directionnel : serveur -> client uniquement
  Le navigateur ne peut rien demander tel que envoyer un message si l'utilisateur clique un bouton

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Pages: [1] 2   Go Up
Jump to: