Java SCSI доступ - PullRequest
       14

Java SCSI доступ

1 голос
/ 21 декабря 2010

Я бы хотел портировать программу Linux C на Java.Эта программа управляет камерой, которая подключена к ПК с помощью USB-кабеля.Код C использует Linux SCSI Generic (sg).

Пример кода из программы 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);
    ...
}

Есть ли способ перенести эту программу на Java?Я искал кроссплатформенную библиотеку SCSI, написанную для Java, но не нашел ни одной.Я также искал JNI через SCSI / sg, тоже не повезло.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

Хотя Java поддерживает большую часть API POSIX, системный вызов ioctl не является частью того, что он делает. Вам нужно использовать JNI, чтобы позволить Java вызывать такую ​​функцию, как scsi_write, которую вы написали в вопросе. Дополнительные затраты на использование большего количества прокладок минимальны, учитывая, что вы все равно говорите о взаимодействии с внешним оборудованием. Аргументы cmd и buf естественно отображаются в байтовые массивы Java (и поскольку массивы Java знают их длину, вы не будете моделировать аргументы cmdLen и bufLen на уровне Java вообще).

2 голосов
/ 21 декабря 2010

Возможно, вам больше повезет с библиотекой USB на основе Java, например, реализацией JSR080 (javax.usb). Справочную реализацию можно найти здесь , но только реализация Linux готова к работе.

0 голосов
/ 01 апреля 2019

Пожалуйста, попробуйте IOCTL, вы можете взглянуть на исходный код sg3_utils, чтобы узнать, как отправлять SCSI PDU по ioctl, это C-код, но PDU и ioctl одинаковы. Тогда вы знаете, что можете управлять камерой.

...