accesso Java scsi
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.
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.