Pregunta

Me gustaría puerto de un programa de Linux C a Java. Este programa controla una cámara que está conectada al PC mediante un cable USB. El código C utiliza Linux SCSI Genérico (sg).

Código de ejemplo del programa de C:

#include <linux/../scsi/sg.h>

...

static int scsi_write(int sg_fd, uint8_t *cmd, uint32_t cmdLen,
               uint8_t *buf, uint32_t bufLen) {

    sg_io_hdr_t io;
    int r;

    memset(&io, 0, sizeof(io));

    io.interface_id = 'S';
    io.cmd_len = cmdLen;

    ...        
    r = ioctl(sg_fd, SG_IO, &io);
    ...
}

¿Hay una manera de puerto a programas Java? Yo estaba buscando una biblioteca SCSI multiplataforma escrito para Java, pero no encontró ninguno. Yo también estaba buscando una JNI sobre SCSI / sg, también sin suerte.

¿Fue útil?

Solución

Mientras que Java es compatible con una gran cantidad de la API POSIX, la llamada al sistema ioctl no es parte de lo que hace. Lo que usted tiene que hacer es usar JNI para permitir Java para llamar a una función como la scsi_write que escribió en la pregunta. El coste adicional de utilizar más cuñas es mínimo dado que usted está hablando de interfaz con el hardware externo de todos modos. Los argumentos cmd y buf mapa de forma natural a las matrices de bytes de Java (y ya que las matrices de Java conocen su longitud, que no van a modelar el cmdLen y argumentos bufLen a nivel de Java en absoluto).

Otros consejos

Es posible que tenga más suerte con una biblioteca USB basado en Java, como una implementación de JSR080 (javax.usb). Puede encontrar la implementación de referencia aquí , pero sólo la implementación de Linux es una especie de lista para producción.

Por favor, intente IOCTL, es posible que desee echar un vistazo a código fuente sg3_utils a aprender a enviar SCSI PDU por ioctl, que es el código C, pero PDU y ioctl son los mismos. A continuación, usted sabe que puede controlar la cámara.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top