41eae2a4
vrobic
ajout serveur snt...
|
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
|
/*
* Copyright (C) 2015 Freie Universitรคt Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup examples
* @{
*
* @file
* @brief Example application for demonstrating the RIOT network stack
*
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
*
* @}
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <arpa/inet.h>
#include "../../boards/stm32f4discovery/include/board.h"
#include "../../boards/stm32f4discovery/include/periph_conf.h"
|
5345525d
root
ajout retour serv...
|
30
|
#include "periph/gpio.h"
|
41eae2a4
vrobic
ajout serveur snt...
|
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
|
#include "net/sock/udp.h"
#include "net/gnrc/ipv6.h"
#include "net/af.h"
#include "net/sixlowpan.h"
#include "net/gnrc/pktdump.h"
#include "shell.h"
#include "shell_commands.h"
#include "msg.h"
#include "thread.h"
#include "sched.h"
#include "thread.h"
#include "kernel_types.h"
#include "net/netstats.h"
#include "net/ipv6/addr.h"
#include "periph/timer.h"
#include "net/gnrc/ipv6/netif.h"
#include "net/gnrc/netif.h"
#include "net/gnrc/netapi.h"
#include "net/netopt.h"
#include "net/gnrc/pkt.h"
#include "net/gnrc/pktbuf.h"
#include "net/gnrc/netif/hdr.h"
#include "net/gnrc/sixlowpan/netif.h"
#include "net/fib.h"
#include "net/gnrc/udp.h"
#include "periph/pwm.h"
#include "od.h"
#include "net/sntp.h"
#include "net/ntp_packet.h"
#ifdef MODULE_SCHEDSTATISTICS
#include "xtimer.h"
#endif
#ifdef MODULE_TLSF
#include "tlsf.h"
#endif
#define MAIN_QUEUE_SIZE (8)
/**
* @brief The maximal expected link layer address length in byte
*/
#define MAX_ADDR_LEN (8U)
/**
* @brief The default IPv6 prefix length if not specified.
*/
#define SC_NETIF_IPV6_DEFAULT_PREFIX_LEN (64)
#define _STACKSIZE (THREAD_STACKSIZE_DEFAULT + THREAD_EXTRA_STACKSIZE_PRINTF)
#define MSG_TYPE_ISR (0x3456)
#define PWM_FREQ 100
#define PWM_RES 100
|
5345525d
root
ajout retour serv...
|
84
|
#define DEADLINE 15000
|
41eae2a4
vrobic
ajout serveur snt...
|
85
86
87
88
89
90
|
// addr ipv6 link local node 1: fe80::3734:510e:3317:3402
uint8_t node1[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x34,0x51,0x0e,0x33,0x17,0x34,0x02};
// addr ipv6 link local node 2: fe80::3634:5110:3473:3762
uint8_t node2[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x34,0x51,0x10,0x34,0x73,0x37,0x62};
//addr ipv6 link local node 3: fe80::3634:5110:3471:3766
|
5345525d
root
ajout retour serv...
|
91
|
uint8_t node3[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x34,0x51,0x0b,0x33,0x0a,0x34,0x1e};
|
41eae2a4
vrobic
ajout serveur snt...
|
92
93
94
95
96
97
98
99
100
101
102
103
104
|
//static char _stack_server[GNRC_PKTDUMP_STACKSIZE];
char pwm_stack[THREAD_STACKSIZE_MAIN];
char sock_server_stack[THREAD_STACKSIZE_MAIN];
char sock_client_stack[THREAD_STACKSIZE_MAIN];
char sock_time_server_stack[THREAD_STACKSIZE_MAIN];
// static gnrc_netreg_entry_t server = GNRC_NETREG_ENTRY_INIT_PID(GNRC_NETREG_DEMUX_CTX_ALL,
// KERNEL_PID_UNDEF);
//
// kernel_pid_t gnrc_server_pid = KERNEL_PID_UNDEF;
//
kernel_pid_t server, client, time_server;
int ordre = 0;
|
0f803f1d
root
test application ...
|
105
106
|
int64_t offset = 0;
int timer_run = 0;
|
e873cff7
root
application real-...
|
107
|
int tourne = 0;
|
41eae2a4
vrobic
ajout serveur snt...
|
108
109
110
111
112
113
|
sock_udp_ep_t local = SOCK_IPV6_EP_ANY;
sock_udp_t sock;
sock_udp_ep_t local_ntp = SOCK_IPV6_EP_ANY;
sock_udp_t sock_ntp;
static ntp_packet_t sntp_packet;
|
0f803f1d
root
test application ...
|
114
115
116
117
118
|
typedef struct tableau {
uint32_t heure_actuelle;
char donnees[2];
}Data;
|
41eae2a4
vrobic
ajout serveur snt...
|
119
120
121
122
123
|
void *sock_time_server_thread(void *arg)
{
(void) arg;
local_ntp.port = NTP_PORT;
|
ceb4c7ca
root
changement carte ...
|
124
|
|
41eae2a4
vrobic
ajout serveur snt...
|
125
|
if (sock_udp_create(&sock_ntp, &local_ntp, NULL, 0) < 0) {
|
ceb4c7ca
root
changement carte ...
|
126
127
|
puts("Error creating UDP sock");
return NULL;
|
41eae2a4
vrobic
ajout serveur snt...
|
128
|
}
|
ceb4c7ca
root
changement carte ...
|
129
|
|
41eae2a4
vrobic
ajout serveur snt...
|
130
|
while (1) {
|
ceb4c7ca
root
changement carte ...
|
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
sock_udp_ep_t remote;
ssize_t res;
if ((res = sock_udp_recv(&sock_ntp,&sntp_packet, sizeof(sntp_packet), SOCK_NO_TIMEOUT,
&remote)) >= 0) {
puts("Received a message");
//printf("TT: %lu\n", byteorder_ntohl(sntp_packet.transmit.seconds));
// printf("%c\n",remote.addr.ipv6[15]);
//xtimer_ticks64_t now = xtimer_now64();
// heure actuelle du serveur
sntp_packet.receive.seconds=byteorder_htonl( xtimer_now_usec());
sntp_packet.origin.seconds=sntp_packet.transmit.seconds;
sntp_packet.transmit.seconds=byteorder_htonl( xtimer_now_usec());
//printf("heure actuelle : %lu\n",xtimer_now_usec());
//printf("TT2: %lu\n", byteorder_ntohl(sntp_packet.transmit.seconds));
//memset(&sntp_packet, 0, sizeof(sntp_packet));
//ntp_packet_set_vn(&sntp_packet);
//ntp_packet_set_mode(&sntp_packet, NTP_MODE_SERVER);
if (sock_udp_send(&sock_ntp, &sntp_packet, sizeof(sntp_packet), &remote) < 0) {
puts("Error sending reply");
}
}
|
41eae2a4
vrobic
ajout serveur snt...
|
154
155
156
|
}
return NULL;
}
|
e873cff7
root
application real-...
|
157
|
/*void *pwm_thread(void *arg)
|
41eae2a4
vrobic
ajout serveur snt...
|
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
{
(void) arg;
int tourne = 0;
while(1)
{
if(ordre==1)
{
pwm_set(PWM_DEV(0),1,45);
tourne = 1;
}
else if(ordre==0)
{
pwm_set(PWM_DEV(0),1,0);
tourne = 0;
}
else if(ordre==2 && tourne == 1)
pwm_set(PWM_DEV(0),1,31);
}
return NULL;
|
e873cff7
root
application real-...
|
179
|
}*/
|
41eae2a4
vrobic
ajout serveur snt...
|
180
181
182
|
void *sock_server_thread(void *arg)
{
|
ceb4c7ca
root
changement carte ...
|
183
184
185
186
187
188
189
|
(void) arg;
Data buf;
int compteur = 5;
int deadline;
local.port = 1234;
sock_udp_ep_t server = { .port = NTP_PORT, .family = AF_INET6 };
ipv6_addr_from_str((ipv6_addr_t *)&server.addr, "dead:beef::3402");
|
41eae2a4
vrobic
ajout serveur snt...
|
190
|
|
ceb4c7ca
root
changement carte ...
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
if (sock_udp_create(&sock, &local, NULL, 0) < 0) {
puts("Error creating UDP sock");
return NULL;
}
if (sntp_sync(&server, SOCK_NO_TIMEOUT) < 0) {
puts("Error in synchronization");
return NULL;
}
offset = sntp_get_offset();
printf("offset : %i\n",(int)offset);
while (1) {
sock_udp_ep_t remote;
ssize_t res;
if ((res = sock_udp_recv(&sock, &buf, sizeof(buf), SOCK_NO_TIMEOUT,&remote)) >= 0) {
deadline = xtimer_now_usec() + offset - buf.heure_actuelle;
printf("tps de transmission : %i\n",deadline);
if(buf.donnees[0] == 'g' && buf.donnees[1] == 'o') {
if(deadline >= DEADLINE && compteur >=5) {
compteur = 0;
if(tourne == 1)
pwm_set(PWM_DEV(0),1,31);
if(timer_run == 0) {
|
5345525d
root
ajout retour serv...
|
215
216
217
218
219
220
|
if (sock_udp_send(&sock, "d", sizeof("d"), &remote) < 0) {
puts("Error sending reply");
}
gpio_clear(LED1_PIN);
gpio_clear(LED2_PIN);
gpio_set(LED0_PIN);
|
ceb4c7ca
root
changement carte ...
|
221
222
|
timer_set(TIMER_DEV(1),0,25200);
printf("relance timer\n");
|
5345525d
root
ajout retour serv...
|
223
224
225
226
227
228
|
if (sntp_sync(&server, SOCK_NO_TIMEOUT) < 0) {
puts("Error in synchronization");
return NULL;
}
offset = sntp_get_offset();
printf("offset : %i\n",(int)offset);
|
ceb4c7ca
root
changement carte ...
|
229
230
231
232
233
234
235
236
237
238
239
240
|
timer_run = 1;
}
}
if(deadline >= DEADLINE && compteur < 5) {
compteur = 0;
}
if(deadline<=DEADLINE && compteur >=5) {
pwm_set(PWM_DEV(0),1,45);
tourne = 1;
timer_run=0;
timer_clear(TIMER_DEV(1),0);
printf("clear timer\n");
|
5345525d
root
ajout retour serv...
|
241
242
243
244
245
246
|
if (sock_udp_send(&sock, "n", sizeof("n"), &remote) < 0) {
puts("Error sending reply");
}
gpio_clear(LED2_PIN);
gpio_clear(LED0_PIN);
gpio_set(LED1_PIN);
|
ceb4c7ca
root
changement carte ...
|
247
248
249
250
251
252
|
}
if(deadline<=DEADLINE && compteur <5) {
compteur++;
}
printf("compteur : %d\n",compteur);
memset(&buf,0,sizeof(buf));
|
41eae2a4
vrobic
ajout serveur snt...
|
253
|
}
|
0f803f1d
root
test application ...
|
254
|
}
|
ceb4c7ca
root
changement carte ...
|
255
|
}
|
41eae2a4
vrobic
ajout serveur snt...
|
256
257
258
259
260
|
return NULL;
}
void *sock_client_thread(void *arg)
{
|
ceb4c7ca
root
changement carte ...
|
261
262
|
(void) arg;
Data data;
|
5345525d
root
ajout retour serv...
|
263
264
|
int vitesse=2;
uint8_t buf[3];
|
ceb4c7ca
root
changement carte ...
|
265
266
267
|
data.donnees[0] = 'g';
data.donnees[1] = 'o';
//uint8_t paquet[];
|
5345525d
root
ajout retour serv...
|
268
|
ssize_t res;
|
ceb4c7ca
root
changement carte ...
|
269
270
271
272
273
274
275
276
|
sock_udp_ep_t remote = { .family = AF_INET6 };
remote.port = 1234;
remote.addr.ipv6[0] = 0xde;
remote.addr.ipv6[1] = 0xad;
remote.addr.ipv6[2] = 0xbe;
remote.addr.ipv6[3] = 0xef;
remote.addr.ipv6[14] = 0x34;
|
5345525d
root
ajout retour serv...
|
277
278
|
remote.addr.ipv6[15] = 0x1e;
|
ceb4c7ca
root
changement carte ...
|
279
|
while (1) {
|
ceb4c7ca
root
changement carte ...
|
280
281
|
data.heure_actuelle = xtimer_now_usec();
|
5345525d
root
ajout retour serv...
|
282
|
if (sock_udp_send(&sock, &data, sizeof(data), &remote) < 0) {
|
ceb4c7ca
root
changement carte ...
|
283
284
285
|
puts("Error sending message");
}
puts("Send a message");
|
5345525d
root
ajout retour serv...
|
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
|
if(vitesse==2) {
gpio_clear(LED0_PIN);
gpio_toggle(LED1_PIN);
}
else {
gpio_clear(LED1_PIN);
gpio_toggle(LED0_PIN);
}
if ((res = sock_udp_recv(&sock, buf, sizeof(buf), 0.05 * SEC_IN_USEC,NULL)) < 0) {
if (res == -ETIMEDOUT) {
puts("Timed out");
}
else {
puts("Error receiving message");
}
}
else {
printf("Received message: \"");
for (int i = 0; i < res; i++) {
printf("%c", buf[i]);
}
if(buf[0] == 'n')
vitesse = 2;
else vitesse = 1;
printf("\"\n");
}
xtimer_sleep(vitesse);
|
ceb4c7ca
root
changement carte ...
|
313
314
|
}
return NULL;
|
41eae2a4
vrobic
ajout serveur snt...
|
315
316
317
318
|
}
static void arret_urgence(void *arg,int channel)
{
|
e873cff7
root
application real-...
|
319
320
|
pwm_set(PWM_DEV(0),1,0);
tourne = 0;
|
0f803f1d
root
test application ...
|
321
|
timer_run = 0;
|
5345525d
root
ajout retour serv...
|
322
323
324
|
gpio_clear(LED0_PIN);
gpio_clear(LED1_PIN);
gpio_set(LED2_PIN);
|
41eae2a4
vrobic
ajout serveur snt...
|
325
326
327
|
printf("Arret d'urgence\n");
}
|
0f803f1d
root
test application ...
|
328
|
/*static void degradation(void *arg,int channel)
|
41eae2a4
vrobic
ajout serveur snt...
|
329
330
331
332
333
|
{
ordre=2;
//pwm_set(PWM_DEV(0),1,0);
printf("Ralentissement\n");
timer_set(TIMER_DEV(1),0,25200);
|
0f803f1d
root
test application ...
|
334
|
}*/
|
41eae2a4
vrobic
ajout serveur snt...
|
335
336
337
|
static void _init_timer(void)
{
|
ceb4c7ca
root
changement carte ...
|
338
339
340
341
342
343
|
printf("ok timer\n");
//timer_init(XTIMER_DEV, CLOCK_CORECLOCK/2 ,°radation,NULL);
//timer_set(XTIMER_DEV, 0, 8400);
//timer_irq_enable(XTIMER_DEV);
timer_init(TIMER_DEV(1), CLOCK_CORECLOCK/2 ,&arret_urgence,NULL);
timer_irq_enable(TIMER_DEV(1));
|
41eae2a4
vrobic
ajout serveur snt...
|
344
345
346
347
|
}
static void _init_pwm(void)
{
|
ceb4c7ca
root
changement carte ...
|
348
349
|
pwm_init(PWM_DEV(0), PWM_LEFT, PWM_FREQ, PWM_RES);
pwm_set(PWM_DEV(0),1,0);
|
41eae2a4
vrobic
ajout serveur snt...
|
350
351
|
}
|
41eae2a4
vrobic
ajout serveur snt...
|
352
|
|
ceb4c7ca
root
changement carte ...
|
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
|
static void _init_interface(void)
{
kernel_pid_t ifs[GNRC_NETIF_NUMOF];
ipv6_addr_t addr = IPV6_ADDR_UNSPECIFIED;
ipv6_addr_t tmp_addr= IPV6_ADDR_UNSPECIFIED;
uint8_t hwaddr[MAX_ADDR_LEN];
int res;
gnrc_netif_get(ifs);
//addresses gobales
addr.u8[0] = 0xde;
addr.u8[1] = 0xad;
addr.u8[2] = 0xbe;
addr.u8[3] = 0xef;
res = gnrc_netapi_get(ifs[0], NETOPT_ADDRESS, 0, hwaddr, sizeof(hwaddr));
if (res >= 0) {
addr.u8[14] = *hwaddr;
addr.u8[15] = *(hwaddr+1);
}
memcpy(tmp_addr.u8,addr.u8,IPV6_ADDR_BIT_LEN);
gnrc_ipv6_netif_add_addr(ifs[0], &addr, 64, GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST);
/* model ipv6 addr: dead:beef::Hwaddr */
if((addr.u8[14]==0x34)&&(addr.u8[15]==0x02)){
tmp_addr.u8[14] = 0x34;
|
5345525d
root
ajout retour serv...
|
382
|
tmp_addr.u8[15] = 0x1e;
|
ceb4c7ca
root
changement carte ...
|
383
384
385
386
387
388
389
|
//fibroute dest: dead:beef::3766 via fe80::3634:5110:3473:3762
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
tmp_addr.u8[14] = 0x37;
tmp_addr.u8[15] = 0x62;
//fibroute dest: dead:beef::3762 via fe80::3634:5110:3473:3762
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
client=thread_create(sock_client_stack,sizeof(sock_client_stack),8,THREAD_CREATE_STACKTEST,sock_client_thread,NULL,"sock_client_thread");
|
5345525d
root
ajout retour serv...
|
390
|
//xtimer_usleep(10000);
|
ceb4c7ca
root
changement carte ...
|
391
|
time_server=thread_create(sock_time_server_stack,sizeof(sock_time_server_stack),6,THREAD_CREATE_STACKTEST,sock_time_server_thread,NULL,"sock_time_server_thread");
|
5345525d
root
ajout retour serv...
|
392
|
// xtimer_usleep(200);
|
ceb4c7ca
root
changement carte ...
|
393
394
|
}else if((addr.u8[14]==0x37)&&(addr.u8[15]==0x62)){
tmp_addr.u8[14] = 0x34;
|
5345525d
root
ajout retour serv...
|
395
|
tmp_addr.u8[15] = 0x1e;
|
ceb4c7ca
root
changement carte ...
|
396
397
398
399
400
401
|
//fibroute dest: dead:beef::3766 via fe80::3634:5110:3471:3766
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node3, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
tmp_addr.u8[14] = 0x34;
tmp_addr.u8[15] = 0x02;
//fibroute dest: dead:beef::3402 via fe80::3734:510e:3317:3402
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node1, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
|
5345525d
root
ajout retour serv...
|
402
|
}else if((addr.u8[14]==0x34)&&(addr.u8[15]==0x1e)){
|
ceb4c7ca
root
changement carte ...
|
403
404
405
406
407
408
409
410
411
|
tmp_addr.u8[14] = 0x34;
tmp_addr.u8[15] = 0x02;
//fibroute dest: dead:beef::3402 via fe80::3634:5110:3473:3762
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE); tmp_addr.u8[14] = 0x37;
tmp_addr.u8[14] = 0x37;
tmp_addr.u8[15] = 0x62;
//fibroute dest: dead:beef::3762 via fe80::3634:5110:3473:3762
fib_add_entry(&gnrc_ipv6_fib_table, ifs[0],tmp_addr.u8, IN6ADDRSZ, 0,node2, IN6ADDRSZ, 0, FIB_LIFETIME_NO_EXPIRE);
//start_server("1234");
|
5345525d
root
ajout retour serv...
|
412
413
414
|
_init_timer();
_init_pwm();
server=thread_create(sock_server_stack,sizeof(sock_server_stack),6,THREAD_CREATE_STACKTEST,sock_server_thread,NULL,"sock_server_thread");
|
ceb4c7ca
root
changement carte ...
|
415
416
417
418
419
420
|
}else{
puts("new node ?");
}
}
|
41eae2a4
vrobic
ajout serveur snt...
|
421
|
|
41eae2a4
vrobic
ajout serveur snt...
|
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
|
static msg_t _main_msg_queue[MAIN_QUEUE_SIZE];
extern int udp_cmd(int argc, char **argv);
static const shell_command_t shell_commands[] = {
{ "udp", "send data over UDP and listen on UDP ports", udp_cmd },
{ NULL, NULL, NULL }
};
int main(void)
{
msg_init_queue(_main_msg_queue, MAIN_QUEUE_SIZE);
puts("RIOT network stack example application");
_init_interface();
/* start shell */
puts("All up, running the shell now");
char line_buf[SHELL_DEFAULT_BUFSIZE];
shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
/* should be never reached */
return 0;
}
|