Mostrando entradas con la etiqueta informática. Mostrar todas las entradas
Mostrando entradas con la etiqueta informática. Mostrar todas las entradas

domingo, 12 de junio de 2016

El control de la información en un solo cable

     Tengo dos noticias una buena y otra mala, ¿cuál quieres que te cuente primero? Está bien, te contaré primero la buena:
Se va a lanzar un cable de comunicaciones submarino entre Estados Unidos y España con un ancho de banda que equivaldrá a la mitad de todos los cables submarinos que hay actualmente en todo el mundo. Y que empezará a operar en 2017.
La mala:
Que el cable pertenece a Facebook y Microsoft. Y todos los datos que circulen por él irán a parar a los servidores de estas dos empresas sin ningún tipo de control estatal.

Señores: La manipulación extrema de la información está servida.

     A esto se junta, por si no lo sabes te lo digo yo, qué España es un experimento social, político y económico. Con este “adelanto” las dos empresas podrán manipular la información a su antojo y balancear la opinión de los usuarios hacía sus propósitos. Lo que se conoce como “Think Tanks” (literalmente “Tanques de pensamiento”), y que según wikipedia son ONGs no lucrativas. Nada más lejos de la verdad. No hay nada en el mundo occidental que no se mueva por dinero. Las ONGs que hacen estudios de mercado, sociológicos o políticos lo pueden hacer para no ganar dinero ellas mismas, aunque estén pagadas por otras instituciones, pero el fin último de estos estudios es hacer ganar dinero de múltiples formas a los que les han encargado el estudio.

     Tampoco hay que olvidar que la CIA tiene también intereses en Facebook para tener un mayor control sobre los ciudadanos de los Estados Unidos. Ahora también podrán acceder sin problemas a los datos que les suministren los propios usuarios españoles y mucho me temo que los de Europa.
La CIA tiene muchos frentes abiertos: guerra política, económica (es un gran inversor en bolsa), social, venta ilegal de armas a países en guerra, etc, etc...

     En un artículo anterior en el que hablaba sobre Facebook (Facebook no es tu amigo) me resultó interesante un foto montaje presentando una sociedad orwelliana. Pero ahora no hace falta hacer el foto montaje. Solo hay que ver la imagen de la derecha.


Si no te da miedo te felicito, eres un tío duro o inconsciente.

     No sería de extrañar que, por ejemplo, el TTIP tan impopular en estos momentos, sea popular en pocos años vista, gracias a la manipulación de la información o tergiversación de la verdad. O trasladar la discusión al campo de si es un tratado de izquierdas  o derechas, cuando la realidad es que es un tratado del poder que tienen las grandes empresas sobre los Estados y los consumidores.

     Aunque en un artículo anterior ya puse este vídeo, yo creo que es bueno recordarlo:


     Yo por mi parte, siendo fiel a mis principios, me quitaré de esta red social antes de que se ponga en marcha este cable. Aunque ahora también está manipulada la información, todos necesitamos una excusa para hacer las cosas, y ésta es excelente para quitarme del medio.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/

Artículos relacionados:
Entrada 23 - Internet y la "información" 
Cables submarinos: la nueva frontera del poder de las telecomunicaciones

sábado, 4 de junio de 2016

Programándole un feedback a un servidor web Arduino

     Siguiendo con los artículos anteriores sobre la programación de Arduino como servidor web y la programación en Java de una consola de comunicación que nos sirva tanto del puerto serie como comunicaciones ethernet, ahora traigo este código el cual prepara un feedback del servidor web para que los clientes tanto web como consolar Java puedan saber el estado de las salidas de nuestro dispositivo Arduino.

     Las siguientes líneas corresponden a una web tipo (descarga ejemplo web):
<!DOCTYPE html>
<html>
    <head>
        <title>T&iacute;itulo</title>
    </head>
    <body>
        <form method="get" action="">
            ...
        </form>
        <script type='text/javascript'>


            L5=0;
            L6=0;
            L7=1;
            A=100;
            if (L5 == 1)
                document.write("Pin 5: encendido.<br>");
            else
                document.write("Pin 5: apagado.<br>");
            if (L6 == 1)
                document.write("Pin 6: encendido.<br>");
            else
                document.write("Pin 6: apagado.<br>");
            if (L7 == 1)
                document.write("Pin 7: encendido.<br>");
            else
                document.write("Pin 7: apagado.<br>");
           
            document.write("Pin 9 (anal&oacute;gico): " + A + "<br>");
           
            var URLactual = window.location;
            var patron = /^http:\/\/192.168.0.20\/$/i; 
            if (!patron.test(URLactual))
                window.location='http://192.168.0.20/';
        </script>
    </body>
</html>

     Las siguientes líneas corresponden a la código Javascript embebidas en el código de Arduino (descarga código fuente control_leds.zip):
          // Codigo con metadatos
          client.println("<script type='text/javascript'>");
         
          client.println("var URLactual = window.location;");
          //client.println("var patron = /^http:\/\/192.168.0.20\/$/i;");
          //client.println("if (!patron.test(URLactual))");
          //client.println("      window.location='http://192.168.0.20/';");         
          client.println("document.write(URLactual + '<br><br>');");
         
          //pinString = String(digitalRead(5));
          client.println("L5="+String(digitalRead(5))+";");
          client.println("L6="+String(digitalRead(6))+";");
          client.println("L7="+String(digitalRead(7))+";");
          if (lastValueA.length() == 1)
            client.println("A=00"+lastValueA+";");  // String(analogRead(9))
          if (lastValueA.length() == 2)
            client.println("A=0"+lastValueA+";"); 
          if (lastValueA.length() == 3)
            client.println("A="+lastValueA+";"); 
           
          // Aunque Javascript acepta la comparacin de igualdad de valor y tipo
          // si ponemos: if (L5 === 1) el ejemplo no trabaja correctamente
          client.println("if (L5 == 1)");
          client.println("  document.write('<b>Pin 5: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 5: apagado.<br>');");
          client.println("if (L6 == 1)");
          client.println("  document.write('<b>Pin 6: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 6: apagado.<br>');");
          client.println("if (L7 == 1)");
          client.println("  document.write('<b>Pin 7: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 7: apagado.<br>');");
         
          // La siguiente linea no funciona bien.
          //client.println("  document.write('Pin 9 (analógico): " + lastValueA +"<br>');");
          client.println("document.write('Pin 9 (anal&oacute;gico): <b>' + A +'</b><br>');");
         
          /*
              Cuidado con tener errores en el codigo Javascript puede hacer que
              no funcione la web en el cliente               
           */
          client.println("</script>");

     El siguiente código corresponde a la búsqueda de un patrón dentro de una cadena de carácteres (descarga código fuente RegExp.zip):
public static void main( String args[] ){
public static void main( String args[] ){
    String linea = "L7=1;";
    String expresionL7 = "L7=";
    int mNumber;
    char caracter;

    Pattern regla = Pattern.compile(expresionL7);

    // Objeto para comprobar las coincidencias
    Matcher mCoincidencia = regla.matcher(linea);
    if (mCoincidencia.find()) {
        System.out.println("Found value: " + mCoincidencia.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincidencia.group(0).length()) );

            caracter = linea.charAt(3);
            System.out.println("Caracter: " + caracter);

            if (mNumber == 1)
                System.out.println("El LED 7 está encendido.");
            else
                System.out.println("El LED 7 está apagado.");
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        System.out.println("NO MATCH");
    } 
}

     Y por último el código de búsqueda de patrón en nuestra consola Java, repetido tantas veces como pines de Arduino estén configurados para salida de datos (descarga código fuente Consola.zip):
String expresionL5 = "L5=";
String expresionL6 = "L6=";
String expresionL7 = "L7=";
String expresionA  = "A=";
int mNumber;
String mNumberA = "";

Pattern reglaL5 = Pattern.compile(expresionL5);
Pattern reglaL6 = Pattern.compile(expresionL6);
Pattern reglaL7 = Pattern.compile(expresionL7);
Pattern reglaA = Pattern.compile(expresionA);           

while ((linea = in.readLine()) != null) {
    System.out.println(linea);
    // Objeto para comprobar las coincidencias
    Matcher mCoincideL5 = reglaL5.matcher(linea);
    if (mCoincideL5.find()) {
        System.out.println("Found value: " + mCoincideL5.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL5.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 5: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 5: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
       // System.out.println("NO MATCH");
    }
    // Comprobar LED 6
    Matcher mCoincideL6 = reglaL6.matcher(linea);
    if (mCoincideL6.find()) {
        System.out.println("Found value: " + mCoincideL6.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL6.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 6: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 6: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
    // Comrpobar LED 7
    Matcher mCoincideL7 = reglaL7.matcher(linea);
    if (mCoincideL7.find()) {
        System.out.println("Found value: " + mCoincideL7.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL7.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 7: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 7: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
    // Valor LED con salida analógica
    Matcher mCoincideA = reglaA.matcher(linea);
    if (mCoincideA.find()) {
        System.out.println("Found value: " + mCoincideA.group(0) );
        try {
            mNumberA = ""+linea.charAt(mCoincideA.group(0).length())+linea.charAt(mCoincideA.group(0).length()+1)+linea.charAt(mCoincideA.group(0).length()+2);

            jTextAreaTransferencias.append("Valor LED analógico: "+ mNumberA +"\n");
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
}


     Solo deciros que tiene un pequeño problema en la actualización de datos ya que en el momento de realizar la petición no muestra el último valor cambiado (problemas entre la petición GET y la recepción de datos, quizás prematura, de los clientes). Pero el código es totalmente válido y funcional.

     @eltiopacote      @pacovalverdecom
Listado de artículos: http://www.pacovalverde.es/indice/

Artículos relacionados:
Entrada 129 - Enviar comandos vía ethernet a Arduino con Java 3/X
Entrada 128 - Mi primera clase en YouTube sobre Java y Swing
Entrada 126 - Seguimiento del proyecto Arduino ethernet SD + Java
Entrada 124 - Programando una consola en Java con NetBeans 2/X
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

sábado, 28 de mayo de 2016

Mi primera clase en YouTube sobre Java y Swing

     Este es mi primer vídeo con audio (el primero fue sin audio y totalmente olvidable) donde explico como crear un proyecto en Java con Swing en NetBeans 8.0.2.

     No me ha quedado todo lo bien que yo quisiera ni por asomo, pero es el primero, y espero ir mejorando muy mucho.

     Este vídeo correspondería con los artículos del blog:
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 124 - Programando una consola en Java con NetBeans 2/X

     Me gustaría que me dijérais que es mejor para explicar estas cosas, si un artículo en blog o un vídeo en YouTube. O las dos cosas.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

jueves, 19 de mayo de 2016

Seguimiento del proyecto Arduino ethernet SD + Java

     Este artículo es solo para proporcionar meta información del proyecto Arduino ethernet SD + Java presentando un par de esquemas para saber por donde va el proyecto y cuales serán los siguientes artículos.
     El primer esquema (descarga) esta hecho con LibreOffice y separa por colores la parte que pertenece a Arduino en celeste, la parte que pertece a Java en rojo y los artículos que pertenecen a ambos en violeta. No hace falta saber Java para hacer la parte de Arduino, ni hace falta saber la parte de Arduino para programar la parte de Java, pero saber lo que hacen ambos es mucho más divertido.
Mapa mental para tener una idea global del proyecto Arduino.


     Los dos siguientes esquemas los he realizado con herramientas que he descubierto recientemente, y la verdad es que lo único que quería era probarlas. La primera está pensada para hacer mapas mentales y es un poco menos flexible:
https://www.mindmeister.com/703097385/proyecto-arduino-ethernet-sd-consola-java

     La segunda web permite esquemas más flexibles en la organización de iconos/ideas la utiliza el periódico eldiario.es en algunos artículos y es más divertida de lo que yo he hecho. Ya iré bicheando poco a poco en ella:
https://kumu.io/pacovalverde/proyecto-arduino-ethernet-sd-java

     El cuarto no es un esquema de las entradas, sino como debería ser planteado el proyecto si huebiera sido para un trabajo. Está hecho con Planner 0.14.6 y es un diagrama de Gantt (descarga):
http://www.pacovalverde.es/proyecto_arduino/gantt.html

     Para cualquier duda o sugerencia no dudéis en comentar.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/

miércoles, 18 de mayo de 2016

Folder Forbidden en el acceso a un sitio web con configuración de multiples sitios web

     Cuando tienes muchos sitios web en tu computadora Linux y los has configurado ya sean sitios virtuales o por IP (aquí tienes un manual de configuración de los distintos tipos), le habrás dado permiso de ejecución en la máquina a las carpetas donde están alojadas las webs al usuario local, de la manera:

sudo chmod 775 -R nombre_carpeta_web
o
sudo chmod u+x -R nombre_carpeta_web

     Pero es posible que al intentar acceder al sitio desde el navegador web (¿como sino?) te haya aparecido Folder Forbidden. Si es así bienvenido al club. Lo que tienes que hacer es darle permisos a todos esos sitios web desde el fichero /etc/apache2/apache2.conf y en las siguientes lineas:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>


donde aparece Requiere all denied debes cambiarlo por Require all granted (si eres novato u olvidadizo como yo la linea la puedes comentar la original) para que todos los demás sitios tengan permiso concedido por defecto. Con lo que el conjunto de lineas queda así:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    # Con 'Require all denied' no tienes permiso

    # para ver el resto de webs
    Require all granted
</Directory>




    Si tienes alguna duda sobre algo de las configuraciones o tengo algo mal explicado en los manuales no tengas pegas en comentar.

    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/

lunes, 16 de mayo de 2016

Programando una consola en Java con NetBeans 2/X

     Como vimos en el artículo anterior en el que hemos creado la base de una aplicación para trabajar con Java Swing y siguiendo con el proyecto para tener una consola completa que envíe comandos tanto por el puerto serie como por ethernet, ahora vamos a continuar con la parte de la consola.

    Siguiendo con el código generado en el artículo anterior vamos a agregarle un par de componentes de texto y un botón de envío.
    Abrimos el proyecto ConsolaControlArduino y pinchamos en Design.

     1º En el panel de la derecha pinchamos sobre Campo de texto y seguidamente pinchamos sobre el marco que tenemos en el centro. Esto hará que se cree una caja de texto donde, en tiempo de ejecución, escribiremos los comandos que le enviaremos a Arduino.

     2º Le vamos a cambiar un par de propiedades a este componente. Con él seleccionado, pinchamos en el panel derecho sobre Codigo y pinchamos en Nombre de variable y modificamos el nombre del objeto por uno más descriptivo. Por ejemplo: jTextFieldComandos.


Es buena práctica utilizar nombres descriptivos que podamos identificar rápidamente cuando tengamos más objetos, y más si son del mismo tipo. Tener nombres como jTextField1, jTextField2, jTextField3 no es buena idea.
Después pinchamos en Propiedades y la propiedad text la dejamos en blanco. Estiramos el componente en el marco para que ocupe casi todo el marco y ya tenemos el primer componente.

     3º De la misma forma que el anterior componente agregamos un Área de texto donde aparecerán los comandos que se le envían a Arduino. Le cambiamos el nombre por jTextAreaTransferencias y lo ajustamos al tamaño deseado.

     4º Y de la misma forma agregamos un Botón para enviar los comandos. Le cambiamos el nombre por jButtonEnviar. Y en la propiedad text escribimos Envidar comando.

     5º Ahora hacemos una pequeña programación para que al presionar el botón enviar la cadena de texto que se haya escrito en la caja jTextFieldComandos se borre de esa caja y pase a jTextAreaTransferencias. Primeramente pinchamos sobre el botón que ejecutará esa acción y nos vamos al panel derecho y pinchamos sobre Eventos. Y nos vamos hasta el evento mouseClicked y seleccionamos jButtonEnviarMouseClicked. Esto generará un pequeño código al que agreraremos las sentencias.

if (!"".equals(jTextComandos.getText()))  // Si la caja de texto no está vacía
            enviarComando(jTextComandos.getText()); // ejecuta la función



NetBeans crea la cabecera del método y las llaves y solo podemos escribir en medio:

private void jButtonEnviarMouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (!"".equals(jTextComandos.getText()))
            enviarComando(jTextComandos.getText());
}


     6º Ahora escribimos la función enviarComando(String mensaje).

public void enviarComando(String mensaje){
        jTextComandos.setText("");     // Borra el comando de la caja de texto
        jTextAreaTransferencias.append(mensaje + "\n");  // Escribe el mensaje                                                             // en el TextArea
}


Aunque de momento lo único que hace es borrar el texto de un sitio y escribirlo en otro.

     7º También vamos a programar un evento para la caja de texto, que será qué cuando se pulse la tecla Enter, si hay algo en la caja, lo envíe. Más o menos como hace cualquier chat. Pinchamos sobre la caja de texto jTextFieldComandos y en el panel derecho pinchamos sobre Eventos nos vamos a keyPressed y seleccionamos jTextFieldKeyPressed que generará la cabecera de programación para el evento. En su interior escribimos el siguiente código:

private void jTextFieldComandosKeyPressed(java.awt.event.KeyEvent evt) {
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (!"".equals(jTextFieldComandos.getText()))
                enviarComando(jTextFieldComandos.getText());
        }
}


Marcará KeyEvent con error pero si le damos a la bombillita de la izquierda para que importe la librería correcta import java.awt.event.KeyEvent; o la escribimos nosotros el error desaparece.

    8º Solo queda ejecutarlo y ver como funciona.

    Sobre este código descrito (descargar) seguiremos para añadirle unas sencillas sentencias para que envíe los comandos por ethernet.

Artículos relacionados:
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

domingo, 15 de mayo de 2016

Como crear un proyecto con Swing en NetBeans 8.X

     Para crear un proyecto de Java en NetBeans que tenga un formulario Swing solo debemos:
     1º Crear un nuevo proyecto con Nuevo proyecto → del tipo Java Application y le damos a Siguiente >

     2º Escribir un nombre y seleccionar una carpeta donde estará almacenado. Presionamos Terminar.

     3º Sobre el paquete que se ha creado (icono que parece una caja embalada) le damos a botón derecho para que aparezca el menú contextual y elegimos NuevoFormulario JFrame. Si no aparece esa opción nos vamos al final del menú contextural y elegimos → Otro… nos sale una caja de selección y elegimos en la parte izquierda Formulario de interfaz gráfica de AWT en la derecha Formulario Frame

     4º Ahora tenemos dos clases candidatas a ser ejecutadas aunque solo es la prinpipal la que tiene el main que es la que se creo por defecto con el proyecto. Podemos ver como aparecen en la imagen:

Nos vamos a disponer a borrar la clase que no tiene swing. En la imagen sería la clase ConsolaControlArduino.java. Los iconos son distintos:



     5º Borramos la clase que se creo por defecto. Dando al botón derecho del ratón sobre el archivo que queremos eliminar. Nos sale una nueva ventana y seleccionamos Aceptar.

     6º Ejecutamos la aplicación y nos aparece una ventana en la que decimos que la nueva clase es la principal. Es fácil porque solo podemos aceptar siguiendo los pasos descritos.

     7º Ejecutamos la aplicación y nos sale una ventana vacía.

         A partir de aquí a trabajar.

Entradas relacionadas:
Entrada 124 - Programando una consola en Java con NetBeans 2/X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

     @eltiopacote
Listado de entradas: http://www.pacovalverde.es/indice/

sábado, 7 de mayo de 2016

Acceso directo a VirtualBox en Ubuntu 16.04 LTS

    Parece ser qué, por temas de seguridad no se puede crear un acceso directo a Virtual Box en Ubuntu 16.04 LTS. Por lo que voy a exponer mi solución para tener un icono bonito en el escritorio que arranque Virtual Box.

    Hay dos métodos:

    1º Creamos un script que ejecute la aplicación.
    2º Creamos un programa desde cualquier lenguaje que nos arranque la aplicación Virtual-Box.

    1º Para este caso lo único que tenemos que hacer es escribir en un fichero de texto las sentencias:

/usr/lib/virtualbox/VirtualBox
exit


    El problema de este método es que cuando le das doble click al fichero gedit te pregunta si quieres mostrarlo o ejecutarlo. Y hay que modificar la acción de la aplicación gedit para ejecute los archivos o los edite. Cosa que hace para el resto de archivos. Y como esa opción no me entusiasma pasemos al segundo método.

    2º Para este método he empleado dos lenguajes Java y C++:
    2.A Para Java:


package ejecutarvirtualbox;
public class EjecutarVirtualBox {
    public static void main(String[] args) {
        try {
           Process p = Runtime.getRuntime().exec ("/usr/lib/virtualbox/VirtualBox");
        } catch (Exception e) {
            System.out.println("Aplicación no encontrada: " + e);
        }
    }
}
 

    Lo exportamos como jar, le damos permisos de ejecución y listo para abrir el programa.

    2.B Para C++:


#include <cstdlib>
using namespace std;
int main(int argc, char** argv) {
    system("/usr/lib/virtualbox/VirtualBox");
    return 0;
}


    Arrastramos el jar y/o el ejecutable de C++ al escritorio y ya los tenemos listos. Nos vamos a las propiedades del archivo, pinchamos sobre el icono y lo cambiamos por el icono de VirtualBox que está en la carpeta /usr/share/pixmaps/ llamado virtualbox.xpm.

    Breve pero intenso.
    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

martes, 3 de mayo de 2016

Proyecto Arduino ethernet SD + consola en Java 1/X

     Este proyecto vengo pensándolo desde hace mucho tiempo pero es desde hace poco tiempo que me he puesto con él enserio. Se trata de comunicarse con Arduino usando la tarjeta ethernet SD usando un navegador cualquiera y la conexión USB con una consola programada en Java.

     El concepto del proyecto estaría resumido en el siguiente esquema que podéis descargar desde mi web por si queréis hacer modificaciones:


     El proyecto no está completo. Lo estoy desarrollando de momento solo bajo Linux. Ubuntu para ser exactos. Esto es solo una aproximación. De hecho, esta versión tiene  dos fallos al presentar en la consola los datos enviados y recibidos, y al capturar el evento de datos recibidos siempre da como positivo a tal evento. Cosas muy raras. A lo mejor me puedes ayudar a solucionar estos problemillas.

     El siguiente código es el que estará almacenado en Arduino:


#include <Ethernet.h>
#include <SPI.h>

const int BLUE    =5;
const int GREEN   =6;
const int RED     =7;
const int SPEAKER =3;
// Configuration Night Light
const int RLED    =9;    //Red LED on pin 9 (PWM)
const int LIGHT   =0;    //Lght Sensor on Analog Pin 0
const int MIN_LIGHT=200; //Minimum expected light value
const int MAX_LIGHT=900; //Maximum Expected Light value
int val = 0;             //variable to hold the analog reading
String AnalogLed;

//For controlling LEDS and the speaker
//If you want to control additional things, add variables to control them here.
int freq = 0;
int pin;
char dato[16];
String inString = "";

//Set to your MAC address!
//It should be on your sticker. If you can't find it,
//make one up, or use this one.
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 };
// the dns server ip
IPAddress dnServer(192, 168, 0, 1);
// the router's gateway address:
IPAddress gateway(192, 168, 0, 1);
// the subnet:
IPAddress subnet(255, 255, 255, 0);
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 20);

//Start the server on port 80
EthernetServer server = EthernetServer(80); //port 80

boolean receiving = false; //To keep track of whether we are getting data.

void setup()
{
  Serial.begin(9600);

  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  // Configuration Night Light
  pinMode(RLED, OUTPUT); //Set LED pin as output
   
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  //Start the server
  server.begin();
  Serial.print("Server Started.\nLocal IP: ");
  Serial.println(Ethernet.localIP());

}

void loop()
{
  EthernetClient client = server.available();

  if (Serial.available() > 0)
  {
    // https://www.arduino.cc/en/Tutorial/StringToIntExample
    int inChar = Serial.read();
    if(isDigit(inChar))
    {
      inString += (char)inChar;
    }
    if(inChar == '\n')
    {
      Serial.print("Pin: ");
      pin = inString.toInt();
      Serial.println(pin);
      if (pin == 55)
        digitalWrite(7, !digitalRead(7));
      else
        digitalWrite(pin, !digitalRead(pin));
      inString = "";
    }
   
    delay(1000);
    for(int i=0; i<10; i++) {
      digitalWrite(7, !digitalRead(7));
      if (pin != 0)
        Serial.println(pin);
      delay(200);
    }
  }
     
  if (client)
  {
    //An HTTP request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read(); //Read from the incoming buffer
      
        if(receiving && c == ' ') receiving = false; //done receiving
        if(c == '?') receiving = true; //found arguments
      
        //This looks at the GET requests
        if(receiving)
        {
          //An LED command is specified with an L
          if (c == 'L')
          {
            Serial.print("Toggling Pin ");
            pin = client.parseInt();
            Serial.println(pin);
            digitalWrite(pin, !digitalRead(pin));
           
            delay(1000);
            for(int i=0; i<10; i++) {
              digitalWrite(pin, !digitalRead(pin));
              Serial.println(pin);
              delay(200);
            }
           
            break;
          }
          //A speaker command is specified with an S
          else if (c == 'S')
          {
            Serial.print("Setting Frequency to ");
            freq = client.parseInt();
            Serial.println(freq);
            if (freq == 0)
              noTone(SPEAKER);
            else
              tone(SPEAKER, freq);
            break;
          }
          //Add similarly formatted else if statements here
          //TO CONTROL ADDITIONAL THINGS
          else if (c == 'A')
          {
            if (val < 0 || val > 255)
            {
              val = 0;
              break;
            }
            val = client.parseInt();
            Serial.print("Dando brillo al led con valor analogico: ");
            Serial.println(val);
            analogWrite(RLED, val);                       //control the LED
            break;
          }
        }
      
        //Print out the response header and the HTML page
        if(!sentHeader)
        {
          //Send a standard HTTP response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html\n");
    
          //Red toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='7' />");
          client.println("<input type='submit' value='Toggle Red' />");
          client.println("</form>");
    
          // Green toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='6' />");
          client.println("<input type='submit' value='Toggle Green' />");
          client.println("</form>");
    
          //Blue toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='5' />");
          client.println("<input type='submit' value='Toggle Orange' />");
          client.println("</form>");
    
          //Speaker frequency slider
          client.println("<form action='' method='get'>");
          client.print("<input type='range' name='S' min='0' max='1000' step='100' value='0'/>");
          client.println("<input type='submit' value='Set Frequency' />");
          client.println("</form>");
         
          // Control de salida analgica
          client.println("<form action='' method='get'>");
          client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='0' />");
          //client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='"+String(val)+"' />");
          client.println("<input type='submit' value='Set Analogic Blue Light' />");
          client.println("</form>");         
    
          //Add additional forms forms for controlling more things here.
         
          sentHeader = true;
        }
 
        if (c == '\n' && currentLineIsBlank) break;

        if (c == '\n')
        {
          currentLineIsBlank = true;
        }
        else if (c != '\r')
        {
          currentLineIsBlank = false;
        }
      }
    }
    delay(100); //Give the web browser time to receive the data
    client.stop(); //Close the connection:
  }
}


     Es una versión un poco extendida del código expuesto en GitHub control_led_speaker.ino. Solo que le he puesto que trate los datos recibidos por el puerto serie (a la postre USB, en Linux '/dev/ttyUSB0') y que devuelva por el puerto serie el mismo dato enviado por consola desde el PC. Puedes descargar el código desde mi web.

     El código Java es el siguiente:

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 *//**
 * @author mario
 */
public class JAVADUINO_Frame extends javax.swing.JFrame implements SerialPortEventListener {

    /**
     * Creates new form JAVADUINO_Frame
     */
    private static final String TURN_Verde="5";
    private static final String TURN_Verde_ON="6";
    private static final String TURN_Rojo_OFF="9";
    private static final String TURN_Rojo_ON="7";
    private String vBuffer;
   
    //Variables de conexión
    private OutputStream output = null;
    SerialPort serialPort;
    InputStream inputStream;    // Para leer el puerto serie
    /**
     * A BufferedReader which will be fed by a InputStreamReader converting the
     * bytes into characters making the displayed results codepage independent
     */
    private BufferedReader input;
   
    private InputStreamReader inputBuffer;
   
    private final String PUERTO = "/dev/ttyUSB0";
    private static final int TIMEOUT = 2000; //Milisegundos
    private static final int DATA_RATE = 9600;
   
    /*
     * Bloque de código para abrir del puerto serie
     */
    public SerialPort abrirPuertoSerie(final String nombrePuerto) throws Exception {
        CommPortIdentifier portId;  // puerto: nombre original.
        SerialPort puertoSerie;
        final Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();   // listaPuertos: nombre original.
       
        while (portEnum.hasMoreElements()) {
            portId = (CommPortIdentifier) portEnum.nextElement();
            if (portId.getName().equals(nombrePuerto)) {
                puertoSerie = (SerialPort)portId.open("PuertoSerie", TIMEOUT);
                puertoSerie.setSerialPortParams(9600,
                                                SerialPort.DATABITS_8,
                                                SerialPort.STOPBITS_1,
                                                SerialPort.PARITY_NONE);
                return puertoSerie;
            }
        }
        throw new Exception("Nombre de puerto invalido");
    }
    /**
     * Manualmente un evento sobre el puerto serie. Lee los datos y los imprime.
     * Handle an event on the serial port. Read the data and print it.
     * Código extraido de http://playground.arduino.cc/Interfacing/Java
     * @param oEvent
     */
    @Override
    public synchronized void serialEvent(SerialPortEvent oEvent) {       
        // Web de Oracle que trata los eventos del puerto serie:
        // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/SerialPortEvent.html#DATA_AVAILABLE
        // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/constant-values.html#javax.comm.SerialPortEvent.DATA_AVAILABLE
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE && oEvent.getNewValue()) { // types int
            try {
               
                jTextAreaEventos.append("Capturado evento: " + Integer.toString(oEvent.getEventType()) + "\n");
                //String inputLine = input.readLine();
                //jAreaMensajes.append(inputLine + "\n");
                // Desde http://playground.arduino.cc/Interfacing/Java
                input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
                jAreaMensajes.append(input + "\n");
                System.out.println(oEvent.getSource().toString());  // " " + input
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
       
    }
   
    public JAVADUINO_Frame() {
        initComponents();
        inicializarConexion();
        jLabel1.setIcon(new ImageIcon("src/IconoLedRojoApagado.png"));
        jLabel3.setIcon(new ImageIcon("src/IconoLedAmarilloApagado.png"));   
        setTitle("JAVADUINO");
        jRadioButton1.setSelected(true);
    }
   
    public void inicializarConexion(){
        CommPortIdentifier puertoID=null;
        Enumeration puertoEnum = CommPortIdentifier.getPortIdentifiers();
       
        while(puertoEnum.hasMoreElements()){
            CommPortIdentifier actualPuertoID=(CommPortIdentifier) puertoEnum.nextElement();
            if(PUERTO.equals(actualPuertoID.getName())){
                puertoID = actualPuertoID;
                // jAreaMensajes.append("Puerto encontrado: " + puertoID.getName() + "\n");
                jLblDatosConexcion.setText("Puerto encontrado: " + PUERTO); // puertoID.getName()
                break;
            }
        }
       
        if(puertoID == null){
            mostrarError("No se puede conectar al puerto");
            System.exit(ERROR);
        }
       
        try{
            serialPort = (SerialPort) puertoID.open(this.getClass().getName(), TIMEOUT);
            //Parámetros puerto serie
            serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            output = serialPort.getOutputStream();
            //input = serialPort.getInputStream();
            jAreaMensajes.append("Puerto seleccionado: " + output.toString() + "\n");
           
            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
            //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled);    // Para evaluar la segunda forma de tratar el evento del puerto serie.
            jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n");
        } catch(Exception e){
            mostrarError(e.getMessage());
            System.exit(ERROR);
        }
    }
   
    /**
     * Esto debería ser llamado cuando paras de usar el puerto.
     * Esto prevendrá que el puerto se quede bloqueado en las plataformas Linux.
     * This should be called when you stop using the port. This will prevent
     * port locking on platforms like Linux.
     * Código extraido de http://playground.arduino.cc/Interfacing/Java
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }
   
    public void openPort() {
        CommPortIdentifier puertoID=null;
        Enumeration puertoEnum = CommPortIdentifier.getPortIdentifiers();
       
        while(puertoEnum.hasMoreElements()){
            CommPortIdentifier actualPuertoID=(CommPortIdentifier) puertoEnum.nextElement();
            if(PUERTO.equals(actualPuertoID.getName())){
                puertoID = actualPuertoID;
                // jAreaMensajes.append("Puerto encontrado: " + puertoID.getName() + "\n");
                jLblDatosConexcion.setText("Puerto encontrado: " + PUERTO); // puertoID.getName()
                break;
            }
        }
       
        if(puertoID == null){
            mostrarError("No se puede conectar al puerto");
            System.exit(ERROR);
        }
       
        if (serialPort == null) {
            try{
            serialPort = (SerialPort) puertoID.open(this.getClass().getName(), TIMEOUT);
            //Parámetros puerto serie
            serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            output = serialPort.getOutputStream();
            //input = serialPort.getInputStream();
            jAreaMensajes.append("Puerto seleccionado: " + output.toString() + "\n");
           
            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
            //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled);    // Para evaluar la segunda forma de tratar el evento del puerto serie.
            jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n");
            } catch(Exception e){
                mostrarError(e.getMessage());
                System.exit(ERROR);
            }
        }
    }
   
    private void enviarDatos(String datos){
        try{
            output.write(datos.getBytes());
            //output.write(7);
            jAreaMensajes.append("Enviado: " + datos.getBytes().toString() + "\n"); //  + datos.getBytes()
        } catch(Exception e){
            mostrarError("ERROR");
            System.exit(ERROR);
        }
    }   
   
    public void mostrarError(String mensaje){
        JOptionPane.showMessageDialog(this, mensaje, "ERROR", JOptionPane.ERROR_MESSAGE);
    }
   
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jAreaMensajes = new javax.swing.JTextArea();
        jLabelPort = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLblDatosConexcion = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextAreaEventos = new javax.swing.JTextArea();
        jButtonClosePort = new javax.swing.JButton();
        jButtonBorrarMensajes = new javax.swing.JButton();
        jButtonOpenPort = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                close(evt);
            }
        });

        jButton1.setText("OFF");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("ON ");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel1.setText("jLabel1");
        jLabel1.setMaximumSize(new java.awt.Dimension(50, 50));
        jLabel1.setMinimumSize(new java.awt.Dimension(50, 50));
        jLabel1.setPreferredSize(new java.awt.Dimension(50, 50));

        jRadioButton1.setText("ROJO");

        jRadioButton2.setText("AMARILLO");

        jLabel3.setText("jLabel3");
        jLabel3.setMaximumSize(new java.awt.Dimension(50, 50));
        jLabel3.setMinimumSize(new java.awt.Dimension(50, 50));
        jLabel3.setPreferredSize(new java.awt.Dimension(50, 50));

        jAreaMensajes.setColumns(20);
        jAreaMensajes.setRows(5);
        jScrollPane1.setViewportView(jAreaMensajes);

        jTextAreaEventos.setColumns(20);
        jTextAreaEventos.setRows(5);
        jScrollPane2.setViewportView(jTextAreaEventos);

        jButtonClosePort.setText("Cerrar puerto");
        jButtonClosePort.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonClosePortMouseClicked(evt);
            }
        });

        jButtonBorrarMensajes.setText("Borrar");
        jButtonBorrarMensajes.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonBorrarMensajesMouseClicked(evt);
            }
        });

        jButtonOpenPort.setText("Abrir puerto");
        jButtonOpenPort.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonOpenPortMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLblDatosConexcion)
                        .addGap(12, 12, 12)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 294, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabelPort, javax.swing.GroupLayout.PREFERRED_SIZE, 977, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonClosePort, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonBorrarMensajes, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonOpenPort, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(jRadioButton1)
                        .addComponent(jRadioButton2)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 484, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 451, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jRadioButton1)
                .addGap(18, 18, 18)
                .addComponent(jRadioButton2)
                .addGap(61, 61, 61)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButtonClosePort)
                    .addComponent(jButtonBorrarMensajes)
                    .addComponent(jButtonOpenPort))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                    .addComponent(jScrollPane1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLblDatosConexcion, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelPort, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))))
        );

        pack();
    }// </editor-fold>                       

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        if(jRadioButton1.isSelected()){
            enviarDatos(TURN_Rojo_ON);
            jLabel1.setIcon(new ImageIcon("src/IconoLedRojo.png"));
        }
        if(jRadioButton2.isSelected()){
            enviarDatos(TURN_Verde_ON);
            jLabel3.setIcon(new ImageIcon("src/IconoLedAmarillo.png"));
        }
    }                                       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        if(jRadioButton1.isSelected()){
            enviarDatos(TURN_Rojo_OFF);
            jLabel1.setIcon(new ImageIcon("src/IconoLedRojoApagado.png"));
        }
        if(jRadioButton2.isSelected()){
            enviarDatos(TURN_Verde);
            jLabel3.setIcon(new ImageIcon("src/IconoLedAmarilloApagado.png"));
        }
    }                                       

    private void close(java.awt.event.WindowEvent evt) {                      
        // TODO add your handling code here:
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }                     

    private void jButtonClosePortMouseClicked(java.awt.event.MouseEvent evt) {                                             
        // TODO add your handling code here:
        close();
        jLabelPort.setText("Puerto encontrado: " + PUERTO);
    }                                            

    private void jButtonBorrarMensajesMouseClicked(java.awt.event.MouseEvent evt) {                                                  
        // TODO add your handling code here:
        jAreaMensajes.setText("");
        jTextAreaEventos.setText("");
    }                                                 

    private void jButtonOpenPortMouseClicked(java.awt.event.MouseEvent evt) {                                            
        // TODO add your handling code here:
        openPort();
    }                                           
  
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws Exception {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JAVADUINO_Frame().setVisible(true);
            }
        });
    }
   
    // Variables declaration - do not modify                    
    private javax.swing.JTextArea jAreaMensajes;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButtonBorrarMensajes;
    private javax.swing.JButton jButtonClosePort;
    private javax.swing.JButton jButtonOpenPort;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabelPort;
    private javax.swing.JLabel jLblDatosConexcion;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextAreaEventos;
    // End of variables declaration                  
}



     Es una modificación sobre un proyecto llamado JAVADUINO hecho con swing. Solo que el código expuesto trata el evento de datos en el buffer de entrada. También lo podéis descargar desde mi web. Tiene algunos fragmentos más de código comentado de las pruebas realizadas para tratar el evento del buffer y leer correctamente del puerto serie.

     El código está bastante comentado por lo que no veo necesario comentarlo externamente. Las webs que nombro ya comentan los códigos extendidamente y hay multitud de webs donde explican por separado cada una de las funciones. Además, es un código muy sencillo. Lo importante en este punto es: '¿que se quiere conseguir?' y el 'objetivo final' expuesto en el esquema. La web, con los archivos correspondientes, que servirá Arduino estará alojada en la tarjeta SD.

     Y esto es todo de momento sobre este proyecto.

Entradas relacionadas:

Entrada 124 - Programando una consola en Java con NetBeans 2/X 
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

     @eltiopacote
Listado entradas: http://www.pacovalverde.es/indice/