Benutzer-Werkzeuge

Webseiten-Werkzeuge


contiki:a-n-solutions-module:contiki-snmp

Anpassung des Contiki SNMP zur Verwendung auf den Modulen von Adaptive Network Solutions

Contiki SNMP (siehe SNMP auf Contiki 2.5 und Contiki 2.6) wurde so angepasst dass nun folgende Features auf den Modulen zur Verfügung stehen:

  • Betriebszustandsanzeige über LED DS3
  • Paketempfangssignalisierung über LED DS2
  • Port Pin Steuerung über SNMPv3 über LED DS1
  • Messung der Versorgungsspannung über ADC0 bei Anschluss eines 1:1 Spannungsteilers über die Versorgungsspannung

→ Pinbelegung und Schaltplan der Module siehe: brick_mcu_pinassignments_ref2.pdf

Betriebszustandsanzeige über LED DS3

Zur Signalisierung der Betriebszustandsanzeige wurden innerhalb des Contiki SNMP Prozesses (snmpd.c) zuerst alle LEDs als Ausgänge geschaltet, anschließend LED DS3 (PIN7) auf LOW geschaltet und somit aktiviert.

#include <avr/io.h>
 
	/*Switch LED on @ANY Brick On if SNMPD started and set other LEDs as Output*/
	DDRB |= (1 << PIN5);
	DDRB |= (1 << PIN6);
	DDRB |= (1 << PIN7);
	PORTB &= ~(1 << PIN7);
	PORTB |= (1 << PIN6);
	PORTB |= (1 << PIN5);
	/*END LED @ANY Brick*/

Paketempfangssignalisierung über LED DS2

Um das Eintreffen eines Pakets über uIPv6 visualisieren zu können, wurde die LED DS2 innerhalb der Funktion tcpip_input(void) innerhalb der Datei tcpip.c im Verzeichnis /core/net/ angepasst.

/*---------------------------------------------------------------------------*/
void
tcpip_input(void)
{
  /*sz*/
  /*Blinking LED on packet receiving*/
  PORTB &= ~(1 << PIN6);
  /*sz*/
 
  process_post_synch(&tcpip_process, PACKET_INPUT, NULL);
  uip_len = 0;
#if UIP_CONF_IPV6
  uip_ext_len = 0;
#endif /*UIP_CONF_IPV6*/
 
  /*sz*/
  /*Blinking LED on packet receiving*/
  PORTB |= (1 << PIN6);
  /*sz*/
}
/*---------------------------------------------------------------------------*/

Pin Steuerung über SNMPv3 über LED DS1

Zur Steuerung von LED DS2 wurden die GET und SET Funktionen innerhalb der Datei mib-init-beuth-zig.c des SNMP Daemons angepasst.

/* LED DS1 for @ANY module start */
/** \brief LED DS1 for @ANY module get function*/
s8t getBeuthState(mib_object_t* object, u8t* oid, u8t len)
{
    object->varbind.value.i_value = !((PORTB >> PIN5) & 1);
    return 0;
}
 
 
/** \brief set LED DS1 for @ANY module*/
s8t setBeuthState(mib_object_t* object, u8t* oid, u8t len, varbind_value_t value)
{
    if (value.i_value == 1) {
        PORTB &= ~(1 << PIN5);
    } else {
        PORTB |= (1 << PIN5);
    }
 
	return 0;
}
/* LED DS1 for @ANY module end */

Messung der Versorgungsspannung über ADC0 bei Anschluss eines 1:1 Spannungsteilers über die Versorgungsspannung

Zur Messung der Versorgungsspannung wurde der PIN des ADC0 mit einem Spannungsteiler beschaltet.

Als Referenzspannung wurden die stabilen intern verfügbaren 2,54V des Mikrocontrollers verwendet. Zur Initialisierung des ADCs sowie zur Abfrage des aktuellen Wertes sind die folgenden Funktionen innerhalb der Datei mib-init-beuth-zig.c notwendig.

/* battery power level*/
/************************/
 
/** \brief function for initialization of the adc*/
void adc_init()
{
    // AREF = AVcc
    ADMUX = (1<<REFS0)|(1<<REFS1); //intern 2.54V voltage reference
 
    // ADC Enable and prescaler of 128
    // 16000000/128 = 125000
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
 
/** \brief adc read function */
u16t adc_read()
{
    ADMUX = (ADMUX & 0xF8)|0;     // clears the bottom 3 bits before ORing
    // start single convertion
    // write '1' to ADSC
    ADCSRA |= (1<<ADSC);
    // wait for conversion to complete
    // ADSC becomes '0' again
    // till then, run loop continuously
    while(ADCSRA & (1<<ADSC));
 
    return (ADC);
}
 
/** \brief get function for the battery power level mib object*/
s8t getBattValue(mib_object_t* object, u8t* oid, u8t len)
{
	adc_init();
	u16t adc_value;
	int batt_level;
	adc_value=adc_read();
	batt_level=(((25400)/1024)*adc_value*2); //Reference Voltage 2.54Volts, 10Bit ADC, 
        //multiplied with ADC Read, multiplied with two because of the 1:1 voltage divider
 
    object->varbind.value.i_value = batt_level;
    return 0;
}
/*Battery Level end*/

Download und Kompilierung

Der komplette Quellcode kann hier heruntergeladen werden: atany-snmp.zip. Nach dem Entpacken sind folgende Kopiervorgänge nötig.

  1. Der Ordner snmp muss in das Verzeichnis /examples/ kopiert werden.
  2. Der Ordner snmpd muss in das Verzeichnis apps kopiert werden.
  3. Der Ordner avr-zigbit muss in das Verzeichnis platforms kopiert werden.
  4. Die Datei tcpip.c muss in das Verzeichnis /core/net/ kopiert werden.

Der Kompilierungsvorgang wird anschließend innerhalb des Ordners /examples/snmp/ mit dem Befehl make zigbit gestartet. Im Anschluß kann die neu erstellte Datei snmp-server.elf auf das @ANY Modul geladen werden.

Hinweise:

  • Innerhalb des Makefiles kann die MAC Adresse über die Compilerflags MAC_CONF_FREQUENCY und MAC_CONF_NUMBER angepasst werden. Gedacht ist hierbei MAC_CONF_FREQUENCY=0x09 für 900MHz und DMAC_CONF_FREQUENCY=0x24 für 2,4GHz. Über MAC_CONF_NUMBER kann die Knotennummer verändert werden.
#CFLAGS+= -DMAC_CONF_FREQUENCY=0x09 #900MHz
CFLAGS+= -DMAC_CONF_FREQUENCY=0x24 #2400MHz
CFLAGS+= -DMAC_CONF_NUMBER=0x02
  • Standardmäßig werden alle Knoten als Router konfiguriert um somit vermaschtes Routing verwenden zu können, dies ist über das Flag UIP_CONF_ROUTER innerhalb des Makefiles einstellbar.
  • Die Verwendung von Contiki SNMP ist in Benutzung von Contiki SNMP beschrieben.
contiki/a-n-solutions-module/contiki-snmp.txt · Zuletzt geändert: 2017/01/24 18:49 (Externe Bearbeitung)