domingo, 13 de octubre de 2013

Monitoreando ruteador con Raspberry Pi

Continuando con nuestros experimentos con el Rasperrry Pi. Decidimos crear un monitor de tráfico para el ruteador. Nuestra compañía de internet nos impone un límite mensual, por lo que nos es útil saber el consumo que llevamos en un día.

La primer opción fue escanear el tráfico directamente de la red e ir contando el tamaño de los datos transmitidos. Sin embargo, esta solución no funciono, ya que al estar conectados al ruteador, sólo recibimos paquetes que están destinados al Raspeberry o paquetes broadcast.

La segunda opción fue conectarse directamente al ruteador y extraer la información del tráfico del día. Para ello, primero nos conectamos manualmente al ruteador y monitoreamos el tráfico usando Wireshark, esto nos permitió aprender que el ruteador usa autenticación básica y que la página que contiene la información del tráfico se llama traffic.htm. Esto también nos ayudo a inspeccionar el contenido de traffic.htm y observar que una variable de javascript contiene la información que necesitamos.

Con toda esta información, la lógica del programa es muy sencilla.

  1. Inicializar IO y prender todos los LEDs durante 3 segundos para diagnosticar LEDs en mal estado.
  2. Ciclo infinito:
    1. Obtener traffic.htm del ruteador
    2. Extraer tráfico del día
    3. Desplegar en formato binario usando los LEDs el tráfico del día en cientos de MB
Está imagen es cuando el tráfico del día ha sido un poco más de 800MB.


El código en python es el siguiente:

import urllib2
import re
import base64
import time
import RPi.GPIO as GPIO

def get_router_page():
  theurl = 'http://192.168.1.1/traffic.htm'
  username = 'admin'
  password = 'your_password'
  req = urllib2.Request(theurl)
  
  # First try without username/password
  try:
    handle = urllib2.urlopen(req)
  except IOError, e:
    pass
  else:
    return handle.read()

  # Now try with authentication
  base64string = base64.encodestring(
                '%s:%s' % (username, password))[:-1]
  authheader =  "Basic %s" % base64string
  req.add_header("Authorization", authheader)
  
  try:
    handle = urllib2.urlopen(req)
  except IOError, e:
    print e
    return None
  
  return handle.read()


def get_traffic_in_MB(page):
  for line in page.split('\n'):
    match = re.search(
      r'\s*var\s*traffic_today_total\s*=\s*"(.*)"\s*;\s*', 
      line)
    if match:
      return match.group(1).replace(',','')
  return None


def is_bit_set(value, bit):
  mask = 1 << bit
  return (value & mask)


def display_traffic(traffic_MB):
  traffic_in_100_MB = int(float(traffic_MB) / 100)
  
  if traffic_in_100_MB > 31:
    traffic_in_100_MB = 31
  print traffic_in_100_MB
  GPIO.output(LED_0_PIN,is_bit_set(traffic_in_100_MB,0))
  GPIO.output(LED_1_PIN,is_bit_set(traffic_in_100_MB,1))
  GPIO.output(LED_2_PIN,is_bit_set(traffic_in_100_MB,2))
  GPIO.output(LED_3_PIN,is_bit_set(traffic_in_100_MB,3))
  GPIO.output(LED_4_PIN,is_bit_set(traffic_in_100_MB,4))


def init_IO():
  # Init outputs
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(LED_0_PIN,GPIO.OUT)
  GPIO.setup(LED_1_PIN,GPIO.OUT)
  GPIO.setup(LED_2_PIN,GPIO.OUT)
  GPIO.setup(LED_3_PIN,GPIO.OUT)
  GPIO.setup(LED_4_PIN,GPIO.OUT)
  
  # Test all leds
  GPIO.output(LED_0_PIN,True)
  GPIO.output(LED_1_PIN,True)
  GPIO.output(LED_2_PIN,True)
  GPIO.output(LED_3_PIN,True)
  GPIO.output(LED_4_PIN,True)
  time.sleep(3)
  GPIO.output(LED_0_PIN,False)
  GPIO.output(LED_1_PIN,False)
  GPIO.output(LED_2_PIN,False)
  GPIO.output(LED_3_PIN,False)
  GPIO.output(LED_4_PIN,False)

LED_0_PIN = 23
LED_1_PIN = 24
LED_2_PIN = 25
LED_3_PIN = 8
LED_4_PIN = 7
init_IO()

while True:
  page = get_router_page()
  if page is not None:
    traffic = get_traffic_in_MB(page)
    if traffic is not None:
      display_traffic(traffic)
  time.sleep(60)
GPIO.cleanup()


Saludos.

miércoles, 9 de octubre de 2013

Cómo almacenar una imagen en formato .bmp desde un osciloscopio Rigol DS1102CA

En varios de mis laboratorios que involucran el uso del osciloscopio para observar alguna señal de voltaje o corriente he visto que se me pide hacer un dibujo de lo que observo en la pantalla e incluirlo en el reporte final, sin embargo, creo que es mucho mejor incluir la imagen que aparece en la pantalla del osciloscopio.

Al principio comencé a tomar fotografías del osciloscopio hasta que me percaté de la entrada para USB que posee el modelo DS1102CA de Rigol (que es el que he utilizado con mayor frecuencia) y decidí investigar cómo utilizarla para almacenar las imágenes que se obtienen en la pantalla. Estos son los pasos a seguir para poder obtener una imagen con formato .bmp desde el osciloscopio usando un USB:

  1. Una vez que obtienes tus resultados en la pantalla, conecta tu USB en la entrada para USB del osciloscopio:
  2. Dentro del recuadro "Menu", presiona el botón "Storage":
  3. En la pantalla del osciloscopio aparece el menú correspondiente a las opciones para guardar información (Storage). Selecciona el formato en el que deseas guardar la imagen (en este caso Bit map), de no seleccionar este formato, la imagen se guarda por defecto como "Waveform" y no podrás visualizarla como lo haces con otras imágenes como .jpg o .bmp.
  4. En el menú de "Storage", selecciona la opción "External", la cual le indica al osciloscopio que usarás tu dispositivo USB para guardar la información (en este caso la imagen):
  5. Hecho lo anterior, observarás el siguiente menú de opciones:
    Puedes guardar el archivo con el nombre "NewFile0" que es el que aparece por defecto o puedes editar el nombre utilizando la perilla que se encuentra junto a los botones del recuadro "Menu". Para ello, solo gira la perilla y verás como navega hacia la izquierda o derecha seleccionando cada letra del alfabeto. Dependiendo del nombre que desees, posiciona el cursor con la perilla y presiónala para seleccionarla. Es un proceso algo lento así que te recomiendo que elijas un nombre corto pero significativo.
  6. Presiona el botón que está al lado de la opción "Save" (Guardar).
La imagen que guardé en mi USB para este ejemplo es la siguiente:

Una vez que termines de guardar las imágenes que deseas utilizar en tu trabajo, reporte, tarea, etc., puedes desconectar el USB. Guardar los resultados de algún experimento o laboratorio en forma de imagen te permite analizarlos mejor y con más precisión.