Как отправить команды ESC/POS на USB-принтер?

Моя цель — программно открыть денежный ящик, но я не нашел подробной информации о том, как Java взаимодействует с портами Windows, поэтому не смог заставить его работать. Это методы, которые я пробовал (без ошибок в консоли Java):

public void cashdrawerOpen()   {

    String code1 = "27 112 0 150 250"; //decimal
    String code2 = "1B 70 00 96 FA"; //hexadecimal
    String code = "ESCp0û."; //ascii

     PrintService service = PrintServiceLookup.lookupDefaultPrintService();
     System.out.println(service.getName());
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    DocPrintJob pj = service.createPrintJob();
     byte[] bytes;
     bytes=code2.getBytes();
     Doc doc=new SimpleDoc(bytes,flavor,null);
      try {
        pj.print(doc, null);
    } catch (PrintException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public void cashdrawerOpen2(){
    String code1 = "27 112 0 150 250";
    String code2 = "1B 70 00 96 FA";
    String code = "ESCp0û.";
    FileOutputStream os = null;
    try {
        os = new FileOutputStream("USB001:POS-58");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
      PrintStream ps = new PrintStream(os);
      ps.print(code1.getBytes());
      ps.close();
}

Затем я начал играть с cmd, в частности следуя этому thread, но когда я выполняю команду «копировать /b open.bat USB001», он просто говорит: «перезаписать USB001? (да/нет/все)'

Есть идеи?


person tec    schedule 05.11.2016    source источник


Ответы (2)


Решено.

Как отправлять команды по USB не нашел, пришлось эмулировать LPT порты.

Если ваш принтер поставляется с драйвером под названием TM Virtual Port Driver или чем-то подобным (в моем случае):

  1. Установите его и настройте подключение принтера с помощью графического интерфейса.
  2. Используйте методы Java

Если не:

  1. Поделитесь принтером в панели управления.
  2. Откройте cmd от имени администратора
  3. NET USE LPT1 \[Computer-Name]\Printer /Persistent: Yes (не работает в win8.1)
  4. из Явы:

    public void cashdrawerOpen(){ 
        String code2 = "1B700096FA"; // my code in hex
        FileOutputStream os = null;
        try {
            os = new FileOutputStream("LPT1:POS-58");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
          PrintStream ps = new PrintStream(os);
        ps.print(toAscii(code2));
          ps.close();
    }
    
    public StringBuilder toAscii( String hex ){
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
    String str = hex.substring(i, i+2);
    output.append((char)Integer.parseInt(str, 16));
    }
     return output;
    
    }
    
person tec    schedule 09.11.2016
comment
cmd поддерживает ограниченный набор устройств: CON: для экрана/клавиатуры, COMx: для последовательных портов и LPTx: или PRN: для портов принтера (см. команда режима) (по сути, это не исторический материал, до того, как появился USB). Поэтому привязка вашего USB к поддерживаемому устройству (как вы это сделали) — это путь. - person Stephan; 10.04.2018
comment
@Стефан, кажется, я неправильно понял. USB перед остальными? Или наоборот? - person tec; 10.04.2018
comment
спросите у программистов Microsoft... Я могу себе представить, что протокол USB немного более продвинут, чем COM или LPT, которые довольно просты и понятны; В те времена я писал для них драйвера с несколькими строчками Бейсика. (PS: вероятно, причина в отсутствии поддержки со стороны Microsoft, драйверы виртуальных портов даже существуют) - person Stephan; 10.04.2018
comment
@Stephan Итак, USB новее и не полностью поддерживается. Спасибо за информацию. - person tec; 10.04.2018
comment
в основном да. USB появился в наше время для Windows, поэтому они, вероятно, не заботились об адаптации старых добрых драйверов DOS к новой технологии (поскольку теперь есть драйверы Windows для использования) - person Stephan; 10.04.2018

Ну... файл USB001 уже должен существовать в том месте, куда вы копируете, и теперь он спрашивает вас, хотите ли вы перезаписать его, поскольку вы копируете open.bat в файл с тем же именем USB001.

Если вы всегда хотите перезаписать файл USB001, также используйте ключ /Y, например:

copy /B /Y open.bat USB001

Вы можете просмотреть все переключатели для COPY в командной строке, введя:

copy /?
person DevilsHnd    schedule 06.11.2016
comment
Я думал, что команда отправляет open.bat на порт USB001, у меня нет файла USB001, если это не так, то почему в связанной ветке говорится: «копировать / b — это совершенно правильный способ отправки ваших команд управления на принтер и он должен работать. '. - person tec; 06.11.2016
comment
Я открываю денежный ящик с помощью: «start/min notepad open.bat». Но я не хочу использовать блокнот, потому что он печатает имя файла и много пробелов, мне просто нужно открыть денежный ящик. Синтаксис команды start можно найти здесь: ссылка . - person tec; 06.11.2016
comment
Обновление: мне удалось открыть денежный ящик, «эмулирующий» порт LPT1. 1. Поделитесь принтером в панели управления. 2-й — открыть cmd от имени администратора 3-й — NET USE LPT1: \[Computer-Name]\Printer . Тогда сработает команда 'copy /b open.bat lpt1'. Но он по-прежнему печатает необработанные данные, когда открывается денежный ящик. - person tec; 06.11.2016
comment
Эм-м-м? ваш принтер понимает файлы .bat?? Да, расширение не имеет значения для машины (машин), но вы действительно должны называть его .bin или .dat или .hex, чтобы избежать путаницы. - person Stephan; 11.04.2018