pkg: iotivity: temporarily remove
This commit is contained in:
parent
0c1db826b5
commit
e9849e660f
|
@ -1,336 +0,0 @@
|
|||
IoTivity Examples
|
||||
===============
|
||||
These examples implement some simple clients and a server to test the IoTivity package for RIOT-OS. The pkg is based on the [IoTivity-Constrained][1] library.
|
||||
All examples use the realm-local multicast address **ff03:158** instead of the link-local multicast address **ff02::158**. Every payload is [CBOR][2] encoded.
|
||||
All examples have been tested on Native and SAMR21-XPRO.
|
||||
##Index
|
||||
- [Iotivity Examples](#examples)
|
||||
- [Server Example](#server_ex)
|
||||
- [Client Example](#client_ex)
|
||||
- [Client_Switch Example](#client_sw_ex)
|
||||
- [BR_FW Example](#br_fw_ex)
|
||||
- [Scenarios](#scenarios)
|
||||
- [Node-to-Node Communications](#n2n_comm)
|
||||
- [Server and Client (Periodic PUT) - native target](#sc_pput_native)
|
||||
- [Server and Client (Periodic PUT) - SAMR21-XPRO target](#sc_pput_samr21)
|
||||
- [Server and Client_Switch - SAMR21-XPRO target](#sc_sw_samr21)
|
||||
- [Linux-to-Nodes Communications](#l2n_comm)
|
||||
- [Preliminary Step](#l2n_pre)
|
||||
- [Start the Server](#l2n_srv)
|
||||
- [Start the Border Router](#l2n_br)
|
||||
- [Server output](#l2n_out)
|
||||
- [Testing](#l2n_tst)
|
||||
- [Good Practice](#good)
|
||||
|
||||
#<a name="examples"></a>Examples
|
||||
|
||||
##<a name="server_ex"></a>Server Example
|
||||
This example implements an IoTivity Server that contains 4 resources.
|
||||
1. */oic/res*: returns the representation of resources available on the server. Defined [here][3].
|
||||
2. */oic/p*: returns information about the platform on which the server runs. Defined [here][3].
|
||||
3. */oic/d*: returns information about the device on which the server runs. Defined [here][3].
|
||||
4. */light/1* : it is a light (LED) management resource (implemented in resources/res-light.c). Resource Type: *oic.r.light*.
|
||||
- GET: returns the status of the LED. The payload is: `{state: true/false}`
|
||||
- PUT: changes the status of the LED. The payload is: `{state: true/false}`
|
||||
- OBSERVE: the registered client is notified when the status changes. The payload is the same of the GET response.
|
||||
|
||||
## <a name="client_ex"></a>Client Example
|
||||
This example implements a simple client. It is able to discover resources with ResourceType *oic.r.light*. Once it finds a resource, it registers for OBSERVE notifications. It changes the status every second by sending a periodic PUT request.
|
||||
|
||||
##<a name="client_sw_ex"></a>Client_Switch Example
|
||||
This example implements a simple client. It is able to discover resources with ResourceType *oic.r.light*. Once it finds a resource, it registers for OBSERVE notifications. It changes the status when the User Button is pressed. If the button is not present it is just an observer.
|
||||
|
||||
##<a name="br_fw_ex"></a>BR_FW Example
|
||||
It is an "enhanced" version of the GNRC Border Router. It implements a simple forwarder (UDP server/client) for multicast requests with destination ff03::158 port 5683.
|
||||
|
||||
#<a name="scenarios"></a>Scenarios
|
||||
It is possible to deploy 2 different scenarios with these examples.
|
||||
|
||||
##<a name="n2n_comm"></a>Node-to-Node Communications
|
||||
In this scenario, we will deploy an IoTivity Client and IoTivity Server on different nodes. We can choose two different clients for this scenario: client (periodic PUT) or client_switch (PUT sent on User Button pressed). The first one runs well both on native either on SAMR21-XPRO boards, the second one runs just on SAMR21-XPRO boards. Native target hasn't the button.
|
||||
|
||||
### <a name="sc_pput_native"></a>Server and Client (Periodic PUT) - native target
|
||||
Create taps interfaces (to which RIOT will connect). Go to `/dist/tools/tapsetup` and type
|
||||
```
|
||||
$ sudo ./tapsetup -c
|
||||
```
|
||||
After this step we have created three tap interfaces: tap0, tap1 and tapbr0.
|
||||
Now, we compile the server. Go to `/examples/iotivity-examples/server` and type
|
||||
```
|
||||
$ make all BOARD=native
|
||||
```
|
||||
Run the server by invoking
|
||||
```
|
||||
$ sudo bin/native/ocf_server.elf tap0
|
||||
```
|
||||
The server output will be similar to this
|
||||
```
|
||||
RIOT native interrupts/signals initialized.
|
||||
LED_RED_OFF
|
||||
LED_GREEN_ON
|
||||
RIOT native board initialized.
|
||||
RIOT native hardware initialization complete.
|
||||
|
||||
main(): This is RIOT! (Version: 2017.01-devel-13-g2b77e-mattia-Latitude-E6410-pkg/iotivity)
|
||||
server_oic: Waiting for address autoconfiguration...ipadapter: waiting for server requests...
|
||||
ipadapter: waiting for multicast requests...
|
||||
server_oic: LED0 is OFF
|
||||
LED_RED_OFF
|
||||
oc_main: Stack successfully initialized
|
||||
server_oic: Configured network interfaces:
|
||||
Iface 5 HWaddr: e6:e8:ff:6b:0c:f2
|
||||
|
||||
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::e4e8:ffff:fe6b:cf2/64 scope: local
|
||||
inet6 addr: ff02::1:ff6b:cf2/128 scope: local [multicast]
|
||||
inet6 addr: ff02::2/128 scope: local [multicast]
|
||||
inet6 addr: ff02::1a/128 scope: local [multicast]
|
||||
inet6 addr: ff03::158/128 scope: global [multicast]
|
||||
```
|
||||
It is waiting for requests.
|
||||
Open a new terminal window, go to `/examples/iotivity-examples/client` and type
|
||||
```
|
||||
$ make all BOARD=native
|
||||
```
|
||||
Run the client by invoking
|
||||
```
|
||||
$ sudo bin/native/ocf_client.elf tap1
|
||||
```
|
||||
The client runs and it starts with the discovery phase
|
||||
```
|
||||
RIOT native interrupts/signals initialized.
|
||||
LED_RED_OFF
|
||||
LED_GREEN_ON
|
||||
RIOT native board initialized.
|
||||
RIOT native hardware initialization complete.
|
||||
|
||||
main(): This is RIOT! (Version: 2017.01-devel-13-g2b77e-mattia-Latitude-E6410-pkg/iotivity)
|
||||
LED_RED_OFF
|
||||
client_oic: Waiting for address autoconfiguration...ipadapter: waiting for server requests...
|
||||
ipadapter: waiting for multicast requests...
|
||||
oc_main: Stack successfully initialized
|
||||
client_oic: Configured network interfaces:Iface 5 HWaddr: a6:ab:89:bd:1f:80
|
||||
|
||||
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::a4ab:89ff:febd:1f80/64 scope: local
|
||||
inet6 addr: ff02::1:ffbd:1f80/128 scope: local [multicast]
|
||||
inet6 addr: ff02::2/128 scope: local [multicast]
|
||||
inet6 addr: ff02::1a/128 scope: local [multicast]
|
||||
inet6 addr: ff03::158/128 scope: global [multicast]
|
||||
|
||||
client_oic: continue discovery
|
||||
Outgoing message to [ff03:0000:0000:0000:0000:0000:0000:0158]:5683
|
||||
client_oic: continue discovery
|
||||
...
|
||||
ipadapter: got server request
|
||||
Incoming message from [fe80:0000:0000:0000:241c:c8ff:fe14:3d79]:56789
|
||||
ipadapter: waiting for server requests...
|
||||
client_oic: Discovery done
|
||||
client_oic: Ready...
|
||||
LED_RED_ON
|
||||
```
|
||||
Once the resource is discovered, the client registers as an Observer of the resource and it switches on its LED as notification of Discovery Completed.
|
||||
From this point it will send a PUT request every second.
|
||||
Client Output:
|
||||
```
|
||||
client_oic: Sent PUT request
|
||||
Outgoing message to [fe80:0000:0000:0000:241c:c8ff:fe14:3d79]:56789
|
||||
ipadapter: got server request
|
||||
Incoming message from [fe80:0000:0000:0000:241c:c8ff:fe14:3d79]:56789
|
||||
ipadapter: waiting for server requests...
|
||||
client_oic: PUT_light:
|
||||
client_oic: PUT response OK
|
||||
ipadapter: got server request
|
||||
Incoming message from [fe80:0000:0000:0000:241c:c8ff:fe14:3d79]:56789
|
||||
ipadapter: waiting for server requests...
|
||||
client_oic: OBSERVE_light: key state, value 0
|
||||
```
|
||||
Server output:
|
||||
```
|
||||
Incoming message from [fe80:0000:0000:0000:a4ab:89ff:febd:1f80]:56789
|
||||
ipadapter: waiting for server requests...
|
||||
server_oic: PUT request
|
||||
server_oic: key: state value: 0
|
||||
server_oic: LED0 is OFF
|
||||
LED_RED_OFF
|
||||
Outgoing message to [fe80:0000:0000:0000:a4ab:89ff:febd:1f80]:56789
|
||||
server_oic: GET request
|
||||
server_oic: Light state 0
|
||||
Outgoing message to [fe80:0000:0000:0000:a4ab:89ff:febd:1f80]:56789
|
||||
```
|
||||
TAPs interfaces can be easily deleted. Go to `/dist/tools/tapsetup` and type
|
||||
```
|
||||
$ sudo ./tapsetup -d
|
||||
```
|
||||
|
||||
###<a name="sc_pput_samr21"></a> Server and Client (Periodic PUT) - SAMR21-XPRO target
|
||||
Now, we reproduce the previous scenario using two [SAMR21-XPRO][4] nodes.
|
||||
Connect your nodes, go to `/examples/iotivity-examples/server` and check the list of USB-connected nodes by typing:
|
||||
```
|
||||
$ make list-ttys
|
||||
```
|
||||
The output will be similar to
|
||||
```
|
||||
/sys/bus/usb/devices/2-1.3: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800001234', tty(s): ttyACM0
|
||||
/sys/bus/usb/devices/2-1.4: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800004321', tty(s): ttyACM1
|
||||
```
|
||||
We will use Serial Numbers in order to identify the designed node during the compilation phase.
|
||||
Now, we compile the server
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
then we open the serial connection
|
||||
```
|
||||
$ make term BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
The server starts and it is waiting for incoming requests.
|
||||
Now, open a new terminal window, go to `/examples/iotivity-examples/client` and type
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=client_node_serial
|
||||
$ make term BOARD=samr21-xpro SERIAL=client_node_serial
|
||||
```
|
||||
Client starts the discovery phase. Once it finds a resource (with ResourceType **oic.r.light**), it registers as an observer on the resource, then it switches on its LED and it finally starts with periodic PUT requests. The server LED will blink periodically.
|
||||
Client and Server terminal outputs are similar to the outputs in case of native target.
|
||||
|
||||
###<a name="sc_sw_samr21"></a> Server and Client_Switch - SAMR21-XPRO target
|
||||
This deployment emulates a smart home scenario in which we have a SmartBulb (server) and a SmartSwitch (client_switch). It requires two SAMR21-XPRO nodes or similar.
|
||||
Connect your nodes, go to `/examples/iotivity-examples/server` and check the list of USB-connected nodes by typing:
|
||||
```
|
||||
$ make list-ttys
|
||||
```
|
||||
The output will be similar to
|
||||
```
|
||||
/sys/bus/usb/devices/2-1.3: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800001234', tty(s): ttyACM0
|
||||
/sys/bus/usb/devices/2-1.4: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800004321', tty(s): ttyACM1
|
||||
```
|
||||
We will use Serial Numbers in order to identify the designed node during the compilation phase.
|
||||
|
||||
Now, we compile the server
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
then we open the serial connection
|
||||
```
|
||||
$ make term BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
The server starts and it is waiting for incoming requests.
|
||||
|
||||
Now, we open a new terminal window, go to `/examples/iotivity-examples/client_switch` and type
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=client_node_serial
|
||||
$ make term BOARD=samr21-xpro SERIAL=client_node_serial
|
||||
```
|
||||
Client performs the discovery phase. Once it is completed, client registers as an Observer of the resource, then it switches on its LED.
|
||||
Client is now ready to send a PUT request when the User Button is pressed. The server LED will change the status when the button is pressed. Terminal outputs are similar to outputs in previous examples.
|
||||
|
||||
##<a name="l2n_comm"></a>Linux-to-Nodes communications
|
||||
In this scenario, we will deploy an IoTivity server on a RIOT node and the IoTivity client will run on a Linux machine. This architecture requires the "enhanced" version of the Border Router [BR_FW](br_fw). It requires two SAMR21-XPRO nodes or similar.
|
||||
|
||||
###<a name="l2n_pre"></a>Preliminary step
|
||||
Connect your nodes, go to `/examples/iotivity-examples/server` and check the list of USB-connected nodes by typing:
|
||||
```
|
||||
$ make list-ttys
|
||||
```
|
||||
The output will be similar to
|
||||
```
|
||||
/sys/bus/usb/devices/2-1.3: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800001234', tty(s): ttyACM0
|
||||
/sys/bus/usb/devices/2-1.4: Atmel Corp. EDBG CMSIS-DAP serial: 'ATML2127031800004321', tty(s): ttyACM1
|
||||
```
|
||||
We will use Serial Numbers in order to identify the designed node during the compilation phase.
|
||||
|
||||
###<a name="l2n_srv"></a>Start the Server
|
||||
Open a terminal window, go to `/examples/iotivity-examples/server` and type
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
then we open the serial connection
|
||||
```
|
||||
$ make term BOARD=samr21-xpro SERIAL=server_node_serial
|
||||
```
|
||||
The server starts the initialization phase, then it is ready for incoming requests.
|
||||
|
||||
###<a name="l2n_br"></a>Start the Border Router
|
||||
Step 1) Open a terminal window in `/example/iotivity-examples/br_fw/` and type
|
||||
```
|
||||
$ make flash BOARD=samr21-xpro SERIAL=br_node_serial
|
||||
```
|
||||
Step 2) Once the flashing is finished, we have to open a network interface. Type
|
||||
```
|
||||
$ PORT=/dev/ttyACM0 make term
|
||||
```
|
||||
Step 3) We have to complete the routing strategy on the BR, so in the RIOT shell type
|
||||
```
|
||||
> ifconfig 7 add 2001:db8::2
|
||||
> fibroute add :: via 2001:db8::1 dev 7
|
||||
```
|
||||
Now the BR is ready. The network is configured as follow:
|
||||
- Serial Port: **/dev/ttyACM0**
|
||||
- Interface: **tap0**
|
||||
- Address Prefix: **2001:db8::\64**
|
||||
- Routing on tap0 of multicast packets with destination **ff03::158**
|
||||
|
||||
It is possible to configure the network with different parameters by invoking directly the initialization script instead of executing the Step 2:
|
||||
```
|
||||
$ make host-tools
|
||||
$ sudo ./start_network_mcast.sh <serial-port> <tap-device> <IPv6-prefix> <IPv6-mcast>
|
||||
```
|
||||
then run the Step 3 with the proper changes.
|
||||
|
||||
We can check the reachability of the server by typing in another terminal window
|
||||
```
|
||||
$ ping6 <IPv6 server>
|
||||
```
|
||||
The IPv6 address of the server can be found by typing in the Border Router console:
|
||||
```
|
||||
> routers
|
||||
```
|
||||
The output will be similar to
|
||||
```
|
||||
if Router state type
|
||||
---------------------------------------------------
|
||||
6 2001:db8::5859:1c2a:64c7:c48a REACHABLE REG
|
||||
```
|
||||
|
||||
###<a name="l2n_out"></a>Server Output
|
||||
Managing a GET request the output is like
|
||||
```
|
||||
2016-11-04 14:39:32,115 - INFO # ipadapter: got server request
|
||||
2016-11-04 14:39:32,121 - INFO # Incoming message from [2001:0db8:0000:0000:0000:0000:0000:0001]:56214
|
||||
2016-11-04 14:39:32,125 - INFO # ipadapter: waiting for server requests...
|
||||
2016-11-04 14:39:32,128 - INFO # server_oic: GET request
|
||||
2016-11-04 14:39:32,130 - INFO # server_oic: Light state 0
|
||||
2016-11-04 14:39:32,145 - INFO # Outgoing message to [2001:0db8:0000:0000:0000:0000:0000:0001]:56214
|
||||
```
|
||||
Managing a PUT request the output is like
|
||||
```
|
||||
2016-11-04 14:39:35,119 - INFO # ipadapter: got server request
|
||||
2016-11-04 14:39:35,125 - INFO # Incoming message from [2001:0db8:0000:0000:0000:0000:0000:0001]:56214
|
||||
2016-11-04 14:39:35,128 - INFO # ipadapter: waiting for server requests...
|
||||
2016-11-04 14:39:35,134 - INFO # server_oic: PUT request
|
||||
2016-11-04 14:39:35,136 - INFO # server_oic: key: state value: 1
|
||||
2016-11-04 14:39:35,138 - INFO # server_oic: LED0 is ON
|
||||
2016-11-04 14:39:35,141 - INFO # Outgoing message to [2001:0db8:0000:0000:0000:0000:0000:0001]:56214
|
||||
```
|
||||
|
||||
###<a name="l2n_tst"></a>Testing
|
||||
There are many different ways to test this scenario.
|
||||
|
||||
- Tools: you can use [coap-cbor-cli][5] to perform get request. Put -c as argument.
|
||||
- Iotivity Client: you can write an iotivity client that runs on Linux. [Here][6] and [Here][7] there are some sample clients that can be used to test this scenario.
|
||||
|
||||
#<a name="good"></a>Good Practice
|
||||
Discoveries and Requests are usually fast, but a timeout delay of some seconds on responses can be useful. In these examples, delays are set to 1 second for discoveries and they can be increased. For requests coming from a linux-based client, timeout delays should be higher (e.g. 5-10 seconds for discoveries and 3 seconds for requests). They can be tuned depending on the application. The minimum value is around 1 second.
|
||||
|
||||
[1]: https://github.com/iotivity/iotivity-constrained/
|
||||
[2]: http://cbor.io/
|
||||
[3]: https://openconnectivity.org/resources/specifications
|
||||
[4]: http://www.atmel.com/tools/ATSAMR21-XPRO.aspx
|
||||
[5]: https://github.com/domabo/coap-cbor-cli
|
||||
[6]: https://github.com/Agile-IoT/agile-iotivity/tree/master/IoTivity/Simple-Client-Linux
|
||||
[7]: https://github.com/Agile-IoT/agile-iotivity/tree/master/IoTivity/Interactive-Client-Linux
|
|
@ -1,102 +0,0 @@
|
|||
# name of your application
|
||||
APPLICATION = ocf_br_fw
|
||||
|
||||
CFLAGS += -DOC_SERVER
|
||||
CFLAGS += -DOC_CLIENT
|
||||
|
||||
# If no BOARD is found in the environment, use this default:
|
||||
BOARD ?= native
|
||||
|
||||
# This has to be the absolute path to the RIOT base directory:
|
||||
RIOTBASE ?= $(CURDIR)/../../..
|
||||
|
||||
BOARD_INSUFFICIENT_MEMORY := airfy-beacon chronos msb-430 msb-430h nrf51dongle \
|
||||
nrf6310 pca10000 pca10005 spark-core \
|
||||
stm32f0discovery telosb weio wsn430-v1_3b wsn430-v1_4 \
|
||||
yunjia-nrf51822 z1 nucleo-f072
|
||||
|
||||
# use ethos (ethernet over serial) for network communication and stdio over
|
||||
# UART, but not on native, as native has a tap interface towards the host.
|
||||
ifeq (,$(filter native,$(BOARD)))
|
||||
GNRC_NETIF_NUMOF := 2
|
||||
USEMODULE += ethos gnrc_netdev2
|
||||
|
||||
# ethos baudrate can be configured from make command
|
||||
ETHOS_BAUDRATE ?= 115200
|
||||
CFLAGS += '-DETHOS_UART=UART_DEV(0)' -DETHOS_BAUDRATE=$(ETHOS_BAUDRATE) -DUSE_ETHOS_FOR_STDIO
|
||||
FEATURES_REQUIRED += periph_uart
|
||||
endif
|
||||
|
||||
# Include packages that pull up and auto-init the link layer.
|
||||
# NOTE: 6LoWPAN will be included if IEEE802.15.4 devices are present
|
||||
USEMODULE += gnrc_netdev_default
|
||||
USEMODULE += auto_init_gnrc_netif
|
||||
# Specify the mandatory networking modules for 6LoWPAN border router
|
||||
USEMODULE += gnrc_sixlowpan_border_router_default
|
||||
# Add forwarding table
|
||||
USEMODULE += fib
|
||||
# Additional networking modules that can be dropped if not needed
|
||||
USEMODULE += gnrc_icmpv6_echo
|
||||
# Add also the shell, some shell commands
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
USEMODULE += ps
|
||||
#USEMODULE += gnrc_pktdump
|
||||
# include UHCP client
|
||||
USEMODULE += gnrc_uhcpc
|
||||
#UDP
|
||||
USEMODULE += gnrc_udp
|
||||
USEMODULE += gnrc_conn_udp
|
||||
#rpl
|
||||
# Add a routing protocol
|
||||
USEMODULE += gnrc_rpl
|
||||
USEMODULE += auto_init_gnrc_rpl
|
||||
USEMODULE += gnrc_ipv6_router_default
|
||||
USEMODULE += gnrc_ndp_router
|
||||
#Other modules
|
||||
USEMODULE += pthread
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
|
||||
SECURE ?= 0
|
||||
export SECURE
|
||||
|
||||
|
||||
# Set a custom 802.15.4 channel if needed
|
||||
DEFAULT_CHANNEL ?= 26
|
||||
CFLAGS += -DDEFAULT_CHANNEL=$(DEFAULT_CHANNEL)
|
||||
|
||||
# Comment this out to disable code in RIOT that does safety checking
|
||||
# which is not needed in a production environment but helps in the
|
||||
# development process:
|
||||
#CFLAGS += -DDEVELHELP
|
||||
|
||||
# Use different settings when compiling for one of the following (low-memory)
|
||||
# boards
|
||||
LOW_MEMORY_BOARDS := nucleo-f334
|
||||
|
||||
ifneq (,$(filter $(BOARD),$(LOW_MEMORY_BOARDS)))
|
||||
$(info Using low-memory configuration for iotivity_server.)
|
||||
## low-memory tuning values
|
||||
# lower pktbuf buffer size
|
||||
CFLAGS += -DGNRC_PKTBUF_SIZE=1000
|
||||
# disable fib, rpl
|
||||
DISABLE_MODULE += fib gnrc_rpl
|
||||
USEMODULE += prng_minstd
|
||||
endif
|
||||
|
||||
# Change this to 0 show compiler invocation lines by default:
|
||||
QUIET ?= 1
|
||||
|
||||
TAP ?= tap0
|
||||
IPV6_PREFIX ?= 2001:db8::/64
|
||||
IPV6_MCAST_OIC ?= ff03::158
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
||||
.PHONY: host-tools
|
||||
|
||||
term: host-tools
|
||||
$(Q) sudo ./start_network_mcast.sh $(PORT) $(TAP) $(IPV6_PREFIX) $(IPV6_MCAST_OIC)
|
||||
|
||||
host-tools:
|
||||
$(Q)env -u CC -u CFLAGS make -C $(RIOTBASE)/dist/tools
|
|
@ -1,165 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 main.c
|
||||
* @brief This is a BR with multicast forwarding for OIC discovery
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "net/af.h"
|
||||
#include "shell.h"
|
||||
#include "xtimer.h"
|
||||
#include "msg.h"
|
||||
#include "net/gnrc.h"
|
||||
#include "net/gnrc/conn.h"
|
||||
#include "net/gnrc/ipv6.h"
|
||||
#include "net/gnrc/rpl.h"
|
||||
#include "net/gnrc/udp.h"
|
||||
#include "net/conn/udp.h"
|
||||
#include "thread.h"
|
||||
#define MAIN_QUEUE_SIZE (8)
|
||||
#define OIC_FW_QUEUE_SIZE (8)
|
||||
#define MAX_PAYLOAD_SIZE (256)
|
||||
#define MULTICAST_PORT (5683)
|
||||
|
||||
#define PRINTipaddr(addr, port) \
|
||||
printf( \
|
||||
"[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%" \
|
||||
"02x]:%d", \
|
||||
(addr)[0], (addr)[1], \
|
||||
(addr)[2], (addr)[3], \
|
||||
(addr)[4], (addr)[5], \
|
||||
(addr)[6], (addr)[7], \
|
||||
(addr)[8], (addr)[9], \
|
||||
(addr)[10], (addr)[11], \
|
||||
(addr)[12], (addr)[13], \
|
||||
(addr)[14], (addr)[15], \
|
||||
port)
|
||||
|
||||
static uint8_t buffer2[MAX_PAYLOAD_SIZE];
|
||||
|
||||
static msg_t _oic_fw_msg_queue[OIC_FW_QUEUE_SIZE];
|
||||
static msg_t _main_msg_queue[MAIN_QUEUE_SIZE];
|
||||
|
||||
static kernel_pid_t interface_pid;
|
||||
|
||||
char oic_forwarding_thread_stack[THREAD_STACKSIZE_DEFAULT];
|
||||
|
||||
uint8_t wk_addr[16] = { 0xff, 0x03, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0x01, 0x58 };
|
||||
|
||||
void handle_incoming_message(uint8_t *payload, int *size, uint8_t *addr,
|
||||
uint8_t addr_len, uint16_t port)
|
||||
{
|
||||
char *addr_str = NULL;
|
||||
uint8_t buffer[*size];
|
||||
|
||||
memcpy(buffer, payload, *size);
|
||||
|
||||
ipv6_addr_to_str(addr_str, (ipv6_addr_t *)addr, addr_len);
|
||||
printf("forwarder: pck from ");
|
||||
PRINTipaddr(addr, port);
|
||||
printf("\n");
|
||||
printf("forwarder: payload size %d B\n", *size);
|
||||
|
||||
conn_udp_sendto(buffer, *size, addr, 16,
|
||||
wk_addr, 16, AF_INET6,
|
||||
port, MULTICAST_PORT);
|
||||
}
|
||||
|
||||
void *start_oic_forwarding_loop(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
|
||||
msg_init_queue(_oic_fw_msg_queue, OIC_FW_QUEUE_SIZE);
|
||||
|
||||
static uint8_t addr[16] = { 0 };
|
||||
uint8_t remote_addr[16] = { 0 };
|
||||
size_t remote_addr_len;
|
||||
uint16_t remote_port;
|
||||
|
||||
conn_udp_t conn;
|
||||
|
||||
int n = conn_udp_create(&conn, addr, sizeof(addr), AF_INET6, MULTICAST_PORT);
|
||||
|
||||
if (n != 0) {
|
||||
printf("forwarder: failed to register multicast receive socket\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
ipv6_addr_t *if_addr =
|
||||
gnrc_ipv6_netif_add_addr(interface_pid, (ipv6_addr_t *)&wk_addr, 128, 0);
|
||||
|
||||
if (if_addr == NULL) {
|
||||
printf("forwarder: error.. could not join multicast group\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gnrc_ipv6_netif_addr_get(if_addr)->valid = UINT32_MAX;
|
||||
gnrc_ipv6_netif_addr_get(if_addr)->preferred = UINT32_MAX;
|
||||
|
||||
while (1) {
|
||||
printf("forwarder: waiting for multicast requests...\n");
|
||||
n = conn_udp_recvfrom(&conn, (char *)buffer2, MAX_PAYLOAD_SIZE, remote_addr,
|
||||
&remote_addr_len, &remote_port);
|
||||
if (n < 0) {
|
||||
printf("forwarder_multicast_recv: error in conn_udp_recvfrom().n=%d\n", n);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("forwarder: got multicast request\n");
|
||||
|
||||
handle_incoming_message(buffer2, &n, remote_addr, remote_addr_len, remote_port);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* we need a message queue for the thread running the shell in order to
|
||||
* receive potentially fast incoming networking packets */
|
||||
msg_init_queue(_main_msg_queue, MAIN_QUEUE_SIZE);
|
||||
puts("RIOT border router + OIC discovery forwarder");
|
||||
|
||||
kernel_pid_t interfaces[GNRC_NETIF_NUMOF];
|
||||
size_t if_num = gnrc_netif_get(interfaces);
|
||||
|
||||
if (if_num == 0) {
|
||||
printf("forwarder: error.. no available network interface\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
interface_pid = interfaces[0];
|
||||
|
||||
thread_create(oic_forwarding_thread_stack, sizeof(oic_forwarding_thread_stack),
|
||||
THREAD_PRIORITY_MAIN, THREAD_CREATE_STACKTEST, start_oic_forwarding_loop,
|
||||
NULL, "oic_fw_thread");
|
||||
|
||||
/* start shell */
|
||||
puts("All up, running the shell now");
|
||||
char line_buf[SHELL_DEFAULT_BUFSIZE];
|
||||
shell_run(NULL, line_buf, SHELL_DEFAULT_BUFSIZE);
|
||||
|
||||
|
||||
|
||||
/* should be never reached */
|
||||
return 0;
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
ETHOS_DIR="$(dirname $(readlink -f $0))"/../../../dist/tools/ethos
|
||||
|
||||
create_tap() {
|
||||
ip tuntap add ${TAP} mode tap user ${USER}
|
||||
ip link set ${TAP} up
|
||||
sysctl -w net.ipv6.conf.${TAP}.forwarding=1
|
||||
sysctl -w net.ipv6.conf.${TAP}.accept_ra=0
|
||||
ip a a ${NETPREFIX}::1/64 dev ${TAP}
|
||||
ip r d ${NETPREFIX}::/64 dev ${TAP}
|
||||
ip r a ${NETPREFIX}::2 dev ${TAP}
|
||||
ip r a ${NETPREFIX}::/64 via ${NETPREFIX}::2 dev ${TAP} metric 1
|
||||
}
|
||||
|
||||
create_mcast_route() {
|
||||
ip -6 route add ${IPMCAST} dev ${TAP} table local
|
||||
}
|
||||
|
||||
remove_tap() {
|
||||
ip tuntap del ${TAP} mode tap
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
echo "Cleaning up..."
|
||||
remove_tap
|
||||
kill ${UHCPD_PID}
|
||||
trap "" INT QUIT TERM EXIT
|
||||
}
|
||||
|
||||
start_uhcpd() {
|
||||
${UHCPD} ${TAP} ${PREFIX} > /dev/null &
|
||||
UHCPD_PID=$!
|
||||
}
|
||||
|
||||
PORT=$1
|
||||
TAP=$2
|
||||
PREFIX=$3
|
||||
NETPREFIX=$(echo $3 | awk -v delimeter="::" '{split($0,a,delimeter)} END{print a[1]}')
|
||||
IPMCAST=$4
|
||||
|
||||
UHCPD="$(readlink -f "${ETHOS_DIR}/../uhcpd/bin")/uhcpd"
|
||||
|
||||
[ -z "${PORT}" -o -z "${TAP}" -o -z "${PREFIX}" -o -z "${IPMCAST}" ] && {
|
||||
echo "usage: $0 <serial-port> <tap-device> <prefix> <ip-mcast>"
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap "cleanup" INT QUIT TERM EXIT
|
||||
|
||||
|
||||
create_tap && create_mcast_route && start_uhcpd && "${ETHOS_DIR}/ethos" ${TAP} ${PORT}
|
|
@ -1,69 +0,0 @@
|
|||
# name of your application
|
||||
APPLICATION = ocf_client
|
||||
|
||||
CFLAGS += -DOC_CLIENT
|
||||
|
||||
# If no BOARD is found in the environment, use this default:
|
||||
BOARD ?= native
|
||||
|
||||
# This has to be the absolute path to the RIOT base directory:
|
||||
RIOTBASE ?= $(CURDIR)/../../..
|
||||
|
||||
BOARD_INSUFFICIENT_MEMORY := airfy-beacon chronos msb-430 msb-430h nrf51dongle \
|
||||
nrf6310 pca10000 pca10005 spark-core \
|
||||
stm32f0discovery telosb weio wsn430-v1_3b wsn430-v1_4 \
|
||||
yunjia-nrf51822 z1 nucleo-f072
|
||||
|
||||
# Include packages that pull up and auto-init the link layer.
|
||||
# NOTE: 6LoWPAN will be included if IEEE802.15.4 devices are present
|
||||
USEMODULE += gnrc_netdev_default
|
||||
USEMODULE += auto_init_gnrc_netif
|
||||
# Specify the mandatory networking modules for IPv6 and UDP
|
||||
USEMODULE += gnrc_ipv6_router_default
|
||||
USEMODULE += gnrc_udp
|
||||
USEMODULE += gnrc_conn_udp
|
||||
# Add a routing protocol
|
||||
USEMODULE += gnrc_rpl
|
||||
USEMODULE += auto_init_gnrc_rpl
|
||||
# Additional networking modules that can be dropped if not needed
|
||||
USEMODULE += gnrc_icmpv6_echo
|
||||
|
||||
#Other modules
|
||||
USEMODULE += pthread
|
||||
USEMODULE += gnrc_ndp_router
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
|
||||
USEPKG += iotivity
|
||||
|
||||
SECURE ?= 0
|
||||
export SECURE
|
||||
|
||||
|
||||
# Set a custom 802.15.4 channel if needed
|
||||
DEFAULT_CHANNEL ?= 26
|
||||
CFLAGS += -DDEFAULT_CHANNEL=$(DEFAULT_CHANNEL)
|
||||
|
||||
# Comment this out to disable code in RIOT that does safety checking
|
||||
# which is not needed in a production environment but helps in the
|
||||
# development process:
|
||||
#CFLAGS += -DDEVELHELP
|
||||
|
||||
# Use different settings when compiling for one of the following (low-memory)
|
||||
# boards
|
||||
LOW_MEMORY_BOARDS := nucleo-f334
|
||||
|
||||
ifneq (,$(filter $(BOARD),$(LOW_MEMORY_BOARDS)))
|
||||
$(info Using low-memory configuration for iotivity_server.)
|
||||
## low-memory tuning values
|
||||
# lower pktbuf buffer size
|
||||
CFLAGS += -DGNRC_PKTBUF_SIZE=1000
|
||||
# disable fib, rpl
|
||||
DISABLE_MODULE += fib gnrc_rpl
|
||||
USEMODULE += prng_minstd
|
||||
endif
|
||||
|
||||
# Change this to 0 show compiler invocation lines by default:
|
||||
QUIET ?= 1
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
|
@ -1,247 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 client.c
|
||||
* @brief This is a simple IoTivity Client
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
#include "oc_api.h"
|
||||
#include "pthread_cond.h"
|
||||
#include "thread.h"
|
||||
#include "xtimer.h"
|
||||
|
||||
#define MAX_URI_LENGTH (30)
|
||||
|
||||
static void observe_light(oc_client_response_t *data);
|
||||
extern int _netif_config(int argc, char **argv);
|
||||
|
||||
static int quit;
|
||||
static mutex_t mutex;
|
||||
static pthread_cond_t cv;
|
||||
static struct timespec ts;
|
||||
static bool got_discovery_response = false;
|
||||
static bool observe_stopped = false;
|
||||
static char light_1[MAX_URI_LENGTH];
|
||||
static oc_server_handle_t light_server;
|
||||
static bool light_state = false;
|
||||
|
||||
static char _oc_main_stack[THREAD_STACKSIZE_MAIN];
|
||||
#define OC_QUEUE_SIZE (8)
|
||||
static msg_t _oc_msg_queue[OC_QUEUE_SIZE];
|
||||
|
||||
static void
|
||||
set_device_custom_property(void *data)
|
||||
{
|
||||
oc_set_custom_device_property(purpose, "operate lamp");
|
||||
}
|
||||
|
||||
static void
|
||||
set_led_state(bool led_state)
|
||||
{
|
||||
if (led_state) {
|
||||
LED0_ON;
|
||||
}
|
||||
else {
|
||||
LED0_OFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
app_init(void)
|
||||
{
|
||||
oc_init_platform("RIOT-OS", NULL, NULL);
|
||||
oc_add_device("/oic/d", "oic.d.switch", "RIOT switch", "1.0", "1.0",
|
||||
set_device_custom_property, NULL);
|
||||
}
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
stop_observe(void *data)
|
||||
{
|
||||
PRINT("client_oic: Stopping OBSERVE\n");
|
||||
oc_stop_observe(light_1, &light_server);
|
||||
observe_stopped = true;
|
||||
return DONE;
|
||||
}
|
||||
|
||||
static void
|
||||
put_light(oc_client_response_t *data)
|
||||
{
|
||||
PRINT("client_oic: PUT_light:\n");
|
||||
if (data->code == OC_STATUS_CHANGED) {
|
||||
PRINT("client_oic: PUT response OK\n");
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: PUT response code %d\n", data->code);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
observe_light(oc_client_response_t *data)
|
||||
{
|
||||
PRINT("client_oic: OBSERVE_light: ");
|
||||
oc_rep_t *rep = data->payload;
|
||||
while (rep != NULL) {
|
||||
PRINT("key %s, value ", oc_string(rep->name));
|
||||
switch (rep->type) {
|
||||
case BOOL:
|
||||
PRINT("%d\n", rep->value_boolean);
|
||||
light_state = rep->value_boolean;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
rep = rep->next;
|
||||
}
|
||||
}
|
||||
|
||||
static oc_discovery_flags_t
|
||||
discovery(const char *di, const char *uri, oc_string_array_t types,
|
||||
oc_interface_mask_t interfaces, oc_server_handle_t *server,
|
||||
void *user_data)
|
||||
{
|
||||
int i;
|
||||
int uri_len = strlen(uri);
|
||||
|
||||
uri_len = (uri_len >= MAX_URI_LENGTH) ? MAX_URI_LENGTH - 1 : uri_len;
|
||||
|
||||
for (i = 0; i < oc_string_array_get_allocated_size(types); i++) {
|
||||
char *t = oc_string_array_get_item(types, i);
|
||||
if (strlen(t) == 11 && strncmp(t, "oic.r.light", 11) == 0) {
|
||||
memcpy(&light_server, server, sizeof(oc_server_handle_t));
|
||||
|
||||
strncpy(light_1, uri, uri_len);
|
||||
light_1[uri_len] = '\0';
|
||||
|
||||
got_discovery_response = true;
|
||||
|
||||
return OC_STOP_DISCOVERY;
|
||||
}
|
||||
}
|
||||
return OC_CONTINUE_DISCOVERY;
|
||||
}
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
periodic_put(void *data)
|
||||
{
|
||||
if (observe_stopped) {
|
||||
PRINT("client_oic: Stop periodic PUT\n");
|
||||
return DONE;
|
||||
}
|
||||
|
||||
if (oc_init_put(light_1, &light_server, NULL, &put_light, HIGH_QOS, NULL)) {
|
||||
oc_rep_start_root_object();
|
||||
oc_rep_set_boolean(root, state, !light_state);
|
||||
oc_rep_end_root_object();
|
||||
if (oc_do_put()) {
|
||||
PRINT("client_oic: Sent PUT request\n");
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: Could not send PUT\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: Could not init PUT\n");
|
||||
}
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
do_discovery(void *data)
|
||||
{
|
||||
if (got_discovery_response) {
|
||||
PRINT("client_oic: Discovery done\n");
|
||||
PRINT("client_oic: Ready...\n");
|
||||
oc_do_observe(light_1, &light_server, NULL, &observe_light, LOW_QOS, NULL);
|
||||
oc_set_delayed_callback(NULL, &periodic_put, 1);
|
||||
oc_set_delayed_callback(NULL, &stop_observe, 100);
|
||||
set_led_state(true);
|
||||
return DONE;
|
||||
}
|
||||
oc_do_ip_discovery("oic.r.light", &discovery, NULL);
|
||||
PRINT("client_oic: continue discovery\n");
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
issue_requests(void)
|
||||
{
|
||||
oc_set_delayed_callback(NULL, &do_discovery, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
signal_event_loop_func(void)
|
||||
{
|
||||
mutex_lock(&mutex);
|
||||
pthread_cond_signal(&cv);
|
||||
mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
void *
|
||||
oc_main_thread(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
|
||||
pthread_cond_init(&cv, NULL);
|
||||
|
||||
static const oc_handler_t handler = { .init = app_init,
|
||||
.signal_event_loop = signal_event_loop_func,
|
||||
.requests_entry = issue_requests };
|
||||
|
||||
msg_init_queue(_oc_msg_queue, OC_QUEUE_SIZE);
|
||||
|
||||
if (oc_main_init(&handler) < 0) {
|
||||
PRINT("client_oic: failed to initialize stack\n");
|
||||
return NULL;
|
||||
}
|
||||
PRINT("client_oic: Configured network interfaces:");
|
||||
_netif_config(0, NULL);
|
||||
|
||||
oc_clock_time_t next_event;
|
||||
while (quit == 0) {
|
||||
next_event = oc_main_poll();
|
||||
mutex_lock(&mutex);
|
||||
if (next_event == 0) {
|
||||
pthread_cond_wait(&cv, &mutex);
|
||||
}
|
||||
else if (oc_clock_time() < next_event) {
|
||||
ts.tv_sec = (next_event / OC_CLOCK_SECOND);
|
||||
ts.tv_nsec = (next_event % OC_CLOCK_SECOND) * 1.e09 / OC_CLOCK_SECOND;
|
||||
pthread_cond_timedwait(&cv, &mutex, &ts);
|
||||
}
|
||||
mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
oc_main_shutdown();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
set_led_state(false);
|
||||
PRINT("client_oic: Waiting for address autoconfiguration...");
|
||||
xtimer_sleep(10);
|
||||
thread_create(_oc_main_stack, sizeof(_oc_main_stack), 2, 0, oc_main_thread,
|
||||
NULL, "OCF event thread");
|
||||
|
||||
fgetc(stdin);
|
||||
|
||||
quit = 1;
|
||||
signal_event_loop_func();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 config.c
|
||||
* @brief This is a configuration file for IoTivity environment
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#define OC_DEBUG 0
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Time resolution */
|
||||
#include <stdint.h>
|
||||
typedef uint64_t oc_clock_time_t;
|
||||
/* 1 clock tick = 1ms */
|
||||
#define OC_CLOCK_CONF_TICKS_PER_SECOND (1000)
|
||||
|
||||
#define OC_BYTES_POOL_SIZE (900)
|
||||
#define OC_INTS_POOL_SIZE (4)
|
||||
#define OC_DOUBLES_POOL_SIZE (4)
|
||||
|
||||
/* Server-side parameters */
|
||||
/* Maximum number of server resources */
|
||||
#define MAX_APP_RESOURCES (1)
|
||||
|
||||
/* Common paramters */
|
||||
/* Maximum number of concurrent requests */
|
||||
#define MAX_NUM_CONCURRENT_REQUESTS (2)
|
||||
|
||||
/* Estimated number of nodes in payload tree structure */
|
||||
#define EST_NUM_REP_OBJECTS (60)
|
||||
|
||||
/* Maximum size of request/response PDUs */
|
||||
#define MAX_PAYLOAD_SIZE (512)
|
||||
|
||||
/* Number of devices on the OCF platform */
|
||||
#define MAX_NUM_DEVICES (1)
|
||||
|
||||
/* Platform payload size */
|
||||
#define MAX_PLATFORM_PAYLOAD_SIZE (256)
|
||||
|
||||
/* Device payload size */
|
||||
#define MAX_DEVICE_PAYLOAD_SIZE (256)
|
||||
|
||||
/* Security layer */
|
||||
/* Maximum number of authorized clients */
|
||||
#define MAX_NUM_SUBJECTS (1)
|
||||
|
||||
/* Maximum number of concurrent DTLS sessions */
|
||||
#define MAX_DTLS_PEERS (1)
|
||||
|
||||
/* Max inactivity timeout before tearing down DTLS connection */
|
||||
#define DTLS_INACTIVITY_TIMEOUT (10)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_H */
|
|
@ -1,69 +0,0 @@
|
|||
# name of your application
|
||||
APPLICATION = ocf_client
|
||||
|
||||
CFLAGS += -DOC_CLIENT
|
||||
|
||||
# If no BOARD is found in the environment, use this default:
|
||||
BOARD ?= native
|
||||
|
||||
# This has to be the absolute path to the RIOT base directory:
|
||||
RIOTBASE ?= $(CURDIR)/../../..
|
||||
|
||||
BOARD_INSUFFICIENT_MEMORY := airfy-beacon chronos msb-430 msb-430h nrf51dongle \
|
||||
nrf6310 pca10000 pca10005 spark-core \
|
||||
stm32f0discovery telosb weio wsn430-v1_3b wsn430-v1_4 \
|
||||
yunjia-nrf51822 z1 nucleo-f072
|
||||
|
||||
# Include packages that pull up and auto-init the link layer.
|
||||
# NOTE: 6LoWPAN will be included if IEEE802.15.4 devices are present
|
||||
USEMODULE += gnrc_netdev_default
|
||||
USEMODULE += auto_init_gnrc_netif
|
||||
# Specify the mandatory networking modules for IPv6 and UDP
|
||||
USEMODULE += gnrc_ipv6_router_default
|
||||
USEMODULE += gnrc_udp
|
||||
USEMODULE += gnrc_conn_udp
|
||||
# Add a routing protocol
|
||||
USEMODULE += gnrc_rpl
|
||||
USEMODULE += auto_init_gnrc_rpl
|
||||
# Additional networking modules that can be dropped if not needed
|
||||
USEMODULE += gnrc_icmpv6_echo
|
||||
|
||||
#Other modules
|
||||
USEMODULE += pthread
|
||||
USEMODULE += gnrc_ndp_router
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
|
||||
USEPKG += iotivity
|
||||
|
||||
SECURE ?= 0
|
||||
export SECURE
|
||||
|
||||
|
||||
# Set a custom 802.15.4 channel if needed
|
||||
DEFAULT_CHANNEL ?= 26
|
||||
CFLAGS += -DDEFAULT_CHANNEL=$(DEFAULT_CHANNEL)
|
||||
|
||||
# Comment this out to disable code in RIOT that does safety checking
|
||||
# which is not needed in a production environment but helps in the
|
||||
# development process:
|
||||
#CFLAGS += -DDEVELHELP
|
||||
|
||||
# Use different settings when compiling for one of the following (low-memory)
|
||||
# boards
|
||||
LOW_MEMORY_BOARDS := nucleo-f334
|
||||
|
||||
ifneq (,$(filter $(BOARD),$(LOW_MEMORY_BOARDS)))
|
||||
$(info Using low-memory configuration for iotivity_server.)
|
||||
## low-memory tuning values
|
||||
# lower pktbuf buffer size
|
||||
CFLAGS += -DGNRC_PKTBUF_SIZE=1000
|
||||
# disable fib, rpl
|
||||
DISABLE_MODULE += fib gnrc_rpl
|
||||
USEMODULE += prng_minstd
|
||||
endif
|
||||
|
||||
# Change this to 0 show compiler invocation lines by default:
|
||||
QUIET ?= 1
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
|
@ -1,253 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 client_switch.c
|
||||
* @brief This is an Iotivity client. It sends a PUT when the
|
||||
* User button is pressed.
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include "oc_api.h"
|
||||
#include "pthread_cond.h"
|
||||
#include "thread.h"
|
||||
#include "xtimer.h"
|
||||
#include "periph/gpio.h"
|
||||
|
||||
#define MAX_URI_LENGTH (30)
|
||||
|
||||
static void observe_light(oc_client_response_t *data);
|
||||
extern int _netif_config(int argc, char **argv);
|
||||
|
||||
static int quit;
|
||||
static mutex_t mutex;
|
||||
static pthread_cond_t cv;
|
||||
static struct timespec ts;
|
||||
static bool got_discovery_response = false;
|
||||
static char light_1[MAX_URI_LENGTH];
|
||||
static oc_server_handle_t light_server;
|
||||
static bool light_state = false;
|
||||
static bool led_state = false;
|
||||
|
||||
static char _oc_main_stack[THREAD_STACKSIZE_MAIN];
|
||||
|
||||
static void
|
||||
set_led_state(bool led_state)
|
||||
{
|
||||
if (led_state) {
|
||||
LED0_ON;
|
||||
}
|
||||
else {
|
||||
LED0_OFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_device_custom_property(void *data)
|
||||
{
|
||||
oc_set_custom_device_property(purpose, "operate lamp");
|
||||
}
|
||||
|
||||
static void
|
||||
app_init(void)
|
||||
{
|
||||
oc_init_platform("RIOT-OS", NULL, NULL);
|
||||
oc_add_device("/oic/d", "oic.d.switch", "RIOT switch", "1.0", "1.0",
|
||||
set_device_custom_property, NULL);
|
||||
}
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
stop_observe(void *data)
|
||||
{
|
||||
PRINT("client_oic: Stopping OBSERVE\n");
|
||||
oc_stop_observe(light_1, &light_server);
|
||||
return DONE;
|
||||
}
|
||||
|
||||
#ifdef BUTTON_GPIO
|
||||
static void
|
||||
put_light(oc_client_response_t *data)
|
||||
{
|
||||
PRINT("client_oic: PUT_light:\n");
|
||||
if (data->code == OC_STATUS_CHANGED) {
|
||||
PRINT("client_oic: PUT response OK\n");
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: PUT response code %d\n", data->code);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
observe_light(oc_client_response_t *data)
|
||||
{
|
||||
PRINT("client_oic: OBSERVE_light: ");
|
||||
oc_rep_t *rep = data->payload;
|
||||
while (rep != NULL) {
|
||||
PRINT("key %s, value ", oc_string(rep->name));
|
||||
switch (rep->type) {
|
||||
case BOOL:
|
||||
PRINT("%d\n", rep->value_boolean);
|
||||
light_state = rep->value_boolean;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
rep = rep->next;
|
||||
}
|
||||
}
|
||||
|
||||
static oc_discovery_flags_t
|
||||
discovery(const char *di, const char *uri, oc_string_array_t types,
|
||||
oc_interface_mask_t interfaces, oc_server_handle_t *server,
|
||||
void *user_data)
|
||||
{
|
||||
int i;
|
||||
int uri_len = strlen(uri);
|
||||
|
||||
uri_len = (uri_len >= MAX_URI_LENGTH) ? MAX_URI_LENGTH - 1 : uri_len;
|
||||
|
||||
for (i = 0; i < oc_string_array_get_allocated_size(types); i++) {
|
||||
char *t = oc_string_array_get_item(types, i);
|
||||
if (strlen(t) == 11 && strncmp(t, "oic.r.light", 11) == 0) {
|
||||
memcpy(&light_server, server, sizeof(oc_server_handle_t));
|
||||
|
||||
strncpy(light_1, uri, uri_len);
|
||||
light_1[uri_len] = '\0';
|
||||
|
||||
got_discovery_response = true;
|
||||
|
||||
return OC_STOP_DISCOVERY;
|
||||
}
|
||||
}
|
||||
return OC_CONTINUE_DISCOVERY;
|
||||
}
|
||||
|
||||
#ifdef BUTTON_GPIO
|
||||
void button_callback(void)
|
||||
{
|
||||
gpio_irq_disable(BUTTON_GPIO);
|
||||
if (oc_init_put(light_1, &light_server, NULL, &put_light, HIGH_QOS, NULL)) {
|
||||
oc_rep_start_root_object();
|
||||
oc_rep_set_boolean(root, state, !light_state);
|
||||
oc_rep_end_root_object();
|
||||
if (oc_do_put()) {
|
||||
PRINT("client_oic: Sent PUT request\n");
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: Could not send PUT\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRINT("client_oic: Could not init PUT\n");
|
||||
}
|
||||
xtimer_usleep(140000);
|
||||
gpio_irq_enable(BUTTON_GPIO);
|
||||
}
|
||||
#endif
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
operate(void *data)
|
||||
{
|
||||
PRINT("client_oic: Ready...\n");
|
||||
set_led_state(true);
|
||||
oc_do_observe(light_1, &light_server, NULL, &observe_light, LOW_QOS, NULL);
|
||||
#ifdef BUTTON_GPIO
|
||||
gpio_init_int(BUTTON_GPIO, GPIO_IN_PU, GPIO_RISING, (gpio_cb_t)button_callback, NULL);
|
||||
#endif
|
||||
oc_set_delayed_callback(NULL, &stop_observe, 10000);
|
||||
return DONE;
|
||||
}
|
||||
|
||||
static oc_event_callback_retval_t
|
||||
do_discovery(void *data)
|
||||
{
|
||||
if (got_discovery_response) {
|
||||
PRINT("client_oic: Discovery done\n");
|
||||
oc_set_delayed_callback(NULL, &operate, 1);
|
||||
return DONE;
|
||||
}
|
||||
oc_do_ip_discovery("oic.r.light", &discovery, NULL);
|
||||
PRINT("client_oic: continue discovery\n");
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
issue_requests(void)
|
||||
{
|
||||
oc_set_delayed_callback(NULL, &do_discovery, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
signal_event_loop_func(void)
|
||||
{
|
||||
mutex_lock(&mutex);
|
||||
pthread_cond_signal(&cv);
|
||||
mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
void *
|
||||
oc_main_thread(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
|
||||
pthread_cond_init(&cv, NULL);
|
||||
|
||||
static const oc_handler_t handler = { .init = app_init,
|
||||
.signal_event_loop = signal_event_loop_func,
|
||||
.requests_entry = issue_requests };
|
||||
if (oc_main_init(&handler) < 0) {
|
||||
PRINT("client_oic: failed to initialize stack\n");
|
||||
return NULL;
|
||||
}
|
||||
PRINT("client_oic: Configured network interfaces:");
|
||||
_netif_config(0, NULL);
|
||||
|
||||
oc_clock_time_t next_event;
|
||||
while (quit == 0) {
|
||||
next_event = oc_main_poll();
|
||||
mutex_lock(&mutex);
|
||||
if (next_event == 0) {
|
||||
pthread_cond_wait(&cv, &mutex);
|
||||
}
|
||||
else if (oc_clock_time() < next_event) {
|
||||
ts.tv_sec = (next_event / OC_CLOCK_SECOND);
|
||||
ts.tv_nsec = (next_event % OC_CLOCK_SECOND) * 1.e09 / OC_CLOCK_SECOND;
|
||||
pthread_cond_timedwait(&cv, &mutex, &ts);
|
||||
}
|
||||
mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
oc_main_shutdown();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
set_led_state(led_state);
|
||||
PRINT("client_oic: Waiting for address autoconfiguration...");
|
||||
xtimer_sleep(10);
|
||||
thread_create(_oc_main_stack, sizeof(_oc_main_stack), 2, 0, oc_main_thread,
|
||||
NULL, "OCF event thread");
|
||||
|
||||
fgetc(stdin);
|
||||
|
||||
quit = 1;
|
||||
signal_event_loop_func();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 config.c
|
||||
* @brief This is a configuration file for IoTivity environment
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#define OC_DEBUG 0
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Time resolution */
|
||||
#include <stdint.h>
|
||||
typedef uint64_t oc_clock_time_t;
|
||||
/* 1 clock tick = 1ms */
|
||||
#define OC_CLOCK_CONF_TICKS_PER_SECOND (1000)
|
||||
|
||||
#define OC_BYTES_POOL_SIZE (900)
|
||||
#define OC_INTS_POOL_SIZE (4)
|
||||
#define OC_DOUBLES_POOL_SIZE (4)
|
||||
|
||||
/* Server-side parameters */
|
||||
/* Maximum number of server resources */
|
||||
#define MAX_APP_RESOURCES (1)
|
||||
|
||||
/* Common paramters */
|
||||
/* Maximum number of concurrent requests */
|
||||
#define MAX_NUM_CONCURRENT_REQUESTS (2)
|
||||
|
||||
/* Estimated number of nodes in payload tree structure */
|
||||
#define EST_NUM_REP_OBJECTS (60)
|
||||
|
||||
/* Maximum size of request/response PDUs */
|
||||
#define MAX_PAYLOAD_SIZE (512)
|
||||
|
||||
/* Number of devices on the OCF platform */
|
||||
#define MAX_NUM_DEVICES (1)
|
||||
|
||||
/* Platform payload size */
|
||||
#define MAX_PLATFORM_PAYLOAD_SIZE (256)
|
||||
|
||||
/* Device payload size */
|
||||
#define MAX_DEVICE_PAYLOAD_SIZE (256)
|
||||
|
||||
/* Security layer */
|
||||
/* Maximum number of authorized clients */
|
||||
#define MAX_NUM_SUBJECTS (1)
|
||||
|
||||
/* Maximum number of concurrent DTLS sessions */
|
||||
#define MAX_DTLS_PEERS (1)
|
||||
|
||||
/* Max inactivity timeout before tearing down DTLS connection */
|
||||
#define DTLS_INACTIVITY_TIMEOUT (10)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_H */
|
|
@ -1,83 +0,0 @@
|
|||
# name of your application
|
||||
APPLICATION = ocf_server
|
||||
|
||||
CFLAGS += -DOC_SERVER
|
||||
|
||||
# If no BOARD is found in the environment, use this default:
|
||||
BOARD ?= native
|
||||
|
||||
# This has to be the absolute path to the RIOT base directory:
|
||||
RIOTBASE ?= $(CURDIR)/../../..
|
||||
|
||||
BOARD_INSUFFICIENT_MEMORY := airfy-beacon chronos msb-430 msb-430h nrf51dongle \
|
||||
nrf6310 pca10000 pca10005 spark-core \
|
||||
stm32f0discovery telosb weio wsn430-v1_3b wsn430-v1_4 \
|
||||
yunjia-nrf51822 z1 nucleo-f072
|
||||
|
||||
#Add IoTivity resources
|
||||
RES_SRC = $(wildcard ./resources/*.c)
|
||||
RES_OBJ = $(RES_SRC:.c=.o)
|
||||
APPDEPS += ${RES_OBJ}
|
||||
|
||||
|
||||
# Include packages that pull up and auto-init the link layer.
|
||||
# NOTE: 6LoWPAN will be included if IEEE802.15.4 devices are present
|
||||
USEMODULE += gnrc_netdev_default
|
||||
USEMODULE += auto_init_gnrc_netif
|
||||
# Specify the mandatory networking modules for IPv6 and UDP
|
||||
USEMODULE += gnrc_ipv6_router_default
|
||||
USEMODULE += gnrc_udp
|
||||
USEMODULE += gnrc_conn_udp
|
||||
# Add a routing protocol
|
||||
USEMODULE += gnrc_rpl
|
||||
USEMODULE += auto_init_gnrc_rpl
|
||||
# Additional networking modules that can be dropped if not needed
|
||||
USEMODULE += gnrc_icmpv6_echo
|
||||
|
||||
#Other modules
|
||||
USEMODULE += pthread
|
||||
USEMODULE += gnrc_ndp_router
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
|
||||
USEPKG += iotivity
|
||||
|
||||
SECURE ?= 0
|
||||
export SECURE
|
||||
|
||||
|
||||
# Set a custom 802.15.4 channel if needed
|
||||
DEFAULT_CHANNEL ?= 26
|
||||
CFLAGS += -DDEFAULT_CHANNEL=$(DEFAULT_CHANNEL)
|
||||
|
||||
# Comment this out to disable code in RIOT that does safety checking
|
||||
# which is not needed in a production environment but helps in the
|
||||
# development process:
|
||||
#CFLAGS += -DDEVELHELP
|
||||
|
||||
# Use different settings when compiling for one of the following (low-memory)
|
||||
# boards
|
||||
LOW_MEMORY_BOARDS := nucleo-f334
|
||||
|
||||
ifneq (,$(filter $(BOARD),$(LOW_MEMORY_BOARDS)))
|
||||
$(info Using low-memory configuration for iotivity_server.)
|
||||
## low-memory tuning values
|
||||
# lower pktbuf buffer size
|
||||
CFLAGS += -DGNRC_PKTBUF_SIZE=1000
|
||||
# disable fib, rpl
|
||||
DISABLE_MODULE += fib gnrc_rpl
|
||||
USEMODULE += prng_minstd
|
||||
endif
|
||||
|
||||
# Change this to 0 show compiler invocation lines by default:
|
||||
QUIET ?= 1
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
||||
|
||||
%.o: %.c
|
||||
${CC} -c -o $@ $< ${CFLAGS} ${INCLUDES}
|
||||
|
||||
clean: clean_resources
|
||||
|
||||
clean_resources:
|
||||
rm -rf ${RES_OBJ}
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 CREATE-NET
|
||||
*
|
||||
* 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 config.c
|
||||
* @brief This is a configuration file for IoTivity environment
|
||||
*
|
||||
* @author Mattia Antonini <mattia.antonini1@studenti.unipr.it>
|
||||
* <m.antonini@create-net.org>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#define OC_DEBUG 0
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Time resolution */
|
||||
#include <stdint.h>
|
||||
typedef uint64_t oc_clock_time_t;
|
||||
/* 1 clock tick = 1ms */
|
||||
#define OC_CLOCK_CONF_TICKS_PER_SECOND (1000)
|
||||
|
||||
#define OC_BYTES_POOL_SIZE (900)
|
||||
#define OC_INTS_POOL_SIZE (4)
|
||||
#define OC_DOUBLES_POOL_SIZE (4)
|
||||
|
||||
/* Server-side parameters */
|
||||
/* Maximum number of server resources */
|
||||
#define MAX_APP_RESOURCES (1)
|
||||
|
||||
/* Common paramters */
|
||||
/* Maximum number of concurrent requests */
|
||||
#define MAX_NUM_CONCURRENT_REQUESTS (2)
|
||||
|
||||
/* Estimated number of nodes in payload tree structure */
|
||||
#define EST_NUM_REP_OBJECTS (60)
|
||||
|
||||
/* Maximum size of request/response PDUs */
|
||||
#define MAX_PAYLOAD_SIZE (512)
|
||||
|
||||