====== Serveur Websocket ====== Un tutoriel permettant de débuter avec la librairie LibWebSocket a été rédigé en anglais à cette [[https://medium.com/@martin.sikora/libwebsockets-simple-websocket-server-68195343d64b|page]]. Il paraissait répondre aux attentes des débutants, mais certaines parties 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 : * Raspberry 3 modèle B+ * Carte SD 16 Go ==== Installation de LibWebSockets ==== === Configuration === 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 choisisse votre région puis la ville de référence et valider Aller sur Finish puis yes pour redémarrer. === Installation des librairies complémentaires === sudo apt-get install cmake sudo apt-get install git-core sudo apt-get install libssl-dev sudo apt-get install zlib1g-dev === LibWebsockets === Ce tutoriel fonctionne avec la version 3.2 de LibWebSocket, voici donc la procédure pour l'installer : git clone https://github.com/warmcat/libwebsockets cd libwebsockets git checkout v3.2-stable mkdir build cd build cmake .. -DLWS_IPV6=OFF -DLWS_MAX_SMP=8 -DLWS_WITHOUT_EXTENSIONS=OFF make sudo make install cd sudo ldconfig Pour verifier que tout fonctionne bien libwebsockets-test-server Taper dans votre navigateur préféré : http://127.0.0.1:7681/ Si le compteur démarre, alors la librairie est bien installée. Voici le code mis à jour : // gcc -Wall testServeur.c -o testServeur -lwebsockets #include #include #include 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; } Compilation : gcc -Wall testServeur.c -o testServeur -lwebsockets Execution : ./testServeur Créer le fichier index.html avec le contenu suivant :

WebSockets test

L'ouvrir dans votre navigateur préféré. WebSockets test doit être inscrit en vert ce qui signifie que la connection WebSocket fonctionne bien. Amusez-vous ! {{tag>raspberry_pi serveur sylvain}}