serveur web embarqué - C - Programmation
Marsh Posté le 25-11-2013 à 19:19:24
Ce sujet a été déplacé de la catégorie Systèmes & Réseaux Pro vers la categorie Programmation par Je@nb
Marsh Posté le 25-11-2013 à 20:38:34
le protocole HTTP est plus simple que le protocole TCP, je suis étonné que tu rencontres des difficultés sur le protocole HTTP alors que tu n'en as pas rencontré - à priori - sur le TCP.
Ensuite, il est effectivement possible d'écrire un (mini) serveur implémentant le protocole HTTP uniquement en C. Tu cites le HTML mais je pense que c'est une erreur de ta part car cela n'a rien à voir avec le protocole HTTP. le HTML est un langage de présentation généralement transporté dans des requêtes HTTP, mais une requête HTTP peut transporter n'importe quoi d'autre ( XML, texte, binaire ), et le HTML peut s'utiliser en dehors d'un serveur HTTP, par exemple un fichier local qu'on ouvrirait avec un navigateur.
Il existe des implémentations de serveur http léger en C desquelles ( ? ) tu peux t'inspirer comme par exemple lighttpd ( http://www.lighttpd.net/ )
Pour commencer, tu peux implémenter la commande la plus simple de la version 1.1 du protocole : GET .
Marsh Posté le 27-11-2013 à 00:08:50
LE document de travail pour implémenter HTTP : http://tools.ietf.org/html/rfc2616
Citation : Je bloque surtout sur la création de la fonction qui va permettre de transformer une demande de fichier par mon client (navigateur internet) en appel de sous-programme. |
D'après la RFC 2616: http://tools.ietf.org/html/rfc2616#section-3.7.2
La syntaxe de multipart dans HTTP partage sa syntaxe avec la RFC 2046: http://tools.ietf.org/html/rfc2046#section-5.1.1
Exemple de multipart sur le site de w3c : http://www.w3.org/TR/html401/inter [...] -17.13.4.2
Marsh Posté le 27-11-2013 à 17:54:16
Hmm, le multipart HTTP, c'est en général pour faire de l'upload de fichier. Dans son cas, je pense plutôt qu'il veut faire du download.
Le download est implémenté en HTTP via une requète de type "GET", relativement triviale à traitée. Typiquement un client écrit un message du genre dans une socket TCP:
Code :
|
Suffit ensuite de répondre un truc du genre :
Code :
|
Même pas besoin de HTTP 1.1 pour ça. Si tout ce que doit faire ton serveur HTTP c'est d'envoyer des fichiers, c'est à peu près le seul type de requète que tu auras à traiter. Le reste tu peux envoyer une réponse type "HTTP/1.0 400 Bad request"
Cela dit, je pense que tu devras au moins traiter des requètes avec un Content-Type valant "application/x-www-form-urlencoded" (typiquement le type de requète envoyée suite à la validation d'un formulaire HTML). Ce n'est pas beaucoup plus compliqué qu'une requète de type "GET", même s'il y a quelques pièges à faire attention.
Si tu veux partir d'une base existante, j'ai déjà jouer avec ça :
Marsh Posté le 02-12-2013 à 09:55:53
Bonjour !
Désolé du retard.
Merci pour toutes vos réponses : en ce moment c'est mon parsage qui ne fonctionne pas bien, car mon serveur web embarqué n'arrive pas à traiter le GET qui lui arrive.
Aussi, j'ai un problème quand j'essaie d'utiliser telnet en cmd, quand je tape "telnet IP PORT", ça me met transforme ma cmd en écran noir(je passe pas par l'étape où il m'affiche "connected to IP" ), et quand je tape quelque chose ça me met des "_" pour chaque lettre que je tape mais ça ne me répond rien... une idée s'il vous plait ?
Aussi, je voulais tester le mode client de mon embarqué, mais je ne sais pas si cela est possible s'il vous plait ? ( c'est à dire l'embarqué qui émet une requete genre pour récupérer un fichier html sur mon ordi ).
Cdt,
Sébastien.
Marsh Posté le 03-12-2013 à 22:27:28
Si tu veux tester ton serveur web embarqué, je te conseillerais plutôt d'utiliser netcat. Il n'est pas dispo sur windows par défaut, mais dispo sur quasi tous les autres systèmes. C'est un peu le couteau suisse des connexions réseaux. Par exemple pour tester ton serveur web:
Code :
|
À la suite de ça, si ton serveur web n'est pas trop mal foutu, tu devrais avoir le contenu de la racine du site web. Tu peux aussi stocker ça dans un fichier, genre :
Code :
|
Marsh Posté le 04-12-2013 à 02:22:50
Salut !
Je vois ce que tu veux dire tpierron, merci !
J'aurais quelques autres questions : le mode serveur commence à bien fonctionner, c'est à dire que mon navigateur envoie des GET à mon serveur web embarqué, et j'arrive à afficher des pages html simple (avec du texte à l'intérieur tout simplement).
Cependant j'aimerai maintenant allumer par exemple mes LEDs via un bouton que je commande au niveau de ma page html : je ne vois pas trop comment interagir avec le materiel quand par exemple on appuie sur un bouton, alors pouvez-vous m'aider là-dessus s'il vous plait ? ( j'avais pensé passer par des "a:active" (mais mes démarches n'allaient pas plus loin), ensuite on m'a orienté vers javascript, même ajax car je ne vais pas pouvoir gérer ça en statique ).
Merci de votre aide !
Cdt,
Sébastien.
Marsh Posté le 04-12-2013 à 07:38:50
sous windows on peut utiliser putty en mode raw.
Pour interagir avec ton système, il suffit que tu transmettes l'information depuis ton client vers ton serveur.
Cela peut être par exemple une première page générée par ton serveur contenant les actions possibles à faire , que tu récupères avec ton client sous la forme d'un GET.
Ensuite, cette page générée doit te permettre d'envoyer des nouvelles commandes à ton serveur afin d'interagir avec ton serveur. Soit par d'autres commandes GET ( dans lesquelles tu es en mesure de passer des paramètres ), soit par la commande POST ( qui est une autre commande du protocole HTTP ). Ton serveur recoit ensuite la nouvelle commande ( GET ou POST ) dans laquelle tu as mis des paramètres, tu es en mesure de récupérer ces paramètres coté serveur, et en fonction du paramètre, agir sur ton matériel coté serveur ( vu que tu es maitre du code, ca ne devrait poser aucun problème, ca aurait été plus compliqué si tu devais passer par un serveur existant ).
Marsh Posté le 04-12-2013 à 11:06:16
Il risque d'avoir besoin d'un langage côté serveur genre PHP s'il veut interagir avec le matériel. Là, ça risque de se compliquer car son serveur web va devoir être capable de gérer l'interpréteur php
Marsh Posté le 04-12-2013 à 12:08:30
Non pour moi la Logique REST est plus que suffisante, des messages du type :
Code :
|
Et un petit parsing de l'url peut largement suffire
Après je ne connais pas la spécif totale des UPDATE/POST, mais si on oublie les complexités inutiles (fichiers, etc...) je ne pense pas que ça soit trop compliqué
Cdlt
Marsh Posté le 04-12-2013 à 13:24:34
Effectivement, du REST + un bout de code en C/C++ pourrait suffire si les données à transmettre sont aussi simples.
Edit : tu parles de requête UPDATE, mais ça serait pas plutôt PUT ? J'ai pas trouvé de commande UPDATE sur Wikipedia : http://fr.wikipedia.org/wiki/Http
Marsh Posté le 04-12-2013 à 15:26:45
pardon, effectivement c'est PUT/POST
J'aurai du m’arrêter à la première ligne au lieu d'écrire des c.... sans vérifier
Désolé
Marsh Posté le 05-12-2013 à 16:32:50
Bonjour !
Merci pour tous tous vos conseils/idées !
Je suis parti que sur des GET histoire d'avoir quelque chose de plutôt simple, avec un parsage à chaque fois que je veux allumer/eteindre une LED (genre je passe de "http://IP/ledOn" à "http://IP/ledOff", vu que je n'ai pas encore bien appréhendé tous les concepts de "?", "&", etc... d'ailleurs auriez-vous des documents/liens qui traiteraient de ceux-ci de manière précise s'il vous plait ?
Aussi, et surtout, je n'arrive pas à voir comment gérer des requêtes en parallèles côté serveur, donc si vous pouviez m'éclairer un peu là-dessus s'il vous plait ?
Bien cordialement,
Sébastien.
Marsh Posté le 05-12-2013 à 16:58:31
Ben ? se met à la fin de l'url et annonce des paramètres.
& se trouve dans ce qui suit le ? et sert de délimiteur entre les paramètres passé en GET.
Ex : httpwww.monsite.com/Rep1/MaPage.php?Pa [...] =Value2...
Y'a aussi le # qui peut se trouve à la fin d'une url : c'est pour indiqué une ancre dans une page html.
Marsh Posté le 05-12-2013 à 17:12:54
sebastien_begue a écrit : Aussi, et surtout, je n'arrive pas à voir comment gérer des requêtes en parallèles côté serveur, donc si vous pouviez m'éclairer un peu là-dessus s'il vous plait ? |
Là, ça va dépendre de l'API auquelle tu as accès sur ton architecture embarquée. Si tu as un système Unix sous la main, l'approche classique est de démarrer un nouveau thread (via l'API pthread, donc), lorsque la fonction accept() retourne une connexion valide (>0). C'est tellement classique comme technique, que tout serveur acceptant des connexions TCP, utilise en général ce genre d'approche (pas juste HTTP).
Maintenant, si tu n'as pas de système d'exploitation sur ton archi, autant te dire que ça va être la merde, et va falloir être prêt à aligner les tartines de codes pour concevoir un embryon de système multi-tâche.
Cela dit, si tes requètes ne prennent pas trop de temps, ça ne devrait pas être si handicapant que ça de ne traiter qu'un seule requète à la fois.
Marsh Posté le 06-12-2013 à 15:19:42
Bonjour à tous !
Je n'ai pas de systèmes d'exploitation sur mon embarqué, mais je ne pars plus sur un multitache (trop loin pour coder), mais plutot sur le fait de laisser en buffer les connexions entrantes en attendant que celle qui est en cours finisse.
Aussi, je suis en train d'implémenter un gestionnaire de fichiers (pour la récupération de ceux-ci dans un dossier présent sur l'automate (de mon environnement de travail quoi)) -> j'ai bien les structures associées, mais je n'arrive pas à aller récupérer les fichiers via une fonction C... une idée peut etre ?
Cordialement,
Sébastien.
Marsh Posté le 06-12-2013 à 15:57:54
Les fonctions C concernant les fichiers sont POSIX. Donc, à moins de te cogner le codage de cette "norme", va falloir coder très bas niveau, je pense, genre, te créer ton petit filesystem à toi...
Marsh Posté le 25-11-2013 à 12:40:56
Bonjour à tous !
Je suis actuellement en alternance, et mon 1er projet est de pouvoir établir la communication entre mon ordi et un STM32F2 par liaison ethernet.
Les stacks que j'utilise sont faites maison ; j'ai validé ttes les couches jusqu'à TCP en IPv4, mais là je bloque pour la partie HTTP : je voulais d'abord savoir s'il était bien possible de n'utiliser que du HTML et du C pour réaliser ceux-ci ?
Ensuite, si vous avez des exemples/documents qui traitent de ça s'il vous plait ? Je bloque surtout sur la création de la fonction qui va permettre de transformer une demande de fichier par mon client (navigateur internet) en appel de sous-programme.
Merci beaucoup pour votre aide !
Dans l'attente de vous lire,
Cordialement,
Sébastien.