Question

Je voudrais au port d'un programme Linux C à Java. Ce programme contrôle une caméra qui est connecté à l'ordinateur avec un câble USB. Le code C utilise Linux SCSI générique (sg).

Exemple de code du programme 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);
    ...
}

Est-il possible de porter ce programme à Java? Je cherchais une bibliothèque SCSI multi-plateforme écrit pour Java, mais pas trouvé. Je cherchais aussi un JNI sur SCSI / sg, également pas de chance.

Était-ce utile?

La solution

Alors que Java prend en charge beaucoup de l'API Posix, l'appel système ioctl ne fait pas partie de ce qu'il fait. Qu'est-ce que vous devez faire est d'utiliser JNI pour permettre Java d'appeler une fonction telle que la scsi_write vous avez écrit dans la question. Le coût supplémentaire de l'utilisation de plus est minime étant donné les cales que vous parlez l'interface avec le matériel externe de toute façon. Les arguments cmd et buf carte naturellement tableaux Java d'octets (et étant donné que les tableaux de Java connaissent leur longueur, vous ne serez pas modéliser les arguments cmdLen et bufLen au niveau Java du tout).

Autres conseils

Vous pouvez avoir plus de chance avec une bibliothèque USB Java, comme une implémentation de JSR080 (javax.usb). Vous trouverez l'implémentation de référence , mais seulement la mise en œuvre Linux est une sorte de prêt pour la production.

S'il vous plaît essayer IOCTL, vous pouvez jeter un oeil à code source de sg3_utils pour apprendre comment envoyer SCSI PDU par ioctl, son code C, mais PDU et ioctl sont les mêmes. Ensuite, vous savez que vous pouvez contrôler la caméra.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top