Outils pour utilisateurs

Outils du site


serveur_websocket

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
serveur_websocket [2019/06/20 13:10] – [Installation de LibWebSockets] Mushussuserveur_websocket [2020/07/22 14:19] (Version actuelle) Mushussu
Ligne 1: Ligne 1:
-====== Petit serveur avec LibWebSockets ======+====== 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]]. 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 certaine partie du code sont erronées et la version de la librairie n'est plus compatible avec la version récente de LibWebSocket.+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. Voici donc une réactualisation du tutoriel.
  
 Matériel : Matériel :
-  * Liste à puceRaspberry 3 modèle B++  * Raspberry 3 modèle B+
   * Carte SD 16 Go   * Carte SD 16 Go
  
Ligne 26: Ligne 26:
   sudo apt-get install git-core   sudo apt-get install git-core
   sudo apt-get install libssl-dev   sudo apt-get install libssl-dev
 +  sudo apt-get install zlib1g-dev
      
-=== LibWebWsockets ===+=== 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   git clone https://github.com/warmcat/libwebsockets
   cd libwebsockets   cd libwebsockets
 +  git checkout v3.2-stable
   mkdir build   mkdir build
   cd build   cd build
-  cmake .. -DLWS_IPV6=OFF+  cmake .. -DLWS_IPV6=OFF -DLWS_MAX_SMP=8 -DLWS_WITHOUT_EXTENSIONS=OFF
   make   make
   sudo make install   sudo make install
   cd   cd
 +  sudo ldconfig
 Pour verifier que tout fonctionne bien  Pour verifier que tout fonctionne bien 
   libwebsockets-test-server   libwebsockets-test-server
 Taper dans votre navigateur préféré : Taper dans votre navigateur préféré :
-  http://serveurwebsocket:7681/+  http://127.0.0.1:7681/
 Si le compteur démarre, alors la librairie est bien installée. Si le compteur démarre, alors la librairie est bien installée.
  
 +Voici le code mis à jour :
 +
 +<code c>
 +// gcc -Wall testServeur.c -o testServeur -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;
 +}
 +
 +</code>
 +
 +Compilation :
 +  gcc -Wall testServeur.c -o testServeur -lwebsockets
 +Execution :
 +  ./testServeur
 +  
 +Créer le fichier index.html avec le contenu suivant :
 +<code html>
 +<!DOCTYPE html>
 +<html>
 +<head>
 +<meta charset="utf-8">
 +<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js">
 +</script>
 +<script type="text/javascript">
 +$(function() {
 +    window.WebSocket = window.WebSocket || window.MozWebSocket;
 +    var websocket = new WebSocket(
 +        'ws://127.0.0.1:9000', 'http-only');
 +    websocket.onopen = function () {
 +        $('h1').css('color', 'green');
 +    };
 +    websocket.onerror = function () {
 +        $('h1').css('color', 'red');
 +    };
 +    websocket.onmessage = function (message) {
 +        console.log(message.data);
 +        $('div').append($('<p>', { text: message.data }));
 +    };
 +    $('button').click(function(e) {
 +        e.preventDefault();
 +        websocket.send($('input').val());
 +        $('input').val('');
 +    });
 +});
 +</script>
 +</head>
 +<body>
 +<h1>WebSockets test</h1>
 +<form>
 +<input type="text" />
 +<button>Send</button>
 +</form>
 +<div></div>
 +</body>
 +</html>
 +</code>
 +
 +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}}
serveur_websocket.1561036234.txt.gz · Dernière modification : 2019/06/20 13:10 de Mushussu