如何打开连接电脑的现金抽屉

时间:2014-07-21 07:49:45

标签: java

我最近创建了一个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;
}

4 个答案:

答案 0 :(得分:1)

首先,从中获取打印机的抽屉/刀具代码 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());
        }
    }

这应该有用。

谢谢。

答案 1 :(得分:0)

不确定技术细节,但作为代码评论:

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

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

如果不指定编码,则使用默认平台编码。这是一种不可移植的编程方式。在使用UTF-8的Unicode机器上,这会出错: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());
}

答案 2 :(得分:0)

由于打印机显然是由Esc序列控制的,因此它将按原样工作。对于打印机,通过串行接口(或其他)接收的序列与收到的相同序列具有完全相同的含义通过Centronics界面(或其他)。

您只需要确保新连接正确传输数据,无论如何都要传输数据。

更新

但请注意,我可能错了你:我认为你指的是通过Centronics连接打印机而不是以不同的方式连接打印机。

您所说的是在不使用打印机的情况下将现金抽屉直接连接到计算机。 然后,当然,如果没有进一步的努力它将无法工作,因为打印机不会解释Esc序列,或者至少不会打开抽屉。

如果您提供有关抽屉界面的详细信息,我们都知道更多。

答案 3 :(得分:0)

最好是将现金抽屉连接到收据打印机而不是直接连接到计算机,并且发送和ESC命令打开应该可以工作。 但是,如果你不能这样做,我通过使用jnpout32pkg.dll直接写入RJ11端口让它在某些计算机上工作。但是,RJ11的地址对于不同的硬件似乎有所不同,因此您必须找出要写入的地址。但是这种方法也可以让你读取现金抽屉是否开放(这是挪威目前的新要求......)