Java scsi-доступ

Я хотел бы перенести программу 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, но тоже не повезло.


person asalamon74    schedule 21.12.2010    source источник
comment
Вы хотите реализовать это на Linux или, в частности, на кросс-платформенной платформе?   -  person Mark Snidovich    schedule 21.12.2010
comment
Почему вы хотите портировать это на Java? Я не вижу никакой выгоды в переносе такого аппаратно-зависимого кода на Java. Возможно, вы захотите обернуть HW-доступ в библиотеку C и вызвать его из Java через JNI. Таким образом, вы могли бы (например) написать графический интерфейс на Java и по-прежнему использовать свой рабочий и протестированный код C для доступа к HW.   -  person Joachim Sauer    schedule 21.12.2010
comment
Кроссплатформенность конечно лучше.   -  person asalamon74    schedule 21.12.2010
comment
@Joachim: Он хочет получить доступ к USB-устройству с помощью Java. Почему это больше зависит от оборудования, чем что-либо еще, что обычно делается с Java, например, доступ к клавиатуре, мыши, сети, дисплею, принтерам и т. д.?   -  person jarnbjo    schedule 21.12.2010
comment
зачем портировать: Если это невозможно, я не буду портировать. Я просто хотел узнать, возможно ли это. Может быть, кто-то уже пытался портировать подобный код и может дать мне несколько советов.   -  person asalamon74    schedule 21.12.2010
comment
@jarnbjo: потому что клавиатуры, мыши, сетевые карты, дисплеи и принтеры имеют абстракции на платформе Java (и в большинстве ОС), которые позволяют какое-то аппаратно-независимое взаимодействие с ними. Использование API-интерфейсов уровня SCSI по определению зависит от оборудования.   -  person Joachim Sauer    schedule 21.12.2010


Ответы (3)


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

person Donal Fellows    schedule 21.12.2010
comment
И нет, вещи, использующие ioctl, очень редко переносимы. Это системный вызов для передачи информации непосредственно драйверу или устройству, и он никогда не будет переносимым. - person Donal Fellows; 21.12.2010

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

person jarnbjo    schedule 21.12.2010

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

person Diors    schedule 01.04.2019