Added a coap client and running coap-client-server COOJA simulation. Made README more detailed.
This commit is contained in:
parent
24a5dafcd3
commit
c4f5ebcaaa
|
@ -7,7 +7,7 @@ CONTIKI=../..
|
||||||
WITH_UIP6=1
|
WITH_UIP6=1
|
||||||
UIP_CONF_IPV6=1
|
UIP_CONF_IPV6=1
|
||||||
|
|
||||||
#WITH_COAP = 1
|
WITH_COAP = 1
|
||||||
|
|
||||||
CFLAGS += -DPROJECT_CONF_H=1
|
CFLAGS += -DPROJECT_CONF_H=1
|
||||||
|
|
||||||
|
|
|
@ -1,25 +1,51 @@
|
||||||
COOJA RUN:
|
Open a terminal and go to "examples/rest-example/" directory.
|
||||||
|
|
||||||
Open a terminal and go to "rest" directory.
|
MAIN EXAMPLE:
|
||||||
In rest/Makefile, define WITH_COAP = 1 if you want to use COAP, rather than HTTP.
|
rest-server-example.c : A RESTful server example showing how to use the REST layer to develop server-side applications (possible to run it over either COAP or HTTP)
|
||||||
Issue following command to load and compile Rest api with COOJA.
|
To use COAP as the underlying application protocol, one should define WITH_COAP = 1 in rest-example/Makefile. Otherwise, HTTP is used.
|
||||||
>make rest-example-no-rpl.csc TARGET=cooja
|
Look at the source code to see which resources are available. (check the RESOURCE macros in the code).
|
||||||
|
|
||||||
In another terminal, issue the following command
|
|
||||||
|
To run REST examples in COOJA under Linux
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
Accessing the server from outside:
|
||||||
|
Start COOJA and load the simulation "rest-server-example.csc" by the following command.
|
||||||
|
> make TARGET=cooja rest-server-example.csc
|
||||||
|
After loading the cooja file, in another terminal connect to the COOJA simulation using tunslip6:
|
||||||
>make connect-router-cooja
|
>make connect-router-cooja
|
||||||
|
Now you need to use a COAP or HTTP client to interact with the COOJA nodes running REST code.
|
||||||
There are 2 nodes running the Rest code in COOJA (node 2 and 6). Their IP addresses are aaaa::0212:7402:0002:0202 and aaaa::0212:7406:0006:0606 respectively.
|
In this setting, two servers are available:
|
||||||
|
IP addresses are aaaa::0212:7402:0002:0202 and aaaa::0212:7403:0003:0303. COAP uses 61616, whereas HTTP uses 8080 port.
|
||||||
TEST:
|
|
||||||
Please check the rest/rest-example.c source code to see which resources are available. (check the RESOURCE macros in the code).
|
|
||||||
|
|
||||||
|
|
||||||
HTTP Examples
|
HTTP Examples
|
||||||
You can use curl as an http client to interact with the COOJA motes running REST code.
|
You can use curl as an http client to interact with the COOJA motes running REST code.
|
||||||
curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/helloworld #get helloworld plain text
|
>curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/helloworld #get helloworld plain text
|
||||||
curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/led?color=green -d mode=off -i #turn off the green led
|
>curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/led?color=green -d mode=off -i #turn off the green led
|
||||||
curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/.well-known/core -i
|
>curl -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/.well-known/core -i
|
||||||
curl -X POST -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/helloworld #method not allowed
|
>curl -X POST -H "User-Agent: curl" aaaa::0212:7402:0002:0202:8080/helloworld #method not allowed
|
||||||
|
|
||||||
COAP Examples:
|
|
||||||
You need a COAP client to be able to to interact with the COOJA motes running REST code. URIs are same with the HTTP examples.
|
Accessing the server inside the sensor network:
|
||||||
|
(Note: Provided only for COAP implementation)
|
||||||
|
Start COOJA and load the simulation "coap-client-server-example.csc" by the following command.
|
||||||
|
> make TARGET=cooja coap-client-server-example.csc
|
||||||
|
coap-client-server-example.csc : Runs rest-server-example as the server (over COAP) (IP:aaaa::0212:7401:0001:0101) in one node and coap-client-example as the client (IP: aaaa::0212:7402:0002:0202) in another node.
|
||||||
|
Client periodically accesses resources of server and prints the payload.
|
||||||
|
|
||||||
|
|
||||||
|
To run REST server on real nodes under Linux
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
1. Program the nodes with the rest-server-example
|
||||||
|
> make TARGET=sky rest-server-example.upload
|
||||||
|
|
||||||
|
2. Disconnect the nodes and program one node with the RPL border router
|
||||||
|
> (cd ../ipv6/rpl-border-router && make TARGET=sky border-router.upload)
|
||||||
|
|
||||||
|
3. Connect to the border router using tunslip6:
|
||||||
|
> make connect-router
|
||||||
|
|
||||||
|
4. Reconnect the motes, reboot them and note their IP addresses.
|
||||||
|
|
||||||
|
5. Remaining parts are the same with the COOJA example. (i.e. if it is a COAP Server, it is available at <NODE_IP_ADDR>:61616)
|
||||||
|
|
122
examples/rest-example/coap-client-example.c
Normal file
122
examples/rest-example/coap-client-example.c
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "rest.h"
|
||||||
|
#include "buffer.h"
|
||||||
|
|
||||||
|
#define DEBUG 1
|
||||||
|
#if DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#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 ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_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
|
||||||
|
|
||||||
|
#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0212, 0x7401, 0x0001, 0x0101)
|
||||||
|
#define LOCAL_PORT 61617
|
||||||
|
#define REMOTE_PORT 61616
|
||||||
|
|
||||||
|
char temp[100];
|
||||||
|
int xact_id;
|
||||||
|
static uip_ipaddr_t server_ipaddr;
|
||||||
|
static struct uip_udp_conn *client_conn;
|
||||||
|
static struct etimer et;
|
||||||
|
#define MAX_PAYLOAD_LEN 100
|
||||||
|
|
||||||
|
#define NUMBER_OF_URLS 3
|
||||||
|
char* service_urls[NUMBER_OF_URLS] = {"light", ".well-known/core", "helloworld"};
|
||||||
|
|
||||||
|
static void
|
||||||
|
response_handler(coap_packet_t* response)
|
||||||
|
{
|
||||||
|
uint16_t payload_len = 0;
|
||||||
|
uint8_t* payload = NULL;
|
||||||
|
payload_len = coap_get_payload(response, &payload);
|
||||||
|
|
||||||
|
PRINTF("Response transaction id: %u", response->tid);
|
||||||
|
if (payload) {
|
||||||
|
memcpy(temp, payload, payload_len);
|
||||||
|
temp[payload_len] = 0;
|
||||||
|
PRINTF(" payload: %s\n", temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_data(void)
|
||||||
|
{
|
||||||
|
char buf[MAX_PAYLOAD_LEN];
|
||||||
|
|
||||||
|
if (init_buffer(COAP_DATA_BUFF_SIZE)) {
|
||||||
|
int data_size = 0;
|
||||||
|
int service_id = random_rand() % NUMBER_OF_URLS;
|
||||||
|
coap_packet_t* request = (coap_packet_t*)allocate_buffer(sizeof(coap_packet_t));
|
||||||
|
init_packet(request);
|
||||||
|
|
||||||
|
coap_set_method(request, COAP_GET);
|
||||||
|
request->tid = xact_id++;
|
||||||
|
request->type = MESSAGE_TYPE_CON;
|
||||||
|
coap_set_header_uri(request, service_urls[service_id]);
|
||||||
|
|
||||||
|
data_size = serialize_packet(request, buf);
|
||||||
|
|
||||||
|
PRINTF("Client sending request to:[");
|
||||||
|
PRINT6ADDR(&client_conn->ripaddr);
|
||||||
|
PRINTF("]:%u/%s\n", (uint16_t)REMOTE_PORT, service_urls[service_id]);
|
||||||
|
uip_udp_packet_send(client_conn, buf, data_size);
|
||||||
|
|
||||||
|
delete_buffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_incoming_data()
|
||||||
|
{
|
||||||
|
PRINTF("Incoming packet size: %u \n", (u16_t)uip_datalen());
|
||||||
|
if (init_buffer(COAP_DATA_BUFF_SIZE)) {
|
||||||
|
if (uip_newdata()) {
|
||||||
|
coap_packet_t* response = (coap_packet_t*)allocate_buffer(sizeof(coap_packet_t));
|
||||||
|
parse_message(response, uip_appdata, uip_datalen());
|
||||||
|
if (response) {
|
||||||
|
response_handler(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete_buffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS(coap_client_example, "COAP Client Example");
|
||||||
|
AUTOSTART_PROCESSES(&coap_client_example);
|
||||||
|
|
||||||
|
PROCESS_THREAD(coap_client_example, ev, data)
|
||||||
|
{
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
SERVER_NODE(&server_ipaddr);
|
||||||
|
|
||||||
|
/* new connection with server */
|
||||||
|
client_conn = udp_new(&server_ipaddr, UIP_HTONS(REMOTE_PORT), NULL);
|
||||||
|
udp_bind(client_conn, UIP_HTONS(LOCAL_PORT));
|
||||||
|
|
||||||
|
PRINTF("Created a connection with the server ");
|
||||||
|
PRINT6ADDR(&client_conn->ripaddr);
|
||||||
|
PRINTF(" local/remote port %u/%u\n",
|
||||||
|
UIP_HTONS(client_conn->lport), UIP_HTONS(client_conn->rport));
|
||||||
|
|
||||||
|
etimer_set(&et, 5 * CLOCK_SECOND);
|
||||||
|
while(1) {
|
||||||
|
PROCESS_YIELD();
|
||||||
|
if (etimer_expired(&et)) {
|
||||||
|
send_data();
|
||||||
|
etimer_reset(&et);
|
||||||
|
} else if (ev == tcpip_event) {
|
||||||
|
handle_incoming_data();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
147
examples/rest-example/coap-client-server-example.csc
Normal file
147
examples/rest-example/coap-client-server-example.csc
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mrm</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mspsim</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/avrora</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/serial_socket</project>
|
||||||
|
<simulation>
|
||||||
|
<title>coap-client-server-example</title>
|
||||||
|
<delaytime>-2147483648</delaytime>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
se.sics.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>100.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>sky1</identifier>
|
||||||
|
<description>CoapServer</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/rest-example/rest-server-example.c</source>
|
||||||
|
<commands EXPORT="discard">make rest-server-example.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/rest-example/rest-server-example.sky</firmware>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>sky2</identifier>
|
||||||
|
<description>CoapClient</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/rest-example/coap-client-example.c</source>
|
||||||
|
<commands EXPORT="discard">make coap-client-example.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/rest-example/coap-client-example.sky</firmware>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>54.5338749671737</x>
|
||||||
|
<y>36.41934631024719</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>sky1</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>49.41583327244326</x>
|
||||||
|
<y>52.00647916206431</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>sky2</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.SimControl
|
||||||
|
<width>318</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>172</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AddressVisualizerSkin</skin>
|
||||||
|
<viewport>3.686023978928717 0.0 0.0 3.686023978928717 -20.14794638096936 -127.69712925102564</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>271</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>211</height>
|
||||||
|
<location_x>666</location_x>
|
||||||
|
<location_y>41</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
</plugin_config>
|
||||||
|
<width>1263</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>199</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>339</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.TimeLine
|
||||||
|
<plugin_config>
|
||||||
|
<mote>0</mote>
|
||||||
|
<mote>1</mote>
|
||||||
|
<showRadioRXTX />
|
||||||
|
<showRadioHW />
|
||||||
|
<showLEDs />
|
||||||
|
<split>125</split>
|
||||||
|
<zoomfactor>500.0</zoomfactor>
|
||||||
|
</plugin_config>
|
||||||
|
<width>1263</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>150</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>538</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
161
examples/rest-example/rest-server-example.c
Normal file
161
examples/rest-example/rest-server-example.c
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "rest.h"
|
||||||
|
|
||||||
|
#include "dev/light-sensor.h"
|
||||||
|
#include "dev/battery-sensor.h"
|
||||||
|
#include "dev/sht11-sensor.h"
|
||||||
|
#include "dev/leds.h"
|
||||||
|
|
||||||
|
#define DEBUG 1
|
||||||
|
#if DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#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 ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_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
|
||||||
|
|
||||||
|
char temp[100];
|
||||||
|
|
||||||
|
/* Resources are defined by RESOURCE macro, signature: resource name, the http methods it handles and its url*/
|
||||||
|
RESOURCE(helloworld, METHOD_GET, "helloworld");
|
||||||
|
|
||||||
|
/* For each resource defined, there corresponds an handler method which should be defined too.
|
||||||
|
* Name of the handler method should be [resource name]_handler
|
||||||
|
* */
|
||||||
|
void
|
||||||
|
helloworld_handler(REQUEST* request, RESPONSE* response)
|
||||||
|
{
|
||||||
|
sprintf(temp,"Hello World!\n");
|
||||||
|
|
||||||
|
rest_set_header_content_type(response, TEXT_PLAIN);
|
||||||
|
rest_set_response_payload(response, temp, strlen(temp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
|
||||||
|
RESOURCE(led, METHOD_POST | METHOD_PUT , "led");
|
||||||
|
|
||||||
|
void
|
||||||
|
led_handler(REQUEST* request, RESPONSE* response)
|
||||||
|
{
|
||||||
|
char color[10];
|
||||||
|
char mode[10];
|
||||||
|
uint8_t led = 0;
|
||||||
|
int success = 1;
|
||||||
|
|
||||||
|
if (rest_get_query_variable(request, "color", color, 10)) {
|
||||||
|
PRINTF("color %s\n", color);
|
||||||
|
|
||||||
|
if (!strcmp(color,"red")) {
|
||||||
|
led = LEDS_RED;
|
||||||
|
} else if(!strcmp(color,"green")) {
|
||||||
|
led = LEDS_GREEN;
|
||||||
|
} else if ( !strcmp(color,"blue") ) {
|
||||||
|
led = LEDS_BLUE;
|
||||||
|
} else {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success && rest_get_post_variable(request, "mode", mode, 10)) {
|
||||||
|
PRINTF("mode %s\n", mode);
|
||||||
|
|
||||||
|
if (!strcmp(mode, "on")) {
|
||||||
|
leds_on(led);
|
||||||
|
} else if (!strcmp(mode, "off")) {
|
||||||
|
leds_off(led);
|
||||||
|
} else {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
success = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
rest_set_response_status(response, BAD_REQUEST_400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t light_photosynthetic;
|
||||||
|
uint16_t light_solar;
|
||||||
|
|
||||||
|
void
|
||||||
|
read_light_sensor(uint16_t* light_1, uint16_t* light_2)
|
||||||
|
{
|
||||||
|
*light_1 = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC);
|
||||||
|
*light_2 = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*A simple getter example. Returns the reading from light sensor with a simple etag*/
|
||||||
|
RESOURCE(light, METHOD_GET, "light");
|
||||||
|
void
|
||||||
|
light_handler(REQUEST* request, RESPONSE* response)
|
||||||
|
{
|
||||||
|
#ifdef CONTIKI_TARGET_SKY
|
||||||
|
read_light_sensor(&light_photosynthetic, &light_solar);
|
||||||
|
sprintf(temp,"%u;%u", light_photosynthetic, light_solar);
|
||||||
|
#else /*CONTIKI_TARGET_SKY*/
|
||||||
|
sprintf(temp,"%d.%d", 0, 0);
|
||||||
|
#endif /*CONTIKI_TARGET_SKY*/
|
||||||
|
|
||||||
|
char etag[4] = "ABCD";
|
||||||
|
rest_set_header_content_type(response, TEXT_PLAIN);
|
||||||
|
rest_set_header_etag(response, etag, sizeof(etag));
|
||||||
|
rest_set_response_payload(response, temp, strlen(temp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*A simple actuator example. Toggles the red led*/
|
||||||
|
RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "toggle");
|
||||||
|
void
|
||||||
|
toggle_handler(REQUEST* request, RESPONSE* response)
|
||||||
|
{
|
||||||
|
leds_toggle(LEDS_RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
RESOURCE(discover, METHOD_GET, ".well-known/core");
|
||||||
|
void
|
||||||
|
discover_handler(REQUEST* request, RESPONSE* response)
|
||||||
|
{
|
||||||
|
char temp[100];
|
||||||
|
int index = 0;
|
||||||
|
index += sprintf(temp + index, "%s\n", "<helloworld>;n=\"HelloWorld\"");
|
||||||
|
index += sprintf(temp + index, "%s\n", "<led>;n=\"LedControl\"");
|
||||||
|
index += sprintf(temp + index, "%s\n", "<light>;n=\"Light\"");
|
||||||
|
|
||||||
|
rest_set_response_payload(response, temp, strlen(temp));
|
||||||
|
rest_set_header_content_type(response, APPLICATION_LINK_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS(rest_server_example, "Rest Server Example");
|
||||||
|
AUTOSTART_PROCESSES(&rest_server_example);
|
||||||
|
|
||||||
|
PROCESS_THREAD(rest_server_example, ev, data)
|
||||||
|
{
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
#ifdef WITH_COAP
|
||||||
|
PRINTF("COAP Server\n");
|
||||||
|
#else
|
||||||
|
PRINTF("HTTP Server\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SENSORS_ACTIVATE(light_sensor);
|
||||||
|
|
||||||
|
rest_init();
|
||||||
|
|
||||||
|
rest_activate_resource(&resource_helloworld);
|
||||||
|
rest_activate_resource(&resource_led);
|
||||||
|
rest_activate_resource(&resource_light);
|
||||||
|
rest_activate_resource(&resource_toggle);
|
||||||
|
rest_activate_resource(&resource_discover);
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
185
examples/rest-example/rest-server-example.csc
Normal file
185
examples/rest-example/rest-server-example.csc
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<simconf>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mrm</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mspsim</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/avrora</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/serial_socket</project>
|
||||||
|
<simulation>
|
||||||
|
<title>REST with RPL router</title>
|
||||||
|
<delaytime>-2147483648</delaytime>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
se.sics.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.0</interference_range>
|
||||||
|
<success_ratio_tx>1.0</success_ratio_tx>
|
||||||
|
<success_ratio_rx>1.0</success_ratio_rx>
|
||||||
|
</radiomedium>
|
||||||
|
<events>
|
||||||
|
<logoutput>40000</logoutput>
|
||||||
|
</events>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>rplroot</identifier>
|
||||||
|
<description>Sky RPL Root</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c</source>
|
||||||
|
<commands EXPORT="discard">make border-router.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky</firmware>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>skyweb</identifier>
|
||||||
|
<description>Rest</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/rest-example/rest-server-example.c</source>
|
||||||
|
<commands EXPORT="discard">make rest-server-example.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/rest-example/rest-server-example.sky</firmware>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>33.260163187353555</x>
|
||||||
|
<y>30.643217359962595</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>rplroot</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>62.239287566073514</x>
|
||||||
|
<y>34.43810269527116</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>skyweb</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>47.68359039801751</x>
|
||||||
|
<y>47.26544238238854</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>skyweb</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.SimControl
|
||||||
|
<width>259</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>179</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AttributeVisualizerSkin</skin>
|
||||||
|
<viewport>10.505309204322225 0.0 0.0 10.505309204322225 -249.89475921566975 -141.01191150973983</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>819</width>
|
||||||
|
<z>5</z>
|
||||||
|
<height>563</height>
|
||||||
|
<location_x>35</location_x>
|
||||||
|
<location_y>306</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
</plugin_config>
|
||||||
|
<width>762</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>326</height>
|
||||||
|
<location_x>36</location_x>
|
||||||
|
<location_y>296</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.RadioLogger
|
||||||
|
<plugin_config>
|
||||||
|
<split>150</split>
|
||||||
|
<analyzers name="6lowpan" />
|
||||||
|
</plugin_config>
|
||||||
|
<width>815</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>385</height>
|
||||||
|
<location_x>255</location_x>
|
||||||
|
<location_y>8</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
SerialSocketServer
|
||||||
|
<mote_arg>0</mote_arg>
|
||||||
|
<width>422</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>74</height>
|
||||||
|
<location_x>1234</location_x>
|
||||||
|
<location_y>93</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.TimeLine
|
||||||
|
<plugin_config>
|
||||||
|
<mote>0</mote>
|
||||||
|
<mote>1</mote>
|
||||||
|
<showRadioRXTX />
|
||||||
|
<showRadioHW />
|
||||||
|
<showLEDs />
|
||||||
|
<showWatchpoints />
|
||||||
|
<split>125</split>
|
||||||
|
<zoomfactor>25.49079397896416</zoomfactor>
|
||||||
|
</plugin_config>
|
||||||
|
<width>1624</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>252</height>
|
||||||
|
<location_x>166</location_x>
|
||||||
|
<location_y>699</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
Loading…
Reference in a new issue