server.c
3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
#include "rs232.h"
int cport_nr=24, /* /dev/ttyACM0 */
bdrate=115200; /* 115200 baud */
char mode[]={'8','N','1',0}; /* Taille du message, parité */
#define MAX_FRAME_SIZE 1024
#define WAIT_DELAY 20
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 *message=NULL;
static int msize=0;
unsigned char buf[4096];
int i;
int n = RS232_PollComport(cport_nr, buf, 4095); // Récupération du message sur la liaison série et stockage dans buf
switch(reason){
case LWS_CALLBACK_ESTABLISHED:
printf("connection established\n");
message=NULL;
libwebsocket_callback_on_writable(this,wsi); // Declenchement d'un prochain envoi au navigateur
break;
case LWS_CALLBACK_RECEIVE:
// Ici sont traites les messages envoyes par le navigateur
printf("received data: %s\n",(char *)in);
RS232_cputs(cport_nr, in);
libwebsocket_callback_on_writable(this,wsi); // Declenchement d'un prochain envoi au navigateur
break;
case LWS_CALLBACK_SERVER_WRITEABLE:
// Ici sont envoyes les messages au navigateur
if(n > 1) // On ne s'occupe que des messages de taille supérieure à 1
{
buf[n] = 0;
for(i=0; i < n; i++)
{
if(buf[i] < 32) // On remplace les caractères qui ne sont pas des chiffres ou des lettres par des points
{
buf[i] = '.';
}
}
printf("received %i bytes: %s\n", n, (char *)buf); // On affiche sur la console les messages en provenance de l'Arduino
unsigned char * tosend = malloc(LWS_SEND_BUFFER_PRE_PADDING + n + LWS_SEND_BUFFER_POST_PADDING);
memcpy(tosend + LWS_SEND_BUFFER_PRE_PADDING, buf, n);
libwebsocket_write(wsi, tosend + LWS_SEND_BUFFER_PRE_PADDING, n, LWS_WRITE_TEXT); // On envoie le message au serveur websocket
free(tosend);
}
libwebsocket_callback_on_writable(this,wsi); // Declenchement d'un prochain envoi au navigateur
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) {
while(RS232_OpenComport(cport_nr, bdrate, mode)) // On attend que le port soit disponible (ou que l'Arduino soit branché)
{
printf("Can not open comport\n");
}
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");
while(1){
libwebsocket_service(context,WAIT_DELAY);
}
libwebsocket_context_destroy(context);
return 0;
}