Чтение состояния USB-принтера в Java

Я разрабатываю программу на Java поверх Windows 7, в которой используется POS-принтер, подключенный через USB. Я начал с обычного PrintJob, используя очередь печати, но этого недостаточно. Мне нужно контролировать больше вещей, чем может водитель.

Поэтому я отправляю необработанные данные со всеми командами, написанными мной. Я достиг этого благодаря ответу norbi771 здесь Печать Zebra ZM400 с использованием Java . Итак, я поделился принтером в сети и создаю OutputStream для отправки необработанных данных на \localhost\myprinter.

Это прекрасно работает, моя проблема возникает, когда я пытаюсь открыть InputStream, чтобы прочитать состояние принтера. Эта модель имеет несколько команд для запроса статуса, и принтер немедленно отвечает. Руководство говорит:

Статус передается при получении последовательности данных. Принтер передает текущее состояние, представленное однобайтовыми данными. Принтер передает статус, не подтверждая, может ли хост-компьютер получать данные.

Затем я могу отправлять необработанные данные (я печатаю с использованием той же схемы и URL-адреса), но когда я пытаюсь прочитать статус, я получаю исключение FileNotFoundException. java.io.FileNotFoundException: \localhost\myprinter (система не может найти указанный файл). Как это можно на вход не найти, а на выход да?

Кто-нибудь знает, как я могу прочитать информацию, отправленную принтером? Вот мой код до сих пор. Я выполняю это в потоке каждые 5 секунд, поэтому это не принтер «не готов/подключен». Я даже пытался заснуть перед созданием InputStream, но ничего не работает. Есть ли другой способ подключиться, чтобы прочитать его?

FileOutputStream os; FileInputStream is;
PrintStream ps = null; InputStreamReader reader = null;
char[] askStatus = {0x10, 0x04, 0x02};
String port = "\\\\localhost\\myprinter";
try {
    os = new FileOutputStream(port);
    ps = new PrintStream(os);

    ps.print(askStatus);
    ps.flush();
    //Everything fine until here
    //sleep(1000);

    is = new FileInputStream(port); //This line throws the Exception
    reader = new InputStreamReader(is);
    if (reader.ready()) {
    int status = reader.read();
    System.out.println("Status: " + Integer.toBinaryString(status));
    }
} catch (Ex...) {...}

person rolgalan    schedule 19.09.2013    source источник


Ответы (1)


Возможно, вам понадобится USB-доступ к принтеру, для которого вам понадобится что-то вроде JUSB. . Я понимаю, что реализация Windows имеет некоторые ограничения, связанные с использованием libusb.

Если вам повезет, вы сможете запросить статус, используя это. Если нет, вам придется использовать запрос GET_PORT_STATUS для принтера класса USB, чтобы получить статус, как описано в эта страница.

Я еще не нашел полный рабочий пример этого.

person aled    schedule 11.11.2013