websocket.c 2.66 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>

#include "serial.h"


#define         SERIAL_DEVICE           "/dev/ttyACM0"
#include <libwebsockets.h>

#define MAX_FRAME_SIZE  1024
#define WAIT_DELAY      50

int sd;

//balek de ça
static int callback_http(struct libwebsocket_context *this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len)
{
	return 0;
}

//le plus important est ici
static int callback_my(struct libwebsocket_context * this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len)
{

	static char *message=NULL;
	static int msize=0;
	

	
	switch(reason)
	{
		case LWS_CALLBACK_ESTABLISHED: /
			printf("connection established\n");
			message=NULL;
			
			libwebsocket_callback_on_writable(this,wsi);
		break;
		case LWS_CALLBACK_RECEIVE: 
			
			printf("received data: %s\n",(char *)in);
			
			message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);

			if(message==NULL)
			{ 
				perror("callback_my.malloc"); exit(EXIT_FAILURE); 
			}
			e + le début du buffer d'envoi "LWS_SEND_BUFFER_PRE_PADDING"
			memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len);
		
			msize=len;
			// on envoie a l'arduiono la valeur envoyé  par le  site web  
			write(sd,message,(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING));
			libwebsocket_callback_on_writable(this,wsi);
		break;
		case LWS_CALLBACK_SERVER_WRITEABLE: 
			
			if(message!=NULL)
			{	
		
				read(sd,message,len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING);
				
				char *out=message+LWS_SEND_BUFFER_PRE_PADDING;
				
				
				libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT);
			
				free(message);
				message=NULL;
			}
		break;
		default:
		break;
	}
	return 0;
}

static struct libwebsocket_protocols protocols[] = {
	{
		"http-only",   // name
		callback_http, // callback
		0,             // data size
		0              // maximum frame size
	},
	{"myprotocol",callback_my,0,MAX_FRAME_SIZE},
	{NULL,NULL,0,0}
	};



int main(void) 
{
	int port=9000;
	struct lws_context_creation_info info;
	memset(&info,0,sizeof info);
	info.port=port;
	info.protocols=protocols;
	info.gid=-1;
	info.uid=-1;
	struct libwebsocket_context *context=libwebsocket_create_context(&info);
	
	// communication port série  arduino 
	int c=0;	
	sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH);	
	serialConfig(sd,B9600);	
	
	if(context==NULL)
	{
	  fprintf(stderr, "libwebsocket init failed\n");
	  return -1;
	}
	printf("starting server...\n");
	
	while(1)
	{
	  libwebsocket_service(context,WAIT_DELAY);
	}
	libwebsocket_context_destroy(context);
	return 0;
}