lunes, 27 de febrero de 2012

Envío de correo en Python por SMTP

Cuando se desarrollan aplicaciones de software, muchas veces se hace necesario interactuar de forma automática con cuentas de correo, tanto para enviar, como para recibir y procesar mensajes. Por  ejemplo cuando se diseña un sistema que genera reportes automáticos y necesitamos enviarlos a través de correo electrónico, y cuando llega información y datos al correo, y es necesario que un programa los analice de forma automática.

En esta publicación explicaré como se envían correos a través del protocolo SMTP y se incluirá un código ejemplo para ilustrar el uso de la librería smtplib de Python. Dejaré para una próxima publicación la revisión de mensajes de entrada y el procesamiento de los mismos.

Protocolo SMTP (Simple Mail Transfer Protocol)

Este protocolo usa el modelo cliente-servidor, y permite que un cliente envíe un mensaje a uno o más receptores. La comunicación entre el cliente y el servidor se hace a través de líneas de texto en caracteres ASCII. Las respuestas del servidor constan de un código numérico seguido de un texto descriptivo, el carácter de separación entre órdenes es CRLF. Este protocolo de la capa de aplicación se funciona sobre el protocolo TCP y hace uso del puerto 25 en el servidor para el establecimiento de la conexión.

Código ejemplo

A continuación se muestra el código ejemplo de un mensaje de correo electrónico enviado a través de una cuenta de correo de gmail, desde la cuenta remitente@gmail.com a la dirección de correo destinatario@hotmail.com. Este código se puede usar para cualquier servidor de correo, siempre y cuando se tenga el nombre del servidor smtp (smtp.gmail.com para el caso de gmail) y una cuenta en el mismo para envío de correo.

Para la construcción del mensaje del ejemplo, se hace uso de la librería email.mime de Python, la cual incluye funciones para la correcta construcción de mensajes que se enviarán a través de correo electrónico. En este caso únicamente se incluye texto en el mensaje, sin embargo la librería permite incluir también archivos adjuntos en el correo.

# -*- coding:utf-8 -*-

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Datos de cuenta para envío
usuario_gmail = 'remitente'
password = 'passwordxxx'

# Correos de remitente y destinatario
origen = usuario_gmail + '@gmail.com'
destino = 'destinatario@hotmail.com'

# Creación del mensaje
msg = MIMEMultipart()
msg['Subject'] = "Prueba de envío SMTP"        # Asunto
msg['From'] = origen                # Remitente
msg['To'] = destino                # Correo destinatario

# Contenido del mensaje
msg.attach(MIMEText("Hola"))
msg.attach(MIMEText("Este mensaje es una prueba"))
msg.attach(MIMEText("Adiós"))

# Conexión con servidor smtp
sender = smtplib.SMTP('smtp.gmail.com')
sender.ehlo()
sender.starttls()

# Autenticación
sender.login(usuario_gmail, password)

sender.sendmail(origen, destino, msg.as_string())
sender.close()
    
print "Mensaje enviado correctamente"

Espero que este código les haya sido de mucha utilidad. En la entrada de la semana entrante ilustrare la forma de revisar correo y recuperar mensajes que llegan a la bandeja de entrada de la cuenta.

lunes, 10 de octubre de 2011

Red de área de almacenamiento (SAN)


Continuando con el tema de sistemas virtualizados e implementación de servidores, encontramos que en las compañías en donde se implementan servidores de gama media-alta, por lo general la capacidad de almacenamiento requerida supera los 5 TB. Para este tipo de soluciones, encontramos que el almancenamiento de la información dentro del mismo sistema de los servidores, puede no ser tan práctico, y es posible que se queden cortos en el momento de querer expandir el crecimiento del sistema.

Hoy en día, para servidores virtualizados y que corren aplicaciones en la nube, y de alta disponibilidad, es una mejor opción separar el almacenamiento de los servidores, y una SAN es una forma óptima de hacerlo.

Una SAN es básicamente un arreglo de discos duros, los cuales se encuentran administrados por controladoras especializadas, encargadas de gestionar las conexiones, transacciones a cada uno de los discos, y generar los arreglos de almacenamiento con redundancia para evitar pérdida de información en caso que falle algún disco. La SAN se diferencia de otro tipo de arreglo, como la (NAS - Network Attached Storage), en que la comunicación se realiza a muy bajo nivel, por ejemplo, mientras un servidor conectado a la NAS solicita un archivo en una ruta específica, un servidor conectado a la SAN solicita la información contenida en un bloque específico de un disco dado. Lo anterior hace que la comunicación entre los servidores y el sistema de almacenamiento sea más óptima y veloz en una SAN.

La conexión entre la SAN y el servidor se puede realizar a través de dos canales: fibra óptica o iSCSI. Mientras que por fibra la conexión es muy rápida, también implica altos costos en su implementación, pues requiere de tarjetas HBA y switches de fibra que son costosos. Por otro lado, mediante iSCSI los costos son menores, pero se sacrifica la velocidad.

A continuación se muestra un diagrama comparativo de los sistemas de almacenamiento:


De la figura anterior, se observa que la comunicación entre almacenamiento y servidor, se hace a más bajo nivel.

Últimamente en la compañía se realizó la implementación de un sistema AX4-5, originalmente fabricado por la compañía EMC, pero comercializado por DELL. Los componentes de esta unidad son: 1 sistema de controladoras, 1 enclosure de discos, 1 sistema de fuentes de alimentación de las controladoras. La instalación del sistema fue bastante sencilla, y se logró configurar de forma correcta.

La administración del sistema se hace a través de una interfaz web, a la cual se accede por la dirección IP que se le asigne a las controladoras de la SAN.

Se realizó conexión directa a 4 servidores con sistema operativo Vmware ESX, a través de fibra óptica y una vez conectados, las controladoras los reconocen automáticamente y ya es posible crear los diferentes grupos de almacenamiento y unidades lógicas de almacenamiento o LUNs, las cuales son reconocidas por los servidores como si fueran discos duros independientes.

A continuación comparto algunas fotos del sistema:

Vista Posterior de sistema de almacenamiento. De arriba hacia abajo: Enclosure de discos, unidades controladoras, fuentes de alimentación de controladoras.

Vista posterior de sistema de almacenamiento.


martes, 26 de julio de 2011

Redes VPN

Normalmente los terminales de las compañías y oficinas se encuentran interconectados a través de una Red de Acceso Local (LAN), la cual permite que los equipos puedan intercambiar información, y compartir recursos: archivos, carpetas e impresoras. Para que los equipos puedan tener acceso a esta red, tienen que estar conectados directamente a ella, ya sea a través desde un punto de acceso físico conectado a un switche y un router, o a través de una conexión inalámbrica. Los equipos que no estén cableados a la red, o que no tengan alcance a la red inalámbrica no podrán unirse a ésta, ni usar los servicios de la misma.

Algunas veces se hace necesario interconectar dos redes, o un terminal con una red remota, por ejemplo, para el caso de un empleado que debe tener acceso a sus archivos en su terminal de la oficina desde un sitio remoto, o interconexión entre dos filiales de la empresa. 

Internet permite el intercambio de datos entre dos equipos cualesquiera que se encuentren conectados a la Red; sin embargo, se presentan dos inconvenientes principales: Generalmente las direcciones IP son dinámicas, y únicamente los servidores y algunos equipos con privilegios mantienen direcciones IP públicas fijas; adicionalmente, Internet es una red pública, en la cual toda la información que se transmita está sujeta a ser interceptada y manipulada por terceros. De esta forma, transmitir datos directamente por Internet, sin ningún tipo de seguridad, es peligroso, sobre todo para las empresas que deben mantener reserva de mucha información relevante.

De acuerdo a las necesidades anteriormente planteadas, surgen las redes VPN (Red Privada Virtual), las cuales permiten crear redes con equipos que físicamente se encuentran distribuidos en diferentes redes locales. El medio de transmisión de la información de las VPN es a través de Internet, sin embargo, los datos son cifrados, de tal forma que únicamente pueden ser interpretados por el terminal y por el servidor de acceso de la VPN. En la siguiente figura se muestra el esquema de una red VPN:


Las redes VPN constan de un servidor VPN, encargado de gestionar las conexiones entrantes de los clientes, y de cifrar la información que se transmite a través de la red. Una vez un usuario se conecta, éste recibe una dirección IP virtual, tal como si se estuviera conectando a una red LAN, y como si un router le asignara una IP para la red local. Una vez conectados, los usuarios pueden compartir archivos, usar servicios como SSH, escritorios remotos, etc., estando físicamente en diferentes partes del mundo, y conectados a redes locales independientes, únicamente con acceso a Internet.

Existe una gran cantidad de herramientas para implementar VPN, algunas de ellas gratis, y otras licenciadas. El uso de la herramienta, depende de la aplicación final y del nivel de seguridad y operatividad deseado para la red. La herramienta OpenVPN es una herramienta adecuada y fácil de usar para la implementación de redes virtuales. En la página de OpenVPN se puede encontrar muy buena información y documentación para su manejo y administración.


jueves, 21 de julio de 2011

Virtualización de servidores

Hoy en día las pequeñas y medianas empresas, especialmente las del sector tecnológico, tienen la necesidad de implementar un servidor, en el cual puedan albergar servicios como: sitio Web, administración de documentación, plataformas de gestión de proyectos y de personal, almacenamiento de datos; y para empresas más especializadas: bases de datos, servidores de correo, servidores de autenticación, entre otros.

Los equipos y el hardware de los computadores avanza a pasos agigantados, y hoy en día es posible adquirir un equipo con capacidades excepcionales, a muy bajo costo relativo. De esta forma, los servicios de virtualización aprovechan estas capacidades de alto rendimiento de los servidores que se pueden adquirir en el mercado de hoy en día, y así es posible tener una gran cantidad de servidores virtuales, con uno o unos pocos servidores físicos.

Entre las principales ventajas que tienen los servidores virtualizados se encuentran:
  1. Poco hardware: Para tener muchos servidores ya no es necesario tener grandes centros de cómputo con complejos sistemas de interconexión, redes, fuentes de alimentación, y un gran consumo de energía. Por ejemplo, se pueden implementar fácilmente 50 servidores en un equipo físico con muy buenas características, instalado en un solo rack.
  2. Balance de cargas: Con los sistemas de virtualización existentes es posible sacarle un provecho máximo al hardware de procesamiento, ya que el sistema de administración de recursos permite asignar recursos a cada máquina dependiendo de sus necesidades, y de esta forma se asignan más recursos a los servidores que más carga tengan en el momento, y se liberan recursos de servidores que tengan poco trabajo.
  3. Alta disponibilidad: Es posible tener siempre servidores de backup para el caso que alguno se caiga o falle, el otro pueda entrar sin tener ni un solo instante de corte de servicio. Adicionalmente, el software de virtualización permite ingresar y retirar servidores sin necesidad de tener que apagar el sistema.
  4. Integración con otras herramientas: Las compañías que fabrican el software de virtualización incluyen herramientas interesantes que permiten ser aplicadas con la virtualización de servidores. Entre las herramientas que se ofrecen, se encuentra una para virtualización de escritorios, la cual le permite a los clientes tener toda la información y aplicaciones almacenadas en el servidor, pudiendo acceder desde cualquier parte y desde cualquier terminal con conexión a Internet.
Las dos principales compañías que fabrican software de virtualización para servidores son Vmware y Citrix.

Para una mayor información sobre software de virtualización, consultar la documentación en línea de Vmware y de Citrix.

jueves, 14 de julio de 2011

Single board computer

Un single board computer es básicamente una tarjeta que incluye todos los elementos que debe tener un computador tradicional, como procesador, memoria RAM, memoria no volátil, conectividad de red, puertos USB, salida para monitor, entre otros. Esta tarjeta es de un tamaño mucho más reducido que una motherboard normal.

En un sinble board computer es posible instalar un sistema operativo (Linux, android, inclusive Windows), y permite tener casi las mismas capacidades que un computador común y corriente, teniendo en cuenta que tiene recursos de procesador y memoria más limitados, pero trae consigo tres beneficios clave para determinadas aplicaciones: bajo costo, tamaño pequeño y bajo consumo de energía.

De esta forma, es posible desarrollar aplicaciones que requieran una gran cantidad de procesamiento, o interfaces de red e Internet, las cuales no se pueden implementar en un sistema con un microcontrolador, o sería demasiado complejas de diseñar desde ceros. Así, la implementación de la solución se reduce al desarrollo de software, sin tener que preocuparse por el hardware de interfaces de red, memoria, procesamiento, etc.

El equipo EFIKA MX SMARTTOP es un buen equipo, que incluye el sistema operativo Linux y soporta la ejecución de aplicaciones en python, c, c++, servicios Web, etc. A continuación se muestra una imagen de este sistema:

Las especificaciones técnicas del hardware son las siguientes:
  • Procesador Freescale i.MX515 (ARM Cortex-A8 800 MHz)
  • Unidad de procesamiento de gráficos 3D
  • Salida de video HDMI
  • 512 MB de RAM
  • Almacenamiento no volátil SSD de 8 GB
  • Ethernet de 10/100 Mbit/s
  • WiFi 802.11 b/g/n
  • Lector de tarjetas SDHC
  • 2 puertos USB
  • Salida de audio estéreo con jacks de 3.5 mm
  • Entrada de micrófono con jack de 3.5 mm
  • Parlante incorporado
  • Peso: 250 gramos
  • Dimensiones: 160 x 115 x 20 mm
Como se puede observar, incluye todas las características básicas de un computador de escritorio, y se envía con sistema operativo Linux Ubuntu preinstalado, de tal forma que únicamente basta con conectar teclado y mouse y encenderlo para comenzar a usarlo.

Lo más atractivo de este sistema son sus dimensiones y peso, lo cual lo hace útil incluso para ser usado en aplicaciones vehiculares, además es muy robusto pues no incluye partes móviles (disco duro); adicionalmente su consumo es bajo (menor que 5W a 12V), por lo cual es factible para ser usado en aplicaciones alimentadas con baterías.

Otro aspecto a fundamental para considerar un equipo de este tipo para determinada solución es su precio, aproximadamente 130 USD, el cual es muy reducido en comparación al precio de un computador de escritorio o portátil convencional.

En OSP Ltda. se adquirieron estos dispositivos con el fin de evaluarlos, y se llevaron a cabo las siguientes pruebas de forma exitosa:
  • Conexión a red WiFi.
  • Acceso a internet.
  • Permite instalación de aplicaciones haciendo uso de la herramienta de gestor de paquetes de Ubuntu.
  • Servidor de escritorio remoto.
  • Ejecuta correctamente aplicaciones desarrolladas en Python.
  • Soporta una Webcam conectada al puerto USB y permite capturar imágenes y videos.
  • Ejecuta aplicaciones tipo Web implementadas en en framework Django con el servidor Web de desarrollo de python.
Esta es una muy buena herramienta, con la cual se han obtenido buenos resultados en las pruebas que se han realizado, y es completamente recomendable para desarrollar aplicaciones en las cuales es necesario el poder de procesamiento y hardware de un computador, pero se requiere reducir tamaño, consumo y costos.

Dejo un video muy interesante de una conferencia donde se explica detalladamente el sistema:





martes, 28 de junio de 2011

Programador AVR dragon

Cuando se hace uso de microcontroladores para el desarrollo de aplicaciones, es necesario tener ciertas herramientas. Una herramienta esencial para desarrollar firmware para aplicaciones embebidas es el programador. Éste es fundamental, pues permite descargar el archivo compilado a la memoria de programa del dispositivo, e incluso permite programar la memoria de datos no volátil EEPROM. Sin un programador sería imposible desarrollar aplicaciones embebidas.

Los dispositivos AVR pueden ser programados de múltiples formas; sin embargo la más común y sencilla es a través de ISP. En cuanto a programadores, es posible fabricar un programador sencillo usando únicamente el puerto paralelo, el correspondiente cable y unas cuantas resistencias; sin embargo, como hoy en día ya casi ningún computador tiene puerto paralelo, esta opción no sería muy viable. Por otra parte, también es posible encontrar en línea diseños de programadores que hacen uso del puerto serial, pero lastimosamente también es obsoleto y se tendría que usar un cable convertidor o buscar otro tipo de solución.

Los programadores que se mencionaron anteriormente son de fabricación manual, y pueden fallar de vez en cuando en el momento de programar, por lo cual, siempre se debe efectuar verificación sobre la memoria programada.

Otra opción que es muy práctica, es el uso de bootloaders, que aprovechan una sección de la memoria de programa para guardar una rutina especial que permite auto-programar el dispositivo, el cual recibe los datos a través de un puerto serial o incluso USB. Este es el caso de los microcontroladores USB de Atmel, los cuales vienen por defecto con un bootloader que les permite ser programados a través del puerto USB, haciendo uso de un sencillo programa de Atmel (FLIP), que puede descargar y usar de forma gratuita. Sin embargo, este programa no funciona en el momento que se modifique el inicio del microcontrolador para que funcione como dispositivo USB y se realicen aplicaciones usando esta interfaz. Para este caso sí es necesario usar un programador.

Existen muchos programadores comerciales, sin embargo, una muy buena opción es el AVR DRAGON. Este programador es muy completo, y permite programación tanto a bajo voltaje como a alto voltaje, y además incluye una función de depuración sobre hardware, permitiendo incluir breakpoints en hardware.



¿Cómo usar esta herramienta?

Si es usuario de Windows, se recomienda usar el Dragon junto con el IDE AvrStudio de Atmel, el cual incluye una interfaz gráfica muy sencilla y una gran cantidad de herramientas para programar y depurar dispositivos. Permite modificar de forma amigable los fusibles del microcontrolador y escribir tanto en la memoria flash como en la EEPROM. Soporta todos los modos de programación del Dragon, y también permite actualizar el firware, y modificar parámetros como la frecuencia de oscilación del programador.

Lastimosamente la herramienta AvrStudio no está disponible para Linux, y si se tiene este sistema operativo se debe hacer uso de otra aplicación. La aplicación en Linux más usada para controlar el Dragon es el AvrDude, el cual se puede bajar e instalar fácilmente desde Internet; incluso está disponible en los repositorios de Ubuntu. En este caso, es necesario hacer la programación desde una ventana de comandos, donde se indica el dispositivo a programar, el modo de programación, la memoria a programar, etc. A continuación se muestra un ejemplo de comando de programación de dispositivo:

sudo avrdude -p atmega32u4 -c dragon_isp -P usb -U flash:w:programa.hex 

Para el anterior ejemplo "-p" indica el microcontrolador objetivo, "-c" el programador y el modo de programación, "-P" es el puerto al cual se encuentra conectado el programador y el comando "flash:w:programa.hex" indica que se escribirá la memoria flash con el programa almacenado en el archivo "programa.hex".

Por otra parte, el AvrDude incluye un modo consola, útil para depuración o para verificar sectores específicos de cualquiera de las memorias del microcontrolador. A continuación se muestra la forma para ingresar al modo terminal de AvrDude:


sudo avrdude -p atmega32u4 -c dragon_isp -P usb -t

Para este caso, se tienen en cuenta los mismos parámetros especificados anteriormente, excepto que se da la opción "-t" que indica entrada a modo consola.

Para información adicional acerca del AvrDragon, AvrStrudio o AvrDude, es posible encontrar muy buena documentación en línea en la página de Atmel, y en la página de documentación oficial de AvrDude.

Como recomendación final: el Dragon es una herramienta muy poderosa, pero también es extremadamente delicado, pues no incluye una caja de protección, sino que el circuito se encuentra completamente expuesto. No se debe tocar directamente, para evitar daños por descarga electrostática, tampoco se debe tocar cuando esté en funcionamiento porque se pueden ocasionar daños en los circuitos. Se debe tener mucho cuidado también para evitar cortocircuitos en los pines de programación, voltaje de alimentación adecuado, y conectar correctamente los correspondientes pines, por lo cual se deben revisar las conexiones dos veces antes de energizar y programar.

Link recomendado: http://www.administracionsatelital.com/

lunes, 13 de junio de 2011

Convertidor análogo-digital

Casi todas las variables que se pueden medir en la naturaleza varían de forma continua: sonido, luminosidad, humedad, temperatura, etc. Así, las señales que miden una variable física, constan de una serie de valores que cambian constantemente a lo largo de su variable independiente (generalmente tiempo o espacio). Por otra parte, los sistemas de control y de procesamiento son dispositivos completamente digitales, es decir, solamente aceptan determinados valores dentro de un rango específico. De esta forma, se deben controlar sistemas de naturaleza análoga, con dispositivos digitales.


Para convertir una variable física en una señal digital que pueda ser procesada por un microcontrolador, se deben llevar a cabo los siguientes pasos:


  1. Medición: Este procedimiento es realizado por un sensor, el cual incluye un transductor, mediante el cual es posible transformar las variables físicas en variables eléctricas (voltaje y corriente).
  2. Muestreo: Durante el muestreo se digitaliza la variable independiente, la cual generalmente es el tiempo. Para este caso, el muestreo consta en tomar valores de la señal original solamente en determinados instantes de tiempo. Los valores de la señal que se toman, aún conservan su naturaleza analógica.
  3. Cuantización: En el proceso de cuantización se asignan valores discretos a la señal muestreada. La asignación de estos valores depende directamente de la resolución.
  4. Codificación: Es el proceso final, en el cual a cada valor discreto de la señal se le asigna un código determinado, el cual, para el caso de los microcontoladores, es un número binario.

Un ADC lleva a cabo los pasos 3 y 4, cuantizando un determinado valor de voltaje (entre GND Y VCC), y posteriormente codificándolo en un número binario, cuyo rango depende de la resolución del ADC (para el caso de un ADC de 10 bits, entre 0 y 1023).

El módulo ADC de un microcontrolador es uno de sus módulos más importantes, hasta tal punto que la mayor parte de microcontroladores que se encuentran en el mercado hoy en día incluyen un módulo ADC, el cual permite adquirir señales analógicas, procesarlas y posteriormente enviar señales de control.

Existen varias técnicas para la conversión de señales análogas a digitales, entre las más importantes se encuentran: conversión por aproximaciones sucesivas, por integración, por contador y en paralelo. Cada una de estas técnicas tiene sus ventajas y sus desventajas. A continuación se explicará el método de aproximaciones sucesivas, ya que es el método que usa el módulo ADC de los microcontroladores AVR.

Conversión por aproximaciones sucesivas

El convertidor por aproximaciones sucesivas usa un convertidor digital/análogo, un circuito de lógica de control y un comparador. El proceso comienza desde el bit más significativo hasta el menos significativo. Así, la lógica de control activa cada bit y genera una señal análoga con el convertido digital/análogo, esta señal se compara con la señal de entrada y de acuerdo al resultado de la comparación el controlador cambia o deja el bit que se está examinando. Luego se continúa con el siguiente bit menos significativo hasta que se hace el recorrido por todos los bits. En la figura siguiente se muestra el proceso de conversión de un valor análogo (dado por la línea roja) usando un convertidor de 4 bits.



La principal ventaja de esta técnica es que el tiempo de conversión es siempre el mismo para cualquier entrada, pero su desventaja es la necesidad de usar un hardware complejo para su implementación.

Link recomendado: http://www.administracionsatelital.com/