Ceci est une ancienne révision du document !
Table des matières
Petit serveur avec LibWebSockets
Un tutoriel permettant de débuter avec la librairie LibWebSocket a été rédigé en anglais à cette page.
Il paraissait répondre aux attentes des débutants, mais certaine partie du code sont erronées et la version de la librairie n'est plus compatible avec la version récente de LibWebSocket.
Voici donc une réactualisation du tutoriel.
Matériel :
- Liste à puceRaspberry 3 modèle B+
- Carte SD 16 Go
Installation de LibWebSockets
Installer la version Raspbian Stretch Lite 2019-04-08
En configuration supplémentaire, changer le nom en serveurwebsocket
sudo raspi-config
Aller dans - 2 Network Options - puis - N1 Hostname - puis changer le nom en : serveurwebsocket Valider, puis aller dans - 4 Localisation Options - puis dans - I2 Change Timezone - et choisissez votre région puis la ville de référence et valider
Aller sur Finish puis yes pour redémarrer.
sudo apt-get install cmake sudo apt-get install git-core sudo apt-get install libssl-dev git clone https://github.com/warmcat/libwebsockets cd libwebsockets mkdir build cd build cmake .. -DLWS_IPV6=OFF make sudo make install cd
Pour verifier que tout fonctionne bien
libwebsockets-test-server
Taper dans votre navigateur préféré :
http://serveurwebsocket:7681/
Si le compteur démarre, alors la librairie est bien installée.
Serveur Minitel
sudo nano serveurWebsocket.c
Copier le code ci-dessous :
// gcc -Wall serveurWebsocket.c -o serveurWebsocket -lwebsockets #include <stdio.h> #include <stdlib.h> #include <libwebsockets.h> static int lws_callback_http( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len ) { switch (reason) { case LWS_CALLBACK_ESTABLISHED: printf("connection established\n"); break; case LWS_CALLBACK_RECEIVE: { unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING); int i; for (i=0; i < len; i++) { buf[LWS_SEND_BUFFER_PRE_PADDING + (len - 1) - i ] = ((char *) in)[i]; } printf("received data: %s, replying: %.*s\n", (char *) in, (int) len, buf + LWS_SEND_BUFFER_PRE_PADDING); lws_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], len, LWS_WRITE_TEXT); free(buf); break; } default: break; } return 0; } static struct lws_protocols protocols[] = { { "http-only", // name lws_callback_http, // callback 0 // per_session_data_size }, { NULL, NULL, 0 /* End of list */ } }; static const struct lws_extension exts[] = { { "permessage-deflate", lws_extension_callback_pm_deflate, "permessage-deflate" }, { NULL, NULL, NULL /* terminator */ } }; int main(void) { int port = 9000; const char *interface = NULL; struct lws_context *context; int opts = 0; // create libwebsocket context representing this server struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = port; info.iface = interface; info.protocols = protocols; info.extensions = exts; //if (!use_ssl) { info.ssl_cert_filepath = NULL; info.ssl_private_key_filepath = NULL; //} else { // info.ssl_cert_filepath = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.pem"; // info.ssl_private_key_filepath = LOCAL_RESOURCE_PATH"/libwebsockets-test-server.key.pem"; //} info.gid = -1; info.uid = -1; info.options = opts; context = lws_create_context(&info); if (context == NULL) { fprintf(stderr, "libwebsocket init failed\n"); return -1; } printf("starting server...\n"); while (1) { lws_service(context, 50); } lws_context_destroy(context); return 0; }
Ctrl + o pour enregistrer et Ctrl + x pour sortir de nano
Compiler le tout :
gcc -Wall serveurWebsocket.c -o serveurWebsocket -lwebsockets
sudo ldconfig ./serveurWebsocket