Foros del Web » Programación para mayores de 30 ;) » Java »

Que se necesita para acceder a USB

Estas en el tema de Que se necesita para acceder a USB en el foro de Java en Foros del Web. Hola, tengo que desarrollar un programa que reciba, a través de un dispositivo que se conecta por el usb del pc (plug & play) , ...
  #1 (permalink)  
Antiguo 01/12/2014, 17:51
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Que se necesita para acceder a USB

Hola, tengo que desarrollar un programa que reciba, a través de un dispositivo que se conecta por el usb del pc (plug & play) , datos , como pueden ser cadenas de caracteres o cualquier otra cosa.
Mi pregunta es, si programando en java necesito de alguna libreria especial para poder llegar a hacer esto o acceder a dicho usb y recoger los datos, o como lo hicisteis o lo hariais vosotros?
Un saludo!
  #2 (permalink)  
Antiguo 02/12/2014, 01:38
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Que se necesita para acceder a USB

Buenas,

No existe nada en la libreria standard de Java para acceder al USB. El acceso a estos dispositivos depende del sistema operativo por lo que si quieres hacertelo tu mismo tendrias que acceder a las funciones del sistema por JNI.
Lo mejor y mas sencillo es que utilices una libreria como usb4Java http://usb4java.org/quickstart/javax-usb.html

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 02/12/2014, 04:10
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Respuesta: Que se necesita para acceder a USB

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

No existe nada en la libreria standard de Java para acceder al USB. El acceso a estos dispositivos depende del sistema operativo por lo que si quieres hacertelo tu mismo tendrias que acceder a las funciones del sistema por JNI.
Lo mejor y mas sencillo es que utilices una libreria como usb4Java http://usb4java.org/quickstart/javax-usb.html

Un saludo
Vale gracias por la respuesta, lo desarrollaria para un windows 8 por ejemeplo:
Ahora usando usb4java me vienen unas cuantas preguntas...:
1-No tengo que descargar nada no? como dice aqui solo creas un file ".properties" y luego importas lo que necesites como hace en los ejemplos..?

2-Me he leido todo incluso los ejemlos que hay más abajo pero no me queda claro como puede llegar a recibir datos del usb, como los agarra vamos..

3-Conoces más metodos de tratar el usb en java para w8?

Perdon por mi ignorancia, pero seria la primera vez que trato con un usb en java, Gracias de nuevo!
  #4 (permalink)  
Antiguo 02/12/2014, 07:52
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Que se necesita para acceder a USB

Cita:
1-No tengo que descargar nada no? como dice aqui solo creas un file ".properties" y luego importas lo que necesites como hace en los ejemplos..?
Si claro. Tienes que bajarte la libreria y ponerla en el classpath de tu proyecto, ya que no puede funcionar magicamente. Puedes descargarla directamente o aniadir la dependencia via Maven/Gradle.
http://usb4java.org/

Cita:
2-Me he leido todo incluso los ejemlos que hay más abajo pero no me queda claro como puede llegar a recibir datos del usb, como los agarra vamos..
Lo ejemplos no pueden ser mas concretos. Copia y pegar. Has mirado el de hacer Synchronous I/O?
http://usb4java.org/quickstart/javax-usb.html

Cita:
3-Conoces más metodos de tratar el usb en java para w8?
No he usado jamas w8 ni tampoco he tenido nunca que leer datos de un dispositivo USB. Pero lo he hecho en linux y desde puertos serie y paralelo y funcionaba sin dificultades de una manera similar.
Si te parece muy complicado quizas sea mejor que lo intentes con .Net, ya que no creo que exista un modo mas sencillo de hacerlo en Java.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 03/12/2014, 04:29
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Respuesta: Que se necesita para acceder a USB

Cita:
Iniciado por Profesor_Falken Ver Mensaje
No he usado jamas w8 ni tampoco he tenido nunca que leer datos de un dispositivo USB. Pero lo he hecho en linux y desde puertos serie y paralelo y funcionaba sin dificultades de una manera similar.
Si te parece muy complicado quizas sea mejor que lo intentes con .Net, ya que no creo que exista un modo mas sencillo de hacerlo en Java.

Un saludo
He estado informandome más, y por lo que veo, tambien se puede hacer para windows, con las librerias RXTX, que pueden establecer conexion por puertos serial, com, usb.... Lo usan bastante para aplicaciones relacionadas con Arduino pero creo que podría funcionarme, lo probaré tambien, todo sea por tener varias opciones.
Ya comentaré como va por aquí!
  #6 (permalink)  
Antiguo 03/12/2014, 07:34
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Que se necesita para acceder a USB

Buenas,

Como bien dices RXTX esta disenada para sistemas arduino (linux/unix) aunque es posible utilizarla desde windows copiando alguna DLL junto con el jar.
A mi me parece muchisimo mas compleja de integrar y desarrollar ademas de peor documentada, pero si tu la ves bien y tienes claro como hacerlo, adelante.
Ya nos cuentas como te ha ido.

Suerte y un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 07/12/2014, 10:37
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Respuesta: Que se necesita para acceder a USB

Cita:
Iniciado por Profesor_Falken Ver Mensaje

Suerte y un saludo
Aisss eso es lo que necesito...Buenas de nuevo,
Sigo intentando acceder via usb para recoger los datos, he probado con mil y una librerias pero no doy con ello, estoy con un cacao mental increible. Por ultimo he intentado de nuevo probar con la libreria de usb4java como me dijiste pero ahora me da un error de que no encuentra el archivo "Properties file javax.usb.properties not found."
lo pongo en el root classh path como dice en la api e incluso en todas las carpetas del proyecto jajaja porque ya no se ni porque no lo lee, a ver si puedes ayudarme que estoy desquiciado :(
  #8 (permalink)  
Antiguo 07/12/2014, 10:46
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Que se necesita para acceder a USB

Buenas,

Es imposible adivinar lo que has hecho en tu ordenador. Si quieres puedes poner toda la jerarquía de ficheros del proyecto para comprobar si está ok.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 07/12/2014, 10:52
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Respuesta: Que se necesita para acceder a USB

Vale eddito, lo he puesto en la carpeta /lib del jre y si que lo detecta ya pero ahora me salta esto.." Native library not found in classpath: /org/usb4java/windows-x86/libusb-1.0.dll", hay que ver , para luego que no me funcione el codigo fijo xD

Última edición por warywin; 07/12/2014 a las 11:23
  #10 (permalink)  
Antiguo 07/12/2014, 12:14
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Que se necesita para acceder a USB

Buenas,

Copiarlo al /lib del jre es muy mala idea, ya que después si mueves el proyecto a otro ordenador o simplementa actualizas tu jre, entonces te dejará de funcionar.
Respecto a la dll, tienes que instalarla en tu sistema o bien ponerla también en tu classpath. Aqui tienes una guia rapida para instalarla: http://www.pinguino.cc/download/doc/libusb-windows7.pdf

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #11 (permalink)  
Antiguo 07/12/2014, 14:25
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 11 años
Puntos: 1
Respuesta: Que se necesita para acceder a USB

Bueno probando con la libreria JavaComm y RxTx me da un resultado(queriendo leer lo que transmite el dispositivo) por consola tal que este:
Código Java:
Ver original
  1. portlist... gnu.io.CommPortEnumerator@2a15cd
  2. el puerto identificado es Serial... 1
  3. incapaz de abrir el puerto
  4. el puerto identificado es Serial... 1
  5. el puerto identificado es COM4... COM4
  6. En el constructor SimpleRead()
  7. Serial Port... //./COM4
  8. InputStream... gnu.io.RXTXPort$SerialInputStream@b0bad7
  9. .......................
  10. En la funcion run()
  11. D
  12. D<
El input Stream como podeis comprobar me devuelve una cadena rara con un @ y demas asi como el portlist.
El codigo es el siguiente:
Código Java:
Ver original
  1. public class SimpleRead implements Runnable, SerialPortEventListener{
  2.     static CommPortIdentifier portId;
  3.     static Enumeration portList;
  4.    
  5.     InputStream inputStream;
  6.     SerialPort serialPort;
  7.     Thread readThread;
  8.     byte[] readBuffer;
  9.    
  10.     public static void main(String[] args) {
  11.         portList = CommPortIdentifier.getPortIdentifiers();
  12.         System.out.println("portlist... "+portList);
  13.         while(portList.hasMoreElements()){
  14.             portId = (CommPortIdentifier) portList.nextElement();
  15.             if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
  16.                 System.out.println("el puerto identificado es Serial... "+portId.getPortType());
  17.                 if (portId.getName().equals("COM4")) {
  18.                     System.out.println("el puerto identificado es COM4... "+portId.getName());
  19.                     SimpleRead reader = new SimpleRead();
  20.                 }else{
  21.                     System.out.println("incapaz de abrir el puerto");
  22.                 }
  23.             }
  24.         }
  25.     }
  26.    
  27.    public SimpleRead(){
  28.        try {
  29.            System.out.println("En el constructor SimpleRead()");
  30.            serialPort = (SerialPort) portId.open("SimpleReadApp1111",500);
  31.            System.out.println("Serial Port... "+serialPort);
  32.        } catch (PortInUseException e) {
  33.            System.out.println("Excepcion de puerto en uso");
  34.        }
  35.        try {
  36.            inputStream = serialPort.getInputStream();
  37.            System.out.println("InputStream... "+inputStream);
  38.        } catch (IOException e) {
  39.            System.out.println("IO Exception");
  40.        }
  41.        try {
  42.            serialPort.addEventListener(this);
  43.        } catch (TooManyListenersException e) {
  44.            System.out.println("Excepcion de Too many Listeners");
  45.        }
  46.        serialPort.notifyOnDataAvailable(true);
  47.        try {
  48.           serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
  49.          
  50.           //no handshaking or other flow control
  51.           serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
  52.          
  53.           //timer on any read of the serial port
  54.           serialPort.enableReceiveTimeout(500);
  55.          
  56.            System.out.println(".......................");
  57.        } catch (UnsupportedCommOperationException e) {
  58.            System.out.println("Excepcion Unsuppoerted comm operation");
  59.        }
  60.        readThread = new Thread(this);
  61.        readThread.start();
  62.    }
  63.    
  64.    public void run(){
  65.        try {
  66.            System.out.println("En la funcion run()");
  67.            Thread.sleep(500);
  68.        } catch (InterruptedException e) {
  69.            System.out.println("Interrupted Exception en metodo run()");
  70.        }
  71.    }
  72.    
  73.    public void serialEvent(SerialPortEvent event){
  74.        
  75.        switch (event.getEventType()){
  76.            case SerialPortEvent.DATA_AVAILABLE:
  77.                readBuffer = new byte[8];
  78.                try {
  79.                    while(inputStream.available()>0){
  80.                        int numBytes = inputStream.read(readBuffer);
  81.                    }
  82.                    System.out.println(new String(readBuffer));
  83.                    
  84.                } catch (IOException e) {
  85.                    System.out.println("IO Exception en SerialEvent()");
  86.                }
  87.                break;
  88.        }
  89.    }
  90. }

En consola la funcion run() dejandola ejecutada devuelve un par de caracteres extraños como una "D" quizá un simbolo "<" y un cuadrado, nose muy bien que significa eso. Aunque si en la linea
Código Java:
Ver original
  1. System.out.println(new String(readBuffer));
le quito el new String recoge algo como "[B@b1cc87"...es como que no sabe como recibir esos datos, creo que deberia recoger una cadena muy larga binaria.. a ver si me podeis ayudar que esta pasando y porq el inputstream devuelve eso
saludos!

Última edición por warywin; 08/12/2014 a las 09:19

Etiquetas: necesita, programa, usb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:35.