網絡列印走的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;
}
複制代碼
對應的文檔為
檢視列印效果
标簽列印機
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
複制代碼
檢視列印效果:
對應的指令可以參考文檔,比如第一行設定标簽紙寬度和長度的SIZE指令
一些注意的點
可以使用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
複制代碼
如果在編寫驅動過程中遇到問題,可加作者微信探讨