-
Notifications
You must be signed in to change notification settings - Fork 0
/
er-server-put.c
89 lines (66 loc) · 2.68 KB
/
er-server-put.c
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
/**
* \file
* A very simple Contiki application using CoAP
* \author
* Carlo Vallati <c.vallati@iet.unipi.it>
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "contiki.h"
#include "contiki-net.h"
#include "rest-engine.h"
#define DEBUG 1
#if DEBUG
#define PRINTF(...) printf(__VA_ARGS__)
#define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
#define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]",(lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3],(lladdr)->addr[4], (lladdr)->addr[5])
#else
#define PRINTF(...)
#define PRINT6ADDR(addr)
#define PRINTLLADDR(addr)
#endif
static int value = 10;
void
getputvalue_handler_get(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
char message[20];
int length = 20;
sprintf(message, "Current Value: %03u", value);
memcpy(buffer, message, length);
REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */
REST.set_header_etag(response, (uint8_t *) &length, 1);
REST.set_response_payload(response, buffer, length);
}
void
getputvalue_handler_put(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
int new_value, len;
const char *val = NULL;
len=REST.get_post_variable(request, "value", &val);
if( len > 0 ){
new_value = atoi(val);
PRINTF("new value %u\n", new_value);
value = new_value;
REST.set_response_status(response, REST.status.CREATED);
} else {
REST.set_response_status(response, REST.status.BAD_REQUEST);
}
}
RESOURCE(getputvalue, "title=\"Get/Put value=10\";rt=\"Text\"", getputvalue_handler_get, getputvalue_handler_put, getputvalue_handler_put, NULL);
PROCESS(rest_server_example, "Erbium Example Server");
AUTOSTART_PROCESSES(&rest_server_example);
PROCESS_THREAD(rest_server_example, ev, data)
{
PROCESS_BEGIN();
PRINTF("Starting Erbium Example Server\n");
/* Initialize the REST engine. */
rest_init_engine();
/* Activate the application-specific resources. */
rest_activate_resource(&getputvalue, "value");
/* Define application-specific events here. */
while(1) {
PROCESS_WAIT_EVENT();
} /* while (1) */
PROCESS_END();
}