2014-07-21 5 views
3

Недавно я создал программу java, которая печатает квитанцию ​​и открывает денежный ящик, который подключен к принтеру.Как открыть денежные ящики, подключенные к компьютеру

Теперь мне нужно открыть денежный ящик, который будет напрямую подключен к компьютеру через RJ11.

Поскольку я не буду подключать денежный ящик к принтеру, мой feedPrinter будет бесполезным. Итак, как я могу позвонить и отправить денежный ящик командам?

Вот мой код

public String openDrawer() 
{ 
    final byte[] openCD={27,112,0,60,120}; 
    String s=new String(openCD); 
    commandSet+=s; 
    return s; 
} 


public static void main(String args[]) 
{ 
    PrinterOptions p=new PrinterOptions(); 
    p.openDrawer(); 
    feedPrinter(p.finalCommandSet().getBytes()); 
} 


private static boolean feedPrinter(byte[] b) 
{ 
    try 
    { 

     AttributeSet attrSet = new HashPrintServiceAttributeSet(new PrinterName("PRINTERNAME", null)); 
//what should I change PRINTERNAME to connect directly to cash drawer 
     DocPrintJob job = PrintServiceLookup.lookupPrintServices(null, attrSet)[0].createPrintJob(); 
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; 
     Doc doc = new SimpleDoc(b, flavor, null); 
     PrintJobWatcher pjDone = new PrintJobWatcher(job); 

     job.print(doc, null); 
     pjDone.waitForDone(); 
     System.out.println("Done !"); 
    } 
    catch(javax.print.PrintException pex) 
    { 

     System.out.println("Printer Error " + pex.getMessage()); 
     return false; 
    } 
    catch(Exception e) 
    { 
    e.printStackTrace(); 
    return false; 
    } 
    return true; 
} 

public String finalCommandSet() 
{ 
    return commandSet; 
} 
+2

Трудно дать вам хороший ответ на этот вопрос без дополнительной информации, такой как информация о том, как вы хотите «поговорить» с денежным ящиком ... Существует ли конкретный API, против которого вы разрабатываете? Например, есть ли DrawerOptions() '? Это также немного пахнет, как будто вы просите домашнее решение;). –

+0

Мне удалось распечатать квитанцию ​​и открыть денежный ящик, который подключен к принтеру. Я просто хотел узнать, будет ли мне по-прежнему менять свой код, если я подключу его непосредственно к компьютеру. 'DrawerOptions () '? hmm none Я думаю, что все, что мне нужно, это открыть его: D – askManiac

+0

Whats commandSet –

ответ

0

Не уверен, что о технических, но как код комментария:

String s = new String(openCD, StandardCharsets.ISO_8859_1); 

    feedPrinter(p.finalCommandSet().getBytes(StandardCharsets.ISO_8859_1)); 

Без указания кодировки используется кодировка платформы по умолчанию. Это не переносимый способ программирования. И на компьютере Unicode, скажем, Linux с UTF-8, это пойдет не так: openCD не является допустимой последовательностью байтов UTF-8.

Но лучше, конечно:

ByteArrayOuputStream commandSet; 

public void openDrawer() 
{ 
    final byte[] openCD={27,112,0,60,120}; 
    commandSet.write(openCD); 
} 


public static void main(String args[]) 
{ 
    PrinterOptions p=new PrinterOptions(); 
    p.openDrawer(); 
    feedPrinter(p.commandSet.toByteArray()); 
} 
0

Поскольку принтер, очевидно, находится под контролем Esc последовательностей, он будет работать, как есть. Для принтера последовательность, полученная через последовательный интерфейс (или что-то другое), имеет то же значение, что и последовательность, полученная через интерфейс Centronics (или что-то еще).

Вам просто нужно убедиться, что новое соединение передает данные правильно, что и должно быть в любом случае.

Update:

Имейте в виду, однако, что я, возможно, у Вас неправильно: я думал, что вы ссылаетесь подключения принтера по сравнению с подключением по-разному через Centronics.

Вы говорите о подключении денежного ящика непосредственно к компьютеру без использования принтера. Тогда, конечно, это не сработает без дополнительных усилий, потому что тогда последовательность Esc не будет интерпретироваться принтером или, по крайней мере, не откроет ящик.

Если вы предоставите подробную информацию о интерфейсе ящика, мы все знали больше.

+0

ok спасибо: DI не может проголосовать за ваш ответ, потому что говорит, что мне нужно как минимум 15 человек. спасибо, хотя – askManiac

+0

Doh я не могу, потому что я не могу выдвинуть свой собственный ответ: D – TheBlastOne

+0

haha ​​lol большое спасибо: D – askManiac

0

Лучше всего подключить денежный ящик к принтеру квитанции вместо прямого доступа к компьютеру, и команда отправки и ESC для открытия должна работать. Если вы не можете этого сделать, я получил его для работы на некоторых компьютерах, используя jnpout32pkg.dll для записи непосредственно в RJ11-порт. Однако адрес RJ11, по-видимому, отличается для разных аппаратных средств, поэтому вам нужно выяснить, к какому адресу писать. Но этот подход может также позволить вам прочитать, открыт ли ящик наличных денег (что является новым требованием здесь, в Норвегии).)

0

В первую очередь, получить ящик код/​​резак для принтера из http://keyhut.com/popopen4.htm

код Ящика для моего принтера = 27,112,0,100,250

Затем, используйте код, чтобы откройте свой денежный ящик.

public void openCashDrawer() { 

     byte[] open = {27,112,0,100,(byte) 250}; 
//  byte[] cutter = {29, 86,49}; 
     PrintService pservice = 
     PrintServiceLookup.lookupDefaultPrintService(); 
     DocPrintJob job = pservice.createPrintJob(); 
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; 
     Doc doc = new SimpleDoc(open,flavor,null); 
     PrintRequestAttributeSet aset = new 
     HashPrintRequestAttributeSet(); 
     try { 
      job.print(doc, aset); 
     } catch (PrintException ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 

Это должно сработать.

спасибо.

Смежные вопросы