天天看點

java socket 列印機_思普瑞特,發票列印機和标簽列印機java網絡驅動設計與實作...

網絡列印走的socket連接配接,主流的java, php, c, c#等語言都支援socket,是以實作列印機的網絡列印幾乎是和語言無關的

列印機預設端口是9100

使用socket連接配接上列印機後,将列印内容按照列印機的指令進行編碼後調用send就可以列印了

協定文檔

發票列印機和标簽列印機走的協定不同,是以各自都有一個協定,發票列印機使用的是esc協定,标簽列印機使用的是tsc/tspl協定

發票列印機esc協定文檔:

标簽列印機tsc/tspl協定文檔:

可以看到列印機支援的指令非常多,下面找到常用的指令實作我們的列印目的

發票列印機

發票列印機已經有java驅動了,參考:github.com/SubLuLu/the…

發票列印機指令使用10進制表示了,是以難以閱讀,指令對應的意思請對照文檔

核心代碼如下

連接配接列印機

public NetEscPos(String ip, int port, String encoding) throws IOException{

Socket socket = new Socket(ip, port);

socketOut = socket.getOutputStream();

socket.isClosed();

NetEscPos.encoding = encoding;

writer = new OutputStreamWriter(socketOut, encoding);

}

複制代碼

發送指令,比如發送切紙指令

private NetEscPos feedAndCut() throws IOException{

writer.write(0x1D);

writer.write(86);

writer.write(65);

writer.write(0);

writer.flush();

return this;

}

複制代碼

對應的文檔為

java socket 列印機_思普瑞特,發票列印機和标簽列印機java網絡驅動設計與實作...

檢視列印效果

java socket 列印機_思普瑞特,發票列印機和标簽列印機java網絡驅動設計與實作...

标簽列印機

SIZE 40 mm, 30 mm

SPEED 5

DENSITY 7

DIRECTION 1

REFERENCE 0,0

OFFSET 0 mm

SHIFT 0

CLS

TEXT 20,60,"TSS24.BF2",0,2,2,"堂食 0001"

TEXT 20,120,"TSS24.BF2",0,1,1,"2019-03-22 10:05:51"

TEXT 20,150,"TSS24.BF2",0,1,1,"大雞腿(1/3)"

TEXT 20,180,"TSS24.BF2",0,1,1,"加冰 标簽備注"

PRINT 1

複制代碼

檢視列印效果:

java socket 列印機_思普瑞特,發票列印機和标簽列印機java網絡驅動設計與實作...

對應的指令可以參考文檔,比如第一行設定标簽紙寬度和長度的SIZE指令

java socket 列印機_思普瑞特,發票列印機和标簽列印機java網絡驅動設計與實作...

一些注意的點

可以使用redis的阻塞隊列實作擷取是否列印成功的狀态,參考:基于List的 LPUSH+BRPOP 的實作

字元集需要設定成 gb2312

// 每行進行列印

for (int i = 0; i < bufImage.getHeight() / 24 + 1; i++) {

write(escBmp);

for (int j = 0; j < bufImage.getWidth(); j++) {

for (int k = 0; k < 24; k++) {

if (((i * 24) + k) < bufImage.getHeight()) {

pixelColor = bufImage.getRGB(j, (i * 24) + k);

if (pixelColor != -1) {

data[k / 8] += (byte) (128 >> (k % 8));

}

}

}

write(data);

// 重置參數

data[0] = (byte) 0x00;

data[1] = (byte) 0x00;

data[2] = (byte) 0x00;

}

//換行

byte[] byteSend1 = new byte[2];

byteSend1[0] = 0x0d;

byteSend1[1] = 0x0a;

write(byteSend1);

}

複制代碼

c#版如下

// data

for (int i = 0; i < (bmp.Height / 24) + 1; i++)

{

socket.Send(escBmp, escBmp.Length, 0);

for (int j = 0; j < bmp.Width; j++)

{

for (int k = 0; k < 24; k++)

{

if (((i * 24) + k) < bmp.Height) // if within the BMP size

{

pixelColor = bmp.GetPixel(j, (i * 24) + k);

if (pixelColor.R == 0)

{

data[k / 8] += (byte)(128 >> (k % 8));

}

}

}

socket.Send(data, 3, 0);

data[0] = (byte)'\x00';

data[1] = (byte)'\x00';

data[2] = (byte)'\x00'; // Clear to Zero.

}

byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");

//發送測試資訊

socket.Send(byte_send, byte_send.Length, 0);

} // data

複制代碼

如果在編寫驅動過程中遇到問題,可加作者微信探讨