====== @ANY2400 & @ANY900 USB Stick mit RPL-Border-Router und SLIP ======
Der @ANY USB Stick ist eigentlich nicht für den Einsatz als IPv6 Router konzipiert, er besitzt nicht wie der Raven RZUSB-Stick ein vollständiges USB Interface mit RNDIS Support, sondern nur einen CP2103 Chip, welcher als virtuelle serielle Schnittstelle genutzt werden kann. Um jedoch einzelne Contiki Knoten über IPv6 erreichen zu können und diese bei Bedarf über IPv6 mit einer globalen Adresse erreichbar zu machen, kann dieser USB Stick als Router bzw. Gateway eingesetzt werden.
{{:contiki:a-n-solutions-module:atanyusbstick.jpg?600|}}
Der @ANY2400 USB Stick besitzt das AT-ANY-2400-1 Modul, der @ANY900 USB Stick das AT-ANY-900-1 Modul (siehe [[contiki:a-n-solutions-module:atany24001-module|Contiki Portierung auf die AT-ANY-1 Module]]), sie enthalten also einen ATmega1281V sowie den AT86RF231 Funkchip + integrierte Antenne (2,4Ghz) bzw. AT86RF212 Funkchip + integrierte Antenne (900MHz). Es ist also möglich als Kompilierungsziel ''TARGET=avr-zigbit'' zu verwenden. Auch hier ist vor der Kompilierung zu beachten, dass innerhalb der Fuses ''EESAVE'' deaktiviert werden muss (siehe [[contiki:a-n-solutions-module:atany24001-module|Contiki Portierung auf die AT-ANY-1 Module)]]).
Um eine Kommunikation zwischen uIP auf dem Mikrocontroller und dem PC über die serielle Schnittstelle zu ermöglichen bietet Contiki den Einsatz des SLIP Protokolls an. Leider wurde dies bisher kaum für das Zigbit Modul genutzt, weshalb kein vorkonfigurierter Quellcode innerhalb des Contiki Quellcodes vorhanden ist. Für andere Plattformen wie z.B, SKY oder auch den AVR-Zigduino sind bereits Implementierungen vorhanden. Auch für den AVR Raven gibt es Anfänge einer SLIP Implementierung, welche jedoch nicht ausgereift ist.\\
Da es sinnvoll ist nicht nur eine einzelne Kommunikation der Knoten mit dem Gateway zu ermöglichen, sondern durch den Einsatz von RPL vermaschtes Routing zu verwenden, soll nicht wie auf dem RZ Raven USB Stick ein einfaches Forwarding Interface genutzt werden, sondern ein RPL Router mit globaler IPv6 Anbindung über SLIP implementiert werden.\\
Hierzu gibt es unter Contiki bereits eine Implementierung, welche sich in ''/examples/ipv6/rpl-border-router/'' befindet. Leider ist auch hier keine Portierung für das Zigbit Modul vorhanden, es muss also auch hier eine Anpassung vorgenommen werden.
:!: -> __Diese Anleitung bezieht sich auf Contiki 2.6 Stand 26.09.12, wird eine neuere Version verwendet, so können hier Unterschiede im Quellcode auftreten.__
:!: -> [[contiki:a-n-solutions-module:contiki3|Hier findet sich die Anleitung für Contiki 3.0]]
===== Änderungen innerhalb des Plattform Ordners für das Zigbit Modul (/platform/avr-zigbit/) =====
Da der CP2103 Chip an die serielle Schnittstelle 1 des ATmega1281 angeschlossen ist, kann nur diese für die Kommunikation über SLIP verwendet werden, USART1 ist standardmäßig für Printf Debugging Nachrichten vorgesehen.
==== Datei contiki-avr-zigbit-main.c ====
Innerhalb der Datei ''/platform/avr-zigbit/contiki-avr-zigbit-main.c'' ist deshalb die Konfiguration dieser Schnittstelle nötig. Außerdem muss die Printf Ausgabe deaktiviert werden. (Bei erfolgreichem Verbindungsaufbau über SLIP werden die Printf Kommandos sowieso ebenfalls über SLIP übermittelt.)
/*sz*/
///* Generic or slip connection on uart1 */
//rs232_init(RS232_PORT_0, USART_BAUD_57600,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
/* Second rs232 port for debugging */
/*Now used for SLIP Connection*/
rs232_init(RS232_PORT_1, USART_BAUD_57600,
USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
///* Redirect stdout to second port */
rs232_redirect_stdout(RS232_PORT_1);
/*sz*/
Durch Versuche konnte festgestellt werden, dass bei Überschreitung von 57600 als Baudrate SLIP nicht mehr korrekt arbeitet. Dies kann aber unter Umständen variieren.\\
Weiter unterhalb im Quellcode befindet sich das Makro ''#if UIP_CONF_ROUTER''. Da wir später im Makefile mit diesem Makro kompilieren werden, damit sich der Knoten nachher als Router verhält, wird dieser Quellcode Teil mit kompiliert. Dies führt zu einem Kompilierungsfehler, da die Funktion ''rime_udp_init(NULL)'' und ''uip_router_register()'' nicht vorhanden sind. Diese wurden im Zuge einer Quellcodeanpassung für die Econtag Plattform im August 2010 modifiziert (siehe [[http://permalink.gmane.org/gmane.os.contiki.cvs/7785]]). Aus diesem Grund müssen beide Funktionsaufrufe auskommentiert werden. Für Plattformen mit offizieller Router Unterstützung zB. der Atmel Raven wurde dies bereits durchgeführt, siehe vorherigen Link.
#if UIP_CONF_ROUTER
#if ANNOUNCE_BOOT
printf_P(PSTR("Routing Enabled\n"));
#endif
/*sz*/
// rime_init(rime_udp_init(NULL));
// uip_router_register(&rimeroute);
/*sz*/
#endif
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:contiki-avr-zigbit-main.c|]].\\
==== Datei slip_uart1.c ====
Da die AVR Mikrocontroller spezielle Befehle zur Ansteuerung der seriellen Schnittstelle verwenden, werden für das SLIP Interface plattformabhängige Funktionen benötigt, diese wurden von University of Colombo School of Computing bereits für den AVR Raven geschrieben. Im Verzeichnis ''/platform/avr-raven/'' befindet sich die Datei ''slip_uart0.c'', welche den maschinenabhängigen Quellcode für den AVR Raven enthält. Da die AVR Mikrocontrollerfamilie grundsätzlich gleich aufgebaut ist, kann dieser Quellcode auch für das Zigbit Modul verwendet werden. Hierzu muss lediglich die Datei in das Zigbit Plattform Verzeichnis ''/platform/avr-zigbit/'' kopiert werden.\\
Da innerhalb des @ANY2400 USB Sticks jedoch nicht USART0 sondern USART1 an das virtuelle serielle Interface angeschlossen ist, muss dies innerhalb der Funktion ''slip_arch_init(unsigned long ubr)'' noch angepasst werden.
void
slip_arch_init(unsigned long ubr)
{
//rs232_set_input(RS232_PORT_0, slip_input_byte);
/*sz*/
rs232_set_input(RS232_PORT_1, slip_input_byte);
/*sz/
stdout = &slip_stdout;
}
Im Anschluss wird die Datei dann in ''slip_uart1.c'' umbenannt.
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:slip_uart0.c|]].\\
==== Datei contiki-conf.h ====
Da innerhalb der Datei ''contiki-conf.h'' die Schnittstelle für SLIP festgelegt wird, welche wie zuvor erwähnt standardmäßig auf 0 steht, muss diese hier auf USART1 geändert werden.
/* COM port to be used for SLIP connection */
/*sz*/
//#define SLIP_PORT RS232_PORT_0
#define SLIP_PORT RS232_PORT_1
/*sz*/
Außerdem verwendet der Quellcode des //rpl-border-router//s ein ''project-conf.h'' File, worin unter anderem das für SLIP benötigte //Fallback Interface// festgelegt wird. Damit das ''project-conf.h'' File während der Kompilierung beachtet wird, muss innerhalb von ''contiki-conf.h'' die unten stehende Erweiterung eingetragen werden.
#ifndef __CONTIKI_CONF_H__
#define __CONTIKI_CONF_H__
/*sz*/
#ifdef PROJECT_CONF_H
#include "project-conf.h"
#endif
/*sz*/
Um außerdem die Standardeinstellungen von RPL nicht alle selbst konfigurieren zu müssen können diese aus dem ''contiki-conf.h''-File des AVR Ravens übernommen und am Dateiende eingefügt werden.
/*sz*/
/* ************************************************************************** */
//#pragma mark RPL Settings
/* ************************************************************************** */
#if UIP_CONF_IPV6_RPL
#define UIP_CONF_ROUTER 1
#define UIP_CONF_ND6_SEND_RA 0
#define UIP_CONF_ND6_REACHABLE_TIME 600000
#define UIP_CONF_ND6_RETRANS_TIMER 10000
/* For slow slip connections, to prevent buffer overruns */
//#define UIP_CONF_RECEIVE_WINDOW 300
#undef UIP_CONF_FWCACHE_SIZE
#define UIP_CONF_FWCACHE_SIZE 30
#define UIP_CONF_BROADCAST 1
#define UIP_ARCH_IPCHKSUM 1
#define UIP_CONF_PINGADDRCONF 0
#define UIP_CONF_LOGGING 0
//#define UIP_CONF_DS6_ROUTE_INFORMATION 0
#endif /* RPL */
/*sz*/
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:contiki-conf.h|]].\\
==== Datei Makefile.avr-zigbit ====
Um die zuvor erstellte Datei ''slip_uart1.c'' sowie die des Weiteren benötigte Datei ''slip.c'' während des Kompiliervorgangs miteinzubeziehen, ist innerhalb der Datei ''Makefile.avr-zigbit'' die untenstehende Erweiterung notwendig.
CONTIKI_TARGET_SOURCEFILES += rs232.c cfs-eeprom.c eeprom.c random.c \
mmem.c contiki-avr-zigbit-main.c
#sz#
#Needed files for slip
CONTIKI_TARGET_SOURCEFILES += slip_uart1.c slip.c
#sz#
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:Makefile.avr-zigbit|]].\\
===== Änderungen innerhalb des rpl-border-router Quellcodes (/examples/ipv6/rpl-border-router/) =====
Auch innerhalb des Quellcodes für den RPL Border Router sind einige kleine Anpassungen nötig, da wie zuvor erwähnt, der Quellcode nicht für das AVR Zigbit Modul angepasst ist.
==== Datei slip-bridge.c ====
Hier muss die passende Baudrate eingetragen werden.
static void
init(void)
{
//slip_arch_init(BAUD2UBR(115200));
/*sz*/
slip_arch_init(BAUD2UBR(57600));
/*sz*/
process_start(&slip_process, NULL);
slip_set_input_callback(slip_input_callback);
}
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:slip-bridge.c|]].\\
==== Datei border-router.c ====
Der RPL Border Router ist eigentlich für eine Plattform mit Tastern und Sensoren vorgesehen und enthält deshalb Aufrufe hierfür, da innerhalb des @ANY2400 USB Sticks keine Taster und Sensoren vorhanden sind müssen diese Codeteile entfernt werden. Außerdem wird für den ATmega1281 die Headerdatei ''dev/rs232.h'' benötigt, diese enthält die plattformabhängigen Funktionen zur Ansteuerung der seriellen Schnittstelle.
#include "net/netstack.h"
/*sz*/
//#include "dev/button-sensor.h"
/*sz*/
#include "dev/slip.h"
/*sz*/
#include "dev/rs232.h"
/*sz*/
----
prefix_set = 0;
NETSTACK_MAC.off(0);
PROCESS_PAUSE();
/*sz*/
//SENSORS_ACTIVATE(button_sensor);
/*sz*/
PRINTF("RPL-Border router started\n");
----
#if DEBUG || 1
print_local_addresses();
#endif
while(1) {
PROCESS_YIELD();
/*sz*/
//if (ev == sensors_event && data == &button_sensor) {
// PRINTF("Initiating global repair\n");
// rpl_repair_root(RPL_DEFAULT_INSTANCE);
//}
/*sz*/
}
PROCESS_END();
}
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:border-router.c|]].\\
==== Datei project-conf.h ====
Da die Makros ''QUEUEBUF_CONF_NUM'' und ''UIP_CONF_BUFFER_SIZE'' bereits in ''/platform/avr-zigbit/contiki-conf.h'' definiert wurden, bekommt man beim Kompilieren jedesmal Warnungen diesbezüglich. Durch die folgenden Änderungen kann dies vermieden werden.
//#ifndef QUEUEBUF_CONF_NUM
//#define QUEUEBUF_CONF_NUM 4
//#endif
//#ifndef UIP_CONF_BUFFER_SIZE
//#define UIP_CONF_BUFFER_SIZE 140
//#endif
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:project-conf.h|]].\\
==== Datei Makefile ====
Damit bei der Kompilierung IPv6, RPL und die Konfiguration als Router aktiviert ist, sind die folgenden Compilerflags innerhalb des ''Makefiles'' notwendig. Außerdem ist es sinnvoll hinter die Output Datei die Dateiendung .elf anzufügen, damit diese gleich das passende Format zum Upload auf den Microcontroller hat.
CONTIKI_PROJECT=border-router
all: $(CONTIKI_PROJECT).elf
CONTIKI=../../..
CFLAGS+= -DUIP_CONF_IPV6
CFLAGS+= -DUIP_CONF_IPV6_RPL
CFLAGS+= -DUIP_CONF_ROUTER
UIP_CONF_IPV6=1
UIP_CONF_ROUTER=1
UIP_CONF_IPV6_RPL=1
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[contiki:a-n-solutions-module:atany24001-usb-gateway:Makefile|]].\\
==== Datei rf230bb.c ====
Die @ANY-2400 Module besitzen den AT86RF231 Funkchip, dieser bietet die Möglichkeit einen externen Verstärker nachzuschalten. Dies wurde innerhalb den @ANY-2400 Modulen realisiert. Damit dieser Verstärker nicht immer aktiv ist, bietet der AT86RF231 einen Ausgangspin, welcher beim Senden aktiv wird und somit den Verstärker steuert. Diese Funktion muss jedoch aktiviert werden. Dazu muss innerhalb des Registers 0x04 (TRX_CTRL_1) das 7. Bit (PA_EXT_EN) auf High gesetzt werden. Dies kann innerhalb der Datei ''rf230bb.c'' in der Funktion ''rf230_warm_reset()'' mit den folgenden Codezeilen realisiert werden.
innerhalb ''rf230bb.c''
/*sz*/
/*set external PA in on state, used for @ANY modules*/
uint8_t reg_trx_ctrl_state;
reg_trx_ctrl_state = hal_register_read(0x04);
reg_trx_ctrl_state = (reg_trx_ctrl_state) | (0x80);
hal_register_write(0x04, reg_trx_ctrl_state);
/*sz*/
-> gesamte Datei (Änderungen markiert mit /*sz*/)
[[contiki:a-n-solutions-module:rf230bb.c|rf230bb.c]]
===== Kompilierung und Verbindungsherstellung über tunslip6 =====
Details zur Kompilierung unter Contiki sowie Upload Details sind unter [[contiki:installation_der_contiki_entwicklungsumgebung|Installation der Contiki Entwicklungsumgebung]] und [[contiki:howto_compile|Installation vom instant-contiki und Kompilieren eines ersten Programms]] zu finden.
==== Kompilierung und Upload ====
Der Quellcode kann nun mit dem Befehl ''make TARGET=avr-zigbit'' innerhalb des Verzeichnis ''rpl-border-router'', kompiliert werden. Die Ausgangsdatei ''border-router.elf'' kann anschließend auf den Mikrocontroller geladen werden. Der korrekte Anschluß des JTAG Adapters an den @ANY2400-USB-Stick ist in der folgenden Abbildung zu sehen.
{{:contiki:a-n-solutions-module:atany2400usbjtag.jpg?800|}}
==== Tunslip6 unter Instant Contiki 2.6 ====
Um nun eine Verbindung zwischen dem USB Stick und dem PC herzustellen, wird tunslip6 aus dem Contiki ''tools''-Verzeichnis eingesetzt. Dieses muss mit ''make tunslip6'' zuerst kompiliert werden und kann anschließend mit dem folgenden Befehl gestartet werden:
sudo ./tunslip6 aaaa::1/64 -s /dev/ttyUSB0 -B 57600 -v6
Nach dem Start sollte, insofern der USB Stick an ttyUSB0 angeschlossen wurde und die Baudrate übereinstimmt, folgende Ausgabe erscheinen:
{{:contiki:a-n-solutions-module:slip_output.png?500|}}
Die korrekte Funktion kann nun mithilfe von ping6 überprüft werden, dazu kann zuerst das SLIP Interface im Beispiel aus der oberen Abbildung ''aaaa::11:22ff:fe33:4444'' und danach ein dahinterliegender Knoten angepingt werden. Außerdem kann der integrierte Webserver über http://[aaaa::11:22ff:fe33:4444] erreicht werden, dort werden alle Neighbors sowie die Routen zu den Neighbors aufgelistet, siehe folgende Abbildung.
{{:contiki:a-n-solutions-module:rpl-border-web.png?500|}}
-> __Hinweise:__ \\
Es ist nicht möglich link lokale Adressen oder Multicastadressen durch das SLIP Interface zu erreichen, solche Pakete werden durch das SLIP Interface verworfen. Es ist außerdem nicht notwendig Router Advertisments über den PC zu versenden wie dies beispielsweise beim Einsatz des RZ Raven USB Sticks (siehe [[contiki:ravenrz_usb_stick_installation|AVR RavenRZ USB-Stick Installation]]) der Fall ist. Durch den Einsatz des RPL-Routers wird der gesamte IPv6 Autokonfigurationsvorgang über RPL und somit durch den USB-Stick geregelt.\\
Alle Knoten die über den RPL Router erreicht werden sollen müssen natürlich mit RPL kompiliert werden. (''UIP_CONF_IPV6=1, UIP_CONF_RPL=1, CFLAGS+= -DUIP_CONF_IPV6, CFLAGS+= -DUIP_CONF_IPV6_RPL'')
Wenn vermaschtes Routing verwendet werden soll, so muss zusätzlich für jeden Knoten das Flag ''CFLAGS+= -DUIP_CONF_ROUTER'' und ''UIP_CONF_ROUTER=1'' im Makefile aktiviert werden.
Außerdem ist die Anzahl von Neighbors und die Größe der Routingtabelle standardmäßig auf 4 eingestellt. Wenn dies nicht ausreichen sollte, so kann dies innerhalb der Datei contiki-conf.h im platform/avr-zigbit/ Ordner mit den folgenden Makros angepasst werden:
/*sz*/
/*configuration for neighbors and routes */
/* See uip-ds6.h */
#define UIP_CONF_DS6_NBR_NBU 10
#define UIP_CONF_DS6_DEFRT_NBU 2
#define UIP_CONF_DS6_PREFIX_NBU 3
#define UIP_CONF_DS6_ROUTE_NBU 10
#define UIP_CONF_DS6_ADDR_NBU 3
#define UIP_CONF_DS6_MADDR_NBU 0
#define UIP_CONF_DS6_AADDR_NBU 0
/*sz*/
(hier in diesem Beispiel ist die Größe der Routingtabelle sowie der Neighbors auf 10 erhöht worden, höhere Werte führten auf den Modulen in Tests zum Speicherüberlauf und somit zum Absturz. Innerhalb des Border Routers waren jedoch bis zu 20 möglich (eventuell auch mehr))
-> Diese Änderung ist für den RPL-Border-Router sowie für die einzelnen Module anwendbar.
===== Quick Install =====
Download complete RPL-BORDER-ROUTER for AVR Zigbit (ATmega1281 and AT86RF230 resp. AT86RF231 or AT86RF212) here:
{{:contiki:a-n-solutions-module:rpl-border-router-zigbit.zip|}}
==== 4 Steps to compile RPL-BORDER-ROUTER-ZIGBIT ====
- Copy folder ''rpl-border-router-zigbit'' to ''/examples/ipv6/rpl-border-router-zigbit/''
- Copy folder ''avr-zigbit'' to ''/platform/avr-zigbit/'' and replace the existing folder ''avr-zigbit''
- Copy File "rf230bb.c" to "/cpu/avr/radio/rf230bb/".
- Go to ''/examples/ipv6/rpl-border-router-zigbit/'' and type ''make TARGET=avr-zigbit''
After compiling, upload the file ''border-router.elf'' to Zigbit.
==== 4 Steps to connect rpl-border-router-zigbit with Instant Contiki ====
- Copy File ''tunslip6.c'' to ''/tools/tunslip6.c''
- Type ''make tunslip6''
- Connect your Zigbit with Instant Contiki and find the corresponding Port (type ''dmesg'', normally ttyUSB0)
- Start tunslip6 with ''sudo ./tunslip6 aaaa::1/64 -s /dev/ttyUSB0 -B 57600 -v6''
===== Hints =====
If the error ''/core/net/uip-nd6.c:667:7: error: 'prefix' undeclared'' occurs, change the file /core/net/uip-nd6.c from
#if !UIP_CONF_ROUTER // TBD see if we move it to ra_input
static uip_nd6_opt_prefix_info *nd6_opt_prefix_info; /** Pointer to prefix information option in uip_buf */
static uip_ipaddr_t ipaddr;
static uip_ds6_prefix_t *prefix; /** Pointer to a prefix list entry */
#endif
to
static uip_ds6_prefix_t *prefix; /** Pointer to a prefix list entry */
#if !UIP_CONF_ROUTER // TBD see if we move it to ra_input
static uip_nd6_opt_prefix_info *nd6_opt_prefix_info; /** Pointer to prefix information option in uip_buf */
static uip_ipaddr_t ipaddr;
//static uip_ds6_prefix_t *prefix; /** Pointer to a prefix list entry */
#endif