68beb52f14
Before, handlers writing blockwise transfer assumed that the response header length will match the request header length. This is true for UDP, but not for TCP: The CoAP over TCP header contains a Len field, that gets extended for larger messages. Since the reply often is indeed larger than the request, this is indeed often the case for CoAP over TCP. Note: Right now, no CoAP over TCP implementation is upstream. However, getting rid of incorrect assumptions now will make life easier later on. |
||
---|---|---|
.. | ||
coap_handler.c | ||
main.c | ||
Makefile | ||
Makefile.ci | ||
README.md |
nanocoap server example
This application is meant to get you started with implementing a CoAP server on RIOT. It uses the GNRC network stack through RIOT's sock API.
Usage
To try out the server on native, compile it with
$ make all
Then, create a tap interface (to which RIOT will connect):
$ sudo ip tuntap add tap0 mode tap user ${USER}
$ sudo ip link set tap0 up
Run the resulting RIOT binary by invoking:
$ make term
The application is now listening on all it's configured IP addresses.
Now find out its link_layer address:
$ make term
/home/aabadie/riot/examples/nanocoap_server/bin/native/nanocoapcoap_server.elf tap0
RIOT native interrupts/signals initialized.
LED_GREEN_OFF
LED_RED_ON
RIOT native board initialized.
RIOT native hardware initialization complete.
main(): This is RIOT! (Version: 2015.12-devel-632-g8f451-booze-master)
RIOT nanocoap example application
Waiting for address autoconfiguration...
Configured network interfaces:
Iface 5 HWaddr: 96:3c:18:1e:26:f7
MTU:1500 HL:64 RTR RTR_ADV
Source address length: 6
Link type: wired
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::e42a:1aff:feca:10ec/64 scope: local
inet6 addr: ff02::1:ffca:10ec/128 scope: local [multicast]
inet6 addr: ff02::2/128 scope: local [multicast]
inet6 addr: 2001:db8:1:0:e42a:1aff:feca:10ec/64 scope: global
The link-layer address in this case is "fe80::e42a:1aff:feca:10ec", the only "scope: local" address set.
Testing
The CoAP server exposes 6 different resources:
/.well-known/core
: returns the list of available resources on the server. This is part of the CoAP specifications. It works only with GET requests./echo/
: will match any request that begins with '/echo/' and will echo the remaining part of the URI path. Meant to show how the prefix works. It works only with GET requests./riot/board
: returns the name of the board running the server. It works only with GET requests./riot/value
: returns the value of an internal variable of the server. It works with GET requests and also with PUT and POST requests, which means that this value can be updated from a client./riot/ver
: returns the current RIOT version. Meant to show a block2 reply. It works only with GET requests./sha256
: creates a hash with the received payloads. It is meant to show block1 support. It returns the hash when no more blocks are pending. Only works with POST.
There are multiple external CoAP clients you can use to easily test the server running on native.
libcoap CLI
(replace "fe80::e42a:1aff:feca:10ec" with your link-layer address)
- Get the name of the board:
# coap-client -m get coap://[fe80::e42a:1aff:feca:10ec%tap0]/riot/board
- Update and get the internal value:
# coap-client -m put coap://[fe80::e42a:1aff:feca:10ec%tap0]/riot/value -e 42
# coap-client -m get coap://[fe80::e42a:1aff:feca:10ec%tap0]/riot/value
Copper (Firefox Plugin)
The Copper plugin for Firefox provides you with a nice graphical interface, but getting it to work with RIOT requires a little setup.
Make sure you've installed
- The Firefox Copper plugin
- The Router Advertisement Daemon (radvd)
And build the application again using make
.
Enter the following into your /etc/radvd.conf
(if it doesn't exist yet, create one):
interface tap0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
AdvDefaultPreference low;
prefix 2001:db8:1:0::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};
};
(you can use radvd -c
to check for syntax errors)
and run
sudo radvd
Then, run the RIOT binary as usual:
make term
Note that the output listing all configured interfaces contains a globally scoped address, which you can now use to reach the RIOT instance via Copper. To do so, enter this:
coap://[2001:db8:1:0:e42a:1aff:feca:10ec]/riot/board
into your Firefox address bar, where you should replace 2001:db8:1:0:e42a:1aff:feca:10ec
with your RIOT instance's address marked as "scope: global".
If you click the big green GET
button, the word native
should appear in the
Payload text box at the center of the GUI.
If this doesn't work, try manually adding a Global address to the tap0 interface:
sudo service radvd start
sudo ip address add 2001:db8:1::a/64 dev tap0
make term