lunes, 27 de mayo de 2013

Aplicación de Redes sensora


Aplicación de las Redes de Sensores en el entorno vehicular



Que es una red sensorial?


Una red de sensores (del inglés sensor network) es una red de ordenadores pequeñísimos («nodos»), equipados con sensores, que colaboran en una tarea común.

Las redes de sensores están formadas por un grupo de sensores con ciertas capacidades sensitivas y de comunicación los cuales permiten formar redes inalámbricas Ad-Hoc sin infraestructura física preestablecida ni administración central.

Las redes de sensores es un concepto relativamente nuevo en adquisición y tratamiento de datos con múltiples aplicaciones en distintos campos tales como entornos industriales, domótica, entornos militares, detección ambiental.


Esta clase de redes se caracterizan por su facilidad de despliegue y por ser autoconfigurables, pudiendo convertirse en todo momento en emisor, receptor, ofrecer servicios de encaminamiento entre nodos sin visión directa, así como registrar datos referentes a los sensores locales de cada nodo. Otra de sus características es su gestión eficiente de la energía, que con ello conseguimos unas alta tasa de autonomía que las hacen plenamente operativas.

La miniaturización de ordenadores creciente dio a luz la idea de desarollar computadoras extremadamente pequeñas y baratas que se comunican de forma inalámbrica y se organizan autónomadamente. La noción es repartir aleatoriamente estos nodos en un territorio grande, el cual los nodos observan hasta que sus recursos energéticos se agoten. Los atributos «pequeño», «barato» y «autónomo» dieron a conocer la idea como polvo inteligente (smart dust).

Por el momento, las redes de sensores son sujetas de investigación en varias universidades; en su mayor parte la materia todavía está teorética. Por cierto, hay prototipos de nodos y aplicaciones especiales para demostraciones y investigaciones, pero hasta ahora no hay una instalación con empleo práctico.



Las redes sensoriales están formadas por un conjunto de nodos con un sensor acoplado que pueden monitorizar parámetros del entorno. Algunos de estos valores son:
Temperatura
Humedad
Humo
Luz
Sonido
Movimiento

La alimentación de la red sensorial se realiza de manera autónoma a través de baterías, lo que permite su instalación en sitios en los que no haya corriente eléctrica como campos de cultivo, bosques, invernaderos, jardines, etc. Los nodos de la red sensorial no necesitan emitir continuamente, basta con que tomen una muestra cada cierto periodo de tiempo y permanezcan en estado latente el resto del tiempo, optimizando así el consumo energético. De esta manera, se puede conseguir alimentar cada nodo durante meses con sólo dos pilas (AA).

Características

Escalabilidad: la capacidad de auto-organización de la red permite que la monitorización de mayores espacios pueda hacerse fácilmente añadiendo nuevos nodos. Si se añaden nuevos comunicadores, estos son reconocidos automáticamente por el resto, los cuales actualizarán sus tablas de rutas en consecuencia.
Alta disponibilidad: la misma característica de auto-organización permite que el área de monitorización también pueda reducirse. En caso de que un nodo deje de funcionar, el resto de valores pueden seguir siendo transmitidos por caminos alternativos gracias al algoritmo de enrutamiento dinámico, que se encarga de actualizar las rutas. De esta manera, se garantiza siempre el funcionamiento del resto de la red, al contrario de lo que sucedería con un modelo de comunicación centralizado.
Fácil Implantación: el hecho de que la comunicación sea inalámbrica, eliminando así la necesidad de trasladar cables de red, y que la alimentación se realice por medio de baterías, hace que la instalación sea fácil y posible en cualquier entorno, abriendo así un gran abanico de aplicaciones que pueden beneficiarse de esta tecnología.

Aplicación en el entorno vehicular

Por ejemplo en monterrey

En algunas avenidas instalaron con cables en el pavimento, esto es  para medir el flujo vehicular que se registra en la zona.

Dichos cables están conectados a una caja gris, misma que aparentemente, detecta las vibraciones que producen los autos al circular por encima de ellos.

Otro ejemplo muy sencillo

Son todas las funciones de monitoreo y control del motor, sistemas de seguridad y confort (ASR, ABS, airbag, ajuste del cinturón de seguridad, aire acondicionado, etc.), Los sensores se usan para registrar de
manera precisa los estados reales del motor en funcionamiento, tales como la presión de aceite del motor, la
temperatura del motor o el número de revoluciones, etc



Las principales son:
1. Remote Sensing: Optimización del uso de sistemas aéreos para diferentes aplicaciones dentro del proyecto. Estos sistemas están basados en helicópteros, dirigibles y aviones.
2. CCTV Inteligente: Desarrollo de cámaras inteligentes dedicadas a la detección y seguimiento de autobuses para la optimización de la administración del tráfico y la provisión del servicio.
3. Escáner láser: Desarrollo de escáneres láser avanzados para el reconocimiento de vehículos y la obtención de su velocidad.
4. Smart Dust: Investigación y desarrollo de aplicaciones basadas en smart dust (una red de sensores
microelectromecánicos, sin hilos y minúsculos) aplicadas al transporte, así como el desarrollo e implementación de las pruebas que validen estas técnicas.
5. Detección de peatones: El sistema disparará otros que impidan o minimicen la gravedad del atropello.
6. Ice Detection: Desarrollo de tecnologías que permitan reducir el coste, tamaño y mejoren los sensores actuales.
7. Cámara HDHR/CMOS: diseño de una cámara CMOS de alta resolución y rango dinámico alto para aplicaciones del transporte
8. Tecnologías avanzadas de identificación de vehículos: diseño de un emisor infrarrojo para identificar al vehículo en un carril y permita su localización.
9. Sistemas de inducción electro magnética: desarrollo de los sistemas de captura, los algoritmos de procesamiento y clasificación de estas señales.






Bibliografia
http://nuevastecnologias.awardspace.com/redes_de_sensores.htm
http://es.wikipedia.org/wiki/Red_sensorial
http://info7.mx/a/noticia/384419
http://www.albertolsa.com/wp-content/uploads/2010/04/rsi-aplicacion-de-las-redes-de-sensores-en-el-entorno-vehicular-alberto-los-santos.pdf

martes, 21 de mayo de 2013

Simulación de Movilidad


Red ad hoc

Una red ad hoc es una red inalámbrica descentralizada. La red no se basa en una infraestructura existente, tales como un router (en redes cableadas) o un punto de acceso en redes inalámbricas. Cada nodo participa en el encaminamiento mediante el envío de los datos para otros nodos, por lo que la determinación de que nodos encaminan sus datos se realiza dinámica mente sobre la base de la conectividad de red.

Se denomina ad hoc a cualquier conjunto de redes en las que todos los dispositivos tengan el mismo estatus en una red y son libres de asociarse con cualquier otro dispositivo de red ad hoc en el rango de enlace. Red Ad hoc a menudo se refiere al modo de funcionamiento de redes inalámbricas IEEE 802.11.

Los dispositivos implicados en una red de este tipo deben tener todos el mismo status siendo posible además la adhesión de nuevos dispositivos, con el solo hecho de estar en el rango de alcance de un nodo ya perteneciente a la red establecida. El protocolo que rige este tipo de comunicaciones es el 802.11, definiendo todos los parámetros necesarios para establecer la comunicación entre dispositivo inalámbricos. EL principal inconveniente de este tipo de redes radica en el número de saltos que debe recorrer la información antes de llegar a su destino. Cada nodo que retransmita la información es un salto, cuanto más saltos mayor es el tiempo que tarda en llegar la información a su destino pero aumenta la probabilidad de que la información se corrompa con cada salto.

Redes móviles ad hoc (MANETs)

Mobile ad hoc network (denominadas también MANET como acrónimo de Mobile ad hoc network) en algunas ocasiones denominada también como malla de nodos móviles (mobile mesh network), se trata de una red de dispositivos conectados por wireless y que poseen propiedades de auto-configuración, además de poseer cierta movilidad (es decir se encuentran montados en plataformas móviles) Las MANETs son un tipo de wireless ad hoc networks que forman, por regla general, una malla en rutable en forma de una capa de enlace de datos.

Características

Cada dispositivo en una MANET posee libertad para desplazarse independientemente en cualquier dirección, y eso permite que cambien dinámica mente las condiciones de enlace entre los dispositivos. Cada uno de ellos está desacoplado del tráfico y por lo tanto realiza misiones de router. Uno de los principales retos a la hora de construir MANET es lograr que sea posible equipar cada dispositivo para mantener continuamente la información necesaria para enrutar. Este tipo de redes puede operar de forma autónoma o ser conectada a Internet.


En esta parte el programa se trata de una comunicación con movilidad, radio de comunicación y consumo de batería o recurso por comunicación

Algunos aspectos en el programa se puso como un intervalo random de comunicación para ya que es necesario en todas las áreas para saber la actividad, aparte cuenta con un botón para forzar la comunicación y también de seleccionar su intensidad

Vídeo




Código




Sobre algunos puntos de información se investigo en las redes ad hoc
por eso se incluyo algún punto de comunicación aleatoria para saber si existe en comunicación
tanto la señal entre mas intensidad mas consumo de batería

Referencias
http://es.wikipedia.org/wiki/Red_ad_hoc
http://facultad.bayamon.inter.edu/cgonzalezr/ELEN4618/Adhoc.pdf

El programa se realizo en C#.Net

viernes, 10 de mayo de 2013

GEOLOCALIZACION



Para esta practica se utilizaron 3 modems Thomson(Telmex)

un ipod y un ipad mini

se utilizaron los mismos modelos de modems para transmitir la misma intensidad y alcance de la señal




El alcance de estos modems es de 30- 40 metros

y para captar la señal se utilizaron productos de la misma marca para que no hubiera cambios muy grandes

Los modem se colocaron de la siguiente manera
y los puntos azules son donde se tomaron las mediciones



Aquí una foto del lugar de la ubicación de los modems (Encerrados en un circulo rojo)

Ola k Ase, Robandose el internet o ke
En esta parte se muestra un profesor preguntando y diciendo que no se puede poner estos equipos en la escuela
Umbrella Corp
Infinitum6A8AFA


Aquí una foto de las mediciones(porcentaje intensidad de la señal)


Sobre las ubicaciones se toma con respecto
Intensidad 100% =40 metros
ya que es un lugar libre y existía muy poca interferencia


martes, 7 de mayo de 2013

Satélites(Extra)


En la actualidad el flujo de comunicaciones, ha venido tomando tales dimensiones que el medio está formando nuevos tipos de usuarios, que exigen una mayor cobertura para los servicios de comunicación a los que están acogidos.




ACTUALMENTE EXISTEN APROXIMADAMENTE 4000 SATÉLITES EN ÓRBITA Y ESTOS SE DIVIDEN EN TRES TIPOS...

TIPOS DE SATÉLITES.

Por su órbita:

La visibilidad de un satélite depende de su órbita, y la órbita más simple para considerar es redonda. Una órbita redonda puede caracterizarse declarando la altitud orbital (la altura de la nave espacial sobre la superficie de la Tierra) y la inclinación orbital (el ángulo del avión orbital del satélite al avión ecuatorial de la Tierra).

Cuando un satélite se lanza, se pone en la órbita alrededor de la tierra. La gravedad de la tierra sostiene el satélite en un cierto camino, y ese camino se llama una " órbita ". hay varios tipos de órbitas. Aquí son tres de ellos.

Satélites de órbita geoestacionaria

Satélites de órbita baja (LEO)

Satélites de órbita elíptica excéntrica (Molniya)

Satélites Geoestacionarios (GEO)

En una órbita circular ecuatorial de altitud 35.786 Km.

Centenares de satélites de comunicaciones están situados a 36.000 Km de altura y describen órbitas circulares sobre la línea ecuatorial. A esta distancia el satélite da una vuelta a la Tierra cada 24 horas permaneciendo estático para un observador situado sobre la superficie terrestre. Por tal razón son llamados geoestacionarios.

Satélites de Órbita Media (MEO)

Altitud de 9.000 a 14.500 Km. De 10 a 15 satélites son necesarios para abarcar toda la Tierra.

Satélites de Órbita Baja (LEO)

Altitud de 725 a 1.450 Km. Son necesarios más de unos 40 satélites para la cobertura total.

Los satélites proyectan haces sobre la superficie terrestre que pueden llegar a tener diámetros desde 600 hasta 58.000 Km. Como se observa en la figura, los haces satelitales son divididos en celdas, cuyas frecuencias pueden ser reutilizadas en diferentes celdas no adyacentes, según un patrón conforme al Seamless handover.

Por su finalidad:

Satélites de Telecomunicaciones (Radio y Televisión)

Satélites Meteorológicos.

Satélites de Navegación.

Satélites Militares y espías.

Satélites de Observación de la tierra.

Satélites Científicos y de propósitos experimentales.

Un gran ejemplo de satélite podría ser el IRIDIUM que es ocupado principalmente para el uso en la telefonía celular.

Características:

Iridium consta de 66 satélites LEO los cuales se encuentran a una altitud de 725-1450 Km., cada satélite pesa aproximadamente 700 Kg. su periodo de vida activa es de 5 a 8 años y su margen de enlace es de 16 dB.

Paso que sigue una llamada desde un teléfono satelital

-Cuando un teléfono se active se conectará al satélite más próximo.

-Gracias a la red de estaciones terrenas el satélite podrá determinar la validez de la cuenta y situación del usuario.

-El usuario podrá realizar una llamada eligiendo entre las alternativas de

transmisión celular terrestre o vía satélite.

-En caso de no estar disponible el sistema celular del abonado, el teléfono comunicará automáticamente con el satélite.

-La llamada será transferida de satélite en satélite a través de la red hasta su

destino (un teléfono Iridium o una pasarela Iridium)

BANDAS DE FRECUENCIAS UTILIZADAS POR LOS SATELITES.

Banda P      

200-400 Mhz.

Bamda L

1530-2700 Mhz.

Banda S

2700-3500 Mhz.

Banda C

3700-4200 Mhz.
4400-4700 Mhz.

Banda X

7900-8400 Mhz.

Banda Ku1 (Banda PSS)        

10.7-11.75 Ghz.

Banda Ku2 (Banda DBS)

11.75-12.5 Ghz.

Banda Ku3 (Banda Telecom)

12.5-12.75 Ghz.

Banda Ka

17.7-21.2 Ghz.

Banda K

27.5-31.0 Ghz.

1 Mhz.= 1000.000 Hz.
1 Ghz.= 1000.000.000 Hz.

Este enlace contiene una información mas detallada de los satélites

http://mx.answers.yahoo.com/question/index?qid=20071013170452AAhHba8%3C


En esta pagina puedes saber la información de cada uno he incluso seguir el movimiento en tiempo real del satélite seleccionado

http://www.n2yo.com/?s=25544

Referencias
http://www.dtforum.net/index.php?PHPSESSID=9c91e7590788694a6eb16063568fc6ed&topic=53641.0
http://mx.answers.yahoo.com/question/index?qid=20071013170452AAhHba8
http://www.monografias.com/trabajos63/satelites-comunicacion/satelites-comunicacion.shtml
http://www.fao.org/docrep/006/W9633S/w9633s0b.htm#TopOfPage

martes, 26 de febrero de 2013

Simuladores de Redes


Primero que es ns?

Es un simulador de redes basado en eventos discretos.

Se usa principalmente en ambientes educativos y de investigación. Permite simular tanto protocolos unicast como multicast y se utiliza intensamente en la investigación de redes móviles ad-hoc. Implementa una amplia gama de protocolos tanto de redes cableadas como de redes inalámbricas. La versión actual, ns-3, esta diseñada para soportar todo el flujo de trabajo de la simulación desde la configuración hasta la recolección y análisis de tramas.

ns es software libre, se ofrece bajo la versión 2 de la GNU General Public License. Cuenta con dos versiones ns-2 y ns-3 que en general son incompatibles.

Básicamente todo el texto se refiere a que:

Se evalúan algunas características para garantizar calidad de servicio como el ancho de banda y la pérdida de paquetes.

En la calidad de servicio existen dos tipos de tecnologías de QoS asociadas hasta cierto punto directamente con IP.
 La primera de ellas denominada servicios diferenciados, se caracteriza por marcar los paquetes de acuerdo a su prioridad, mientras que la segunda tecnología, denominada servicios integrados, se basa en reserva y asignación de recursos dependiendo del tipo de tráfico

Sobre una topología de red que involucra tres tipos de tráfico (CBR, Pareto y Exponencial). 

Se implementan cinco configuraciones diferentes en el simulador de redes NS2, donde el primero corresponde a un caso sin QoS, con una capacidad de canal que es suficientemente grande para trasmitir los tres tipos de tráfico, mientras que en las siguientes cuatro configuraciones la capacidad se reduce a un menor tamaño y se estudian diferentes casos de calidad de servicio.

Para observar el comportamiento de los tráficos se implementa inicialmente una red sin QoS con dos tipos de encolamiento y posteriormente se realiza una configuración que implementa QoS mediante los modelos IntServ y DiffServ.

Los resultados obtenidos de estas simulaciones son graficados y comparados con el fin de determinar el comportamiento más adecuado en redes IP.

En fin esta es una revisión sobre los principales simuladores de red y la importancia de estos para los procesos de investigación y desarrollo de las telecomunicaciones así como de la efectividad de los mismos para recrear de manera suficientemente aproximada los procesos que se realizan en las redes reales ya que con el uso de estas herramientas se están analizando y probando los nuevos protocolos de red, siendo de gran importancia poder contar con resultados confiables generados a partir de procesos de simulación.

--


Lo importante al momento de implementar una topología deben tenerse en cuentas diversos aspectos, muchos de los cuales fueron mencionados durante la evaluación de cada modelo. Aspectos como el retardo, la latencia o jitter, las pérdidas

Sin embargo existe un aspecto no mencionado pero fundamental a tener en cuenta y es la 
aplicación que esta red tendrá. Deben conocerse muy bien los tráficos que se trabajarán con 
el fin de establecer si se requiere una red con pérdidas equitativas para cada fuente de transmisión, o si solo algunas de las fuentes son importantes.

Surge entonces la necesidad de seleccionar alguno de los dos modelos. El modelo IntServ 
aunque garantiza el ancho de banda para el tipo de tráfico seleccionado, deja los tráficos 
restantes sin QoS, causando que luchen entre ellos para poder enviar sus paquetes, a diferencia del modelo DiffServ, el cual asigna un tipo de prioridad a cada tipo te tráfico otorgando así una calidad de servicio diferente a cada uno, por ello, con DiffServ se pierde mucha información de un tipo de datos si estos tienen asignado el valor más bajo de prioridad y si el canal se encuentra saturado por mucho tiempo.

lunes, 25 de febrero de 2013

Experimentos de Calidad de Servicio



QoS o Calidad de Servicio (Quality of Service, en inglés) son las tecnologías que garantizan la transmisión de cierta cantidad de información en un tiempo dado (throughput). Calidad de servicio es la capacidad de dar un buen servicio. Es especialmente importante para ciertas aplicaciones tales como la transmisión de vídeo o voz

Problemas en redes de datos conmutados

Muchas cosas le ocurren a los paquetes desde su origen al destino, resultando los siguientes problemas vistos desde el punto de vista del transmisor y receptor:Paquetes sueltos

los ruteadores pueden fallar en liberar algunos paquetes si ellos llegan cuando los buffers ya están llenos. Algunos, ninguno o todos los paquetes pueden quedar sueltos dependiendo del estado de la red, y es imposible determinar que pasará de antemano. La aplicación del receptor puede preguntar por la información que será retransmitida posiblemente causando largos retardos a lo largo de la transmisión.Retardos

puede ocurrir que los paquetes tomen un largo período en alcanzar su destino, debido a que pueden permanecer en largas colas o tomen una ruta menos directa para prevenir la congestión de la red. En algunos casos, los retardos excesivos pueden inutilizar aplicaciones tales como VoIP o juegos en línea.Jitter

los paquetes del transmisor pueden llegar a su destino con diferentes retardos. Un retardo de un paquete varía impredeciblemente con su posición en las colas de los ruteadores a lo largo del camino entre el transmisor y el destino. Esta variación en retardo se conoce como jitter y puede afectar seriamente la calidad del flujo de audio y/o vídeo.Entrega de paquetes fuera de orden

cuando un conjunto de paquetes relacionados entre sí son encaminados a Internet, los paquetes pueden tomar diferentes rutas, resultando en diferentes retardos. Esto ocasiona que los paquetes lleguen en diferente orden de como fueron enviados. Este problema requiere un protocolo que pueda arreglar los paquetes fuera de orden a un estado isócrono una vez que ellos lleguen a su destino. Esto es especialmente importante para flujos de datos de vídeo y VoIP donde la calidad es dramáticamente afectada tanto por latencia y pérdida de sincronía.Errores

A veces, los paquetes son mal dirigidos, combinados entre sí o corrompidos cuando se encaminan. El receptor tiene que detectarlos y justo cuando el paquete es liberado, pregunta al transmisor para repetirlo así mismo.


Primero 
el test se realizo con las siguientes velocidades

Telcel 3G/E


Telmex infinitum


las pruebas se realizaron en un xbox360/wifi

Telcel 3G/E


Prueba Infinitum


Se realizaron con la misma calidad

La perdida de paquetes es muy baja
para forzar la perdida de paquetes se conectaron varias pc a la red y empezamos a descargar cosas
en este caso si empezó a ver mas notable la baja velocidad del vídeo he incremento de perdida de paquetes pero seguía siendo muy poco porcentaje

martes, 19 de febrero de 2013

Experimentos de monitoreo

Experimentos de monitoreo

En esta ocacion se intento monitorear la pagina del s... la escuela
El monitoreo se realizo con un programa para "Hackear/ modificar juegos en linea"
Cheat engine
el cual se puede utilizar para diversas paginas ya que el programa no trabaja para un juego en especifico
yo realice las pruebas en juegos como el diamon dash de facebook y se aceleraba el tiempo
también puede acelerar descargas como lo veremos en el siguiente vídeo


..

básicamente el programa toma todos los cambios de la pagina y puedes buscar los valores para no estar checando todas las direcciones

El video realizado
esta subiéndose ya que se tuvo algunos problemas con el grabado y la computadora :P

martes, 12 de febrero de 2013

Implementación De Un Protocolo


En los sockets TCP es necesario establecer una conexión. El servidor TCP espera que un cliente TCP se le conecte. Una vez hecha la conexión, se pueden enviar mensajes. El protocolo TCP garantiza que todos los mensajes enviados van a llegar bien y en el orden enviado. Sólo el cliente necesita saber dónde está el servidor y en qué puerto está escuchando.

Por el contrario, en los sockets UDP no se establece conexión. El servidor se pone a la escucha de un puerto de su ordenador. El cliente también se pone a la escucha de un puerto de su ordenador. En cualquier momento, cualquiera de ellos puede enviar un mensaje al otro. Ambos necesitan saber en qué ordenado y en qué puerto está escuchando el otro. Aquí el concepto de cliente y servidor está un poco más difuso que en el caso de TCP. Podemos considerar servidor al que espera un mensaje y responde. Cliente sería el que inicia el trasiego de mensajes. El servidor debería, además, estar siempre arrancado y a la escucha.

Además, en contra de TCP, el protocolo UDP sólo garantiza que si el mensaje llega, llega bien. No garantiza que llegue ni que lleguen en el mismo orden que se han enviado. Este tipo de sockets es útil para el envío más o menos masivo de información no crucial. Por ejemplo, enviar los datos para el refresco de gráficos en una pantalla.

Otra ventaja de UDP respecto a TCP, es que con UDP se puede enviar un mensaje a varios receptores a la vez, mientras que en TCP, al haber una conexión previa, sólo se puede enviar el mensaje al que está conectado al otro lado. Con UDP se puede, por ejemplo, enviar una sola vez los datos para que varias pantallas refresquen sus gráficos a la vez.


LA CLASE DatagramSocket

Tanto cliente como servidor, para ponerse a la escucha de un puerto UDP, únicamente tienen que instanciar la clase DatagramSocket, pasándole los parámetros adecuados:
El número de puerto que están escuchando.
El InetAddress del ordenador en que se está corriendo cada uno, habitualmente InetAddress.getLocalHost();

Por ello, el código del servidor es tan sencillo como esto
ServidorUdp.java
DatagramSocket socket = new DatagramSocket(
           Constantes.PUERTO_DEL_SERVIDOR,
           InetAddress.getByName("localhost"));

y el del cliente se parece bastante

ClienteUdp.java
DatagramSocket socket = new DatagramSocket(
         Constantes.PUERTO_DEL_CLIENTE,
          InetAddress.getByName("localhost"));



LA CLASE DatagramParcket

Esta es la clase que se va a enviar y recibir como mensaje. Lleva dentro un array de bytes que es el que debemos rellenar con lo queremos enviar o en el que estará lo que hemos recibido.

Dependiendo de si es para enviar o recibir, esta clase se instancia de forma distinta. En ambos casos hay que pasarle el array de bytes. En el caso de enviar, hay que pasarle además la InetAdress del destinatario y el puerto en el que está escuchando el destinatario.
Para enviar

DatagramPacket dato = new DatagramPacket(
   elDatoEnBytes, // El array de bytes
   elDatoEnBytes.length, // Su longitud
   InetAddress.getByName(Constantes.HOST_SERVIDOR),  // Destinatario
   Constantes.PUERTO_DEL_SERVIDOR);   // Puerto del destinatario
Para recibir
DatagramPacket dato = new DatagramPacket(new byte[100], 100);

ENVIAR Y RECIBIR LOS DatagramPacket
Para enviar el DatagramPacket, debemos llamar al método send() de DatagramSocket pasando como parámetro el DatagramPacket que acabamos de crear.
Enviar DatagramPacket
socket.send(dato);

Para recibir, igual pero con socket.receive().

Recibir DatagramPacket
socket.receive(dato);


CONVERTIR UNA CLASE Serializable A ARRAY DE BYTES Y VICEVERSA
Lo de meter un array de bytes en el DatagramPacket está muy bien si leemos bytes de un fichero o de algún otro sitio. Sin embargo, si queremos enviar o recibir clases (Serializable, por supuesto), tenemos que hacer una conversión. Los siguientes código nos ayudan a hacer este tipo de conversiones. Suponemos que la clase se llamaDatoUdp y que implenta la interface Serializable.

De Serializable a byte[]

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream (bytes);
os.writeObject(this); // this es de tipo DatoUdp
os.close();
return bytes.toByteArray(); // devuelve byte[]

De byte[] a Serializable

ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes); // bytes es el byte[]
ObjectInputStream is = new ObjectInputStream(byteArray);
DatoUdp aux = (DatoUdp)is.readObject();
is.close();
return aux;

EL EJEMPLO
Con todo esto ya sabemos lo necesario para hacer un pequeño ejemplo de Servidor udp y cliente udp

Constantes
/** Constantes para el ejemplo de envío y recepción con socket udp. */
public class Constantes
{
    /** Puerto en el que escucha el servidor. */
    public static final int PUERTO_DEL_SERVIDOR=5557;
   
    /** Puerto en el que escucha el cliente */
    public static final int PUERTO_DEL_CLIENTE=5558;
   
    /** Host en el que está el servidor */
    public static final String HOST_SERVIDOR="localhost";
   
    /** Host en el que está el cliente */
    public static final String HOST_CLIENTE="localhost";

Dato udp


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class DatoUdp implements Serializable
{
    /**
     * serial uid
     */
    private static final long serialVersionUID = 3258698714674442547L;

    /**
     * Crea una instancia de la clase, guardando la cadena que se le pasa.
     * @param cadena
     */
    public DatoUdp (String cadena)
    {
        this.cadenaTexto=cadena;
    }
    public String cadenaTexto;
 
    /**
     * Se autoconvierte esta clase a array de bytes.
     * @return La clase convertida a array de bytes.
     */
    public byte [] toByteArray()
    {
        try
        {
             // Se hace la conversión usando un ByteArrayOutputStream y un
             // ObjetOutputStream.
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream (bytes);
            os.writeObject(this);
            os.close();
            return bytes.toByteArray();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
 
    /**
     * Se convierte el array de bytes que recibe en un objeto DatoUdp.
     * @param bytes El array de bytes
     * @return Un DatoUdp.
     */
    public static DatoUdp fromByteArray (byte [] bytes)
    {
        try
        {
            // Se realiza la conversión usando un ByteArrayInputStream y un
            // ObjectInputStream
            ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
            ObjectInputStream is = new ObjectInputStream(byteArray);
            DatoUdp aux = (DatoUdp)is.readObject();
            is.close();
            return aux;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}


Cliente

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * Abre un socket udp y envía por él 10 mensajes consistentes en 10 clases
 *
 */
public class ClienteUdp
{

    /**
     * Programa de prueba. Instancia esta clase
     * @param args
     */
    public static void main(String[] args)
    {
        new ClienteUdp();
    }

    /**
     * Crea una instancia de esta clase y envía los 10 mensajes
     *
     */
    public ClienteUdp()
    {
        try
        {

            // La IP es la local, el puerto es en el que este cliente esté
            // escuchando.
            DatagramSocket socket = new DatagramSocket(
                    Constantes.PUERTO_DEL_CLIENTE, InetAddress
                            .getByName("localhost"));

            // Se instancia un DatoUdp y se convierte a bytes[]
            DatoUdp elDato = new DatoUdp("hola");
            byte[] elDatoEnBytes = elDato.toByteArray();

            // Se meten los bytes en el DatagramPacket, que es lo que se
            // va a enviar por el socket.
            // El destinatario es el servidor.
            // El puerto es por el que esté escuchando el servidor.
            DatagramPacket dato = new DatagramPacket(elDatoEnBytes,
                    elDatoEnBytes.length, InetAddress
                            .getByName(Constantes.HOST_SERVIDOR),
                    Constantes.PUERTO_DEL_SERVIDOR);
           
            // Se envía el DatagramPacket 10 veces, esperando 1 segundo entre
            // envío y envío.
            for (int i = 0; i < 10; i++)
            {
                System.out.println("Envio dato " + i);
                socket.send(dato);
                Thread.sleep(1000);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
Servidor udp

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * Servidor de udp que se pone a la escucha de DatagramPacket que contengan
 * dentro DatoUdp y los escribe en pantalla.
 */
public class ServidorUdp
{

    /**
     * Prueba del prorama ServidorUdp
     *
     * @param args
     */
    public static void main(String[] args)
    {
        new ServidorUdp();
    }

    /**
     * Crea una instancia de esta clase, poniendose a la escucha del puerto
     * definido en Constantes y escribe en pantalla todos los mensajes que le
     * lleguen.
     */
    public ServidorUdp()
    {
        try
        {

            // La IP es la local, el puerto es en el que el servidor esté
            // escuchando.
            DatagramSocket socket = new DatagramSocket(
                    Constantes.PUERTO_DEL_SERVIDOR, InetAddress
                            .getByName("localhost"));

            // Un DatagramPacket para recibir los mensajes.
            DatagramPacket dato = new DatagramPacket(new byte[100], 100);

            // Bucle infinito.
            while (true)
            {
                // Se recibe un dato y se escribe en pantalla.
                socket.receive(dato);
                System.out.print("Recibido dato de "
                        + dato.getAddress().getHostName() + " : ");
               
                // Conversion de los bytes a DatoUdp
                DatoUdp datoRecibido = DatoUdp.fromByteArray(dato.getData());
                System.out.println(datoRecibido.cadenaTexto);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
Deberías ver cómo el cliente envía 10 mensajes y el servidor los escribe en pantalla. Si no ejecutas ambos programas en el mismo ordenador, tendrás que cambiar los fuentes para que el cliente tenga el nombre del servidor.


martes, 5 de febrero de 2013

Protocolo RFC




SMTP Extension for Internationalized Email
RFC 6531



Extensión SMTP para el correo electrónico internacionalizados


Es un protocolo de la capa de aplicación. Protocolo de red basado en texto, utilizados para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos (PDA, teléfonos móviles, etc.)

La mayoría de los sistemas de correo electrónico que envían correo a través de Internet utilizan SMTP para enviar mensajes de un servidor a otro, los mensajes se pueden recuperar con un cliente de correo electrónico utilizando POP o IMAP . Además, SMTP es generalmente utilizado para enviar mensajes desde un cliente de correo a un servidor de correo. Por ello, es necesario especificar tanto el servidor POP o IMAP y el servidor SMTP cuando configure su dirección de e-mail solicitud .

SMTP se basa en el modelo cliente-servidor, donde un cliente envía un mensaje a uno o varios receptores.
La comunicación entre el cliente y el servidor consiste enteramente en líneas de texto compuestas por caracteres ASCII. El tamaño máximo permitido para estas líneas es de 1000 caracteres.
Las respuestas del servidor constan de un código numérico de tres dígitos, seguido de un texto explicativo. El número va dirigido a un procesado automático de la respuesta por autómata, mientras que el texto permite que un humano interprete la respuesta. En el protocolo SMTP todas las órdenes, réplicas o datos son líneas de texto, delimitadas por el carácter <CRLF>. Todas las réplicas tienen un código numérico al comienzo de la línea.
En el conjunto de protocolos TCP/IP, el SMTP va por encima del TCP, usando normalmente el puerto 25 en el servidor para establecer la conexión.


Resumen simple del funcionamiento del protocolo SMTP

· Cuando un cliente establece una conexión con el servidor SMTP, espera a que éste envíe un mensaje “220 Service ready” o “421 Service non available”
· Se envía un HELO desde el cliente. Con ello el servidor se identifica. Esto puede usarse para comprobar si se conectó con el servidor SMTP correcto.
· El cliente comienza la transacción del correo con la orden MAIL FROM. Como argumento de esta orden se puede pasar la dirección de correo al que el servidor notificará cualquier fallo en el envío del correo (Por ejemplo, MAIL FROM:<fuente@host0>). Luego si el servidor comprueba que el origen es válido, el servidor responde “250 OK”.
· Ya le hemos dicho al servidor que queremos mandar un correo, ahora hay que comunicarle a quien. La orden para esto es RCPT TO:<destino@host>. Se pueden mandar tantas órdenes RCPT como destinatarios del correo queramos. Por cada destinatario, el servidor contestará “250 OK” o bien “550 No such user here”, si no encuentra al destinatario.· Una vez enviados todos los RCPT, el cliente envía una orden DATA para indicar que a continuación se envían los contenidos del mensaje. El servidor responde “354 Start mail input, end with <CRLF>.<CRLF>” Esto indica al cliente como ha de notificar el fin del mensaje.
· Ahora el cliente envía el cuerpo del mensaje, línea a línea. Una vez finalizado, se termina con un <CRLF>.<CRLF> (la última línea será un punto), a lo que el servidor contestará “250 OK”, o un mensaje de error apropiado.
· Tras el envío, el cliente, si no tiene que enviar más correos, con la orden QUIT corta la conexión. También puede usar la orden TURN, con lo que el cliente pasa a ser el servidor, y el servidor se convierte en cliente. Finalmente, si tiene más mensajes que enviar, repite el proceso hasta completarlos. Puede que el servidor SMTP soporte las extensiones definidas en el RFC 1651, en este caso, la orden HELO puede ser sustituida por la orden EHLO, con lo que el servidor contestará con una lista de las extensiones admitidas. Si el servidor no soporta las extensiones, contestará con un mensaje "500 Syntax error, command unrecognized".


En el ejemplo pueden verse las órdenes básicas de SMTP:

· HELO, para abrir una sesión con el servidor
· MAIL FROM, para indicar quien envía el mensaje
· RCPT TO, para indicar el destinatario del mensaje
· DATA, para indicar el comienzo del mensaje, éste finalizará cuando haya una línea únicamente con un punto.
· QUIT, para cerrar la sesión
· RSET Aborta la transacción en curso y borra todos los registros.
· SEND Inicia una transacción en la cual el mensaje se entrega a una terminal.
· SOML El mensaje se entrega a un terminal o a un buzón.
· SAML El mensaje se entrega a un terminal y a un buzón.
· VRFY Solicita al servidor la verificación del argumento.
· EXPN Solicita al servidor la confirmación del argumento.
· HELP Permite solicitar información sobre un comando.
· NOOP Se emplea para reiniciar los temporizadores.
· TURN Solicita al servidor que intercambien los papeles.

De los tres dígitos del código numérico, el primero indica la categoría de la respuesta, estando definidas las siguientes categorías:

· 2XX, la operación solicitada mediante el comando anterior ha sido concluida con éxito
· 3XX, la orden ha sido aceptada, pero el servidor esta pendiente de que el cliente le envíe nuevos datos para terminar la operación
· 4XX, para una respuesta de error, pero se espera a que se repita la instrucción
· 5XX, para indicar una condición de error permanente, por lo que no debe repetirse la orden

Una vez que el servidor recibe el mensaje finalizado con un punto puede almacenarlo si es para un destinatario que pertenece a su dominio, o bien retransmitirlo a otro servidor para que finalmente llegue a un servidor del dominio del receptor.

Ejemplo de una comunicación SMTP

En primer lugar se ha de establecer una conexión entre el emisor (cliente) y el receptor (servidor). Esto puede hacerse automáticamente con un programa cliente de correo o mediante un cliente telnet.

En el siguiente ejemplo se muestra una conexión típica. Se nombra con la letra C al cliente y con S al servidor.

S: 220 Servidor ESMTP
C: HELO miequipo.midominio.com
S: 250 Hello, please to meet you
C: MAIL FROM: <yo@midominio.com>
S: 250 Ok
C: RCPT TO: <destinatario@sudominio.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: Campo de asunto
C: From: yo@midominio.com
C: To: destinatario@sudominio.com
C:
C: Hola,
C: Esto es una prueba.
C: Hasta luego.
C:
C: .
S: 250 Ok: queued as 12345
C: quit
S: 221 Bye

Formato del mensaje

Como se muestra en el ejemplo anterior, el mensaje es enviado por el cliente después de que éste manda la orden DATA al servidor. El mensaje está compuesto por dos partes:

· Cabecera: en el ejemplo las tres primeras líneas del mensaje son la cabecera. En ellas se usan unas palabras clave para definir los campos del mensaje. Estos campos ayudan a los clientes de correo a organizarlos y mostrarlos. Los más típicos son subject (asunto), from (emisor) y to (receptor). Éstos dos últimos campos no hay que confundirlos con las órdenes MAIL FROM y RCPT TO, que pertenecen al protocolo, pero no al formato del mensaje.

· Cuerpo del mensaje: es el mensaje propiamente dicho. En el SMTP básico está compuesto únicamente por texto, y finalizado con una línea en la que el único carácter es un punto.

Seguridad y Spam

Una de las limitaciones del SMTP original es que no facilita métodos de autenticación a los emisores, así que se definió la extensión SMTP-AUTH.