Domanda

Mi piacerebbe porta un programma Linux C a Java. Questo programma controlla una videocamera che è collegato al PC con un cavo USB. Il codice C utilizza Linux SCSI Generico (sg).

Il codice di esempio dal programma 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);
    ...
}

C'è un modo per porto a programmi Java? Ero alla ricerca di una libreria SCSI multipiattaforma scritto per Java, ma non ne trovò. Sono stato anche alla ricerca di un JNI su SCSI / sg, anche senza fortuna.

È stato utile?

Soluzione

Mentre Java supporta un sacco di API POSIX, la chiamata di sistema ioctl non è parte di ciò che fa. Quello che è necessario fare è usare JNI per consentire Java per chiamare una funzione come la scsi_write hai scritto nella domanda. Il costo aggiuntivo di utilizzare più spessori è minimo dato che si sta parlando di interfacciamento con hardware esterno in ogni caso. Gli argomenti cmd e buf mappa naturalmente a array di byte Java (e dal momento che le matrici di Java conoscono la loro lunghezza, non sarà modellare la cmdLen e gli argomenti bufLen a livello Java a tutti).

Altri suggerimenti

Si può avere più fortuna con una libreria di USB basato su Java, come un'implementazione di JSR080 (javax.usb). È possibile trovare l'implementazione di riferimento qui , ma solo l'attuazione di Linux è una specie di pronti per la produzione.

Si prega di provare IOCTL, si consiglia di dare un'occhiata al codice sorgente di sg3_utils per imparare come inviare SCSI PDU da ioctl, è il codice C, ma PDU e ioctl sono gli stessi. Allora sai che è possibile controllare la telecamera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top