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 поддържа много от POSIX API, системното извикване 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

Може да имате повече късмет с базирана на Java USB библиотека, като имплементация на 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