Frage

Ich möchte Port ein Linux-C-Programm auf Java. Dieses Programm steuert eine Kamera, die an den PC mit einem USB-Kabel angeschlossen ist. Der C-Code verwendet Linux SCSI Generic (sg).

Beispielcode aus dem C-Programm:

#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);
    ...
}

Gibt es eine Möglichkeit zum Anschluss dieses Programm zu Java? Ich war auf der Suche nach einer Cross-Plattform-SCSI-Bibliothek für Java geschrieben, aber keine gefunden. Ich war auch auf der Suche nach einem JNI über SCSI / sg, auch kein Glück.

War es hilfreich?

Lösung

Während Java viele der POSIX-API unterstützt, ist das ioctl Systemaufruf nicht Teil dessen, was es tut. Was Sie tun müssen, ist JNI zu verwenden Java zu ermöglichen, eine Funktion wie die scsi_write rufen Sie in der Frage geschrieben. Die zusätzlichen Kosten für mehr Beilagen mit minimal gegeben, dass Sie sprechen ohnehin externe Hardware Schnittstelle. Die cmd und buf Argumente Karte natürlich auf Java Byte-Arrays (und da Java-Arrays ihre Länge kennen, werden Sie die cmdLen und bufLen Argumente auf der Java-Ebene überhaupt nicht modellieren).

Andere Tipps

Sie können mehr Glück mit einer Java-basierten USB-Bibliothek, wie eine Implementierung von JSR080 (javax.usb). Sie können die Referenzimplementierung finden hier , sondern nur die Linux-Implementierung ist eine Art der Produktion bereit.

Bitte versuchen Sie es IOCTL, Sie vielleicht einen Blick auf sg3_utils Quellcode haben wollen zu lernen, wie man SCSI-PDU von ioctl zu senden, ist es C-Code, aber PDU und ioctl sind die gleichen. Dann wissen Sie, die Kamera steuern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top