/* * Test on serial device */ //// // Include files //// #include #include #include #include #include #include #include "serial.h" #define MAX_FRAME_SIZE 1024 #define WAIT_DELAY 50 #define SERIAL_DEVICE "/dev/ttyUSB0" //utiliser USB0 pour le shield Xbee branché en USB /*****************************************************************************/ /**********************PARTIE WEBSOCKETS + COM SERIE**************************/ /*****************************************************************************/ //Fonction qui retourne un tableau de char, chaque char correspondant à une donnée d'un capteur char * getDataFromSensors(char *request,int sizeOfRequest,int sd) { int i; //la réponse est récupérée sous un type charactère non signé. Il est possible de la stocker dans un charactère signé, mais la valeur affichée par un printf sera différente unsigned char *reponse = NULL; reponse = malloc(4*sizeof(unsigned char)); //On envoie le GET au FPGA pour récupérer les données for(i = 0; i < sizeOfRequest;i++) { if(write(sd,(void*)&request[i],sizeof(char))!=1) { perror("main.write"); exit(-1); } } printf("\nReponse : "); //NE PAS OUBLIER DE LIBERER LA MEMOIRE EN DEHORS DE LA FONCTION for(i=0;i < 4;i++) { //on lit ce que nous envoie l'arduino à la suite de la requete GET if(read(sd,(void*)&reponse[i],sizeof(unsigned char))!=1) { perror("main.read"); exit(-1); } } printf("\nTemperature (C) : %d",reponse[1]); printf("\nPression (hPa) : %d",reponse[0]+845); printf("\nHumidite (pourcents) : %d",reponse[2]); printf("\nLuminosité : %d\n",reponse[3]); return reponse; } 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; } 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 *requete = NULL; static char *reponse = NULL; //Initialisation com Serie int sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH); serialConfig(sd,B9600); switch(reason) { case LWS_CALLBACK_ESTABLISHED: printf("connection established\n"); requete=NULL; // Declenchement d'un prochain envoi au navigateur libwebsocket_callback_on_writable(this,wsi); break; case LWS_CALLBACK_RECEIVE: // Ici sont traites les messages envoyes par le navigateur printf("received data: %s\n",(char *)in); requete=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING); if(requete==NULL) { perror("callback_my.malloc"); exit(EXIT_FAILURE); } memcpy(requete,in,len); // Declenchement d'un prochain envoi au navigateur libwebsocket_callback_on_writable(this,wsi); break; case LWS_CALLBACK_SERVER_WRITEABLE: // Ici sont envoyes les messages au navigateur //Si la requete a pour valeur GET, on envoie les donnée au site if(requete!= NULL) { if(requete[0] == 'G' && requete[1] == 'E' && requete[2] == 'T') { reponse = getDataFromSensors(requete,3,sd); int length = 4; unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + length + LWS_SEND_BUFFER_POST_PADDING); memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, reponse, length ); libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, length, LWS_WRITE_BINARY); //LWS_WRITE_TEXT free(reponse); free(requete); requete = NULL; reponse = NULL; } } break; default: break; } serialClose(sd); 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} }; /*****************************************************************/ /**********************MAIN***************************************/ /*****************************************************************/ int main(void){ char j; int i; unsigned long count = 0; //Initialisation WebSockets 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); if(context==NULL) { fprintf(stderr, "libwebsocket init failed\n"); return -1; } printf("starting server...\n"); //boucle infinie du main while(1) { libwebsocket_service(context,WAIT_DELAY); } libwebsocket_context_destroy(context); return 0; } //********************************************************************************//