一热敏打印机ESC指令
它包含了一系列的控制指令,通过这些指令可以实现对打印内容的格式设置,如字体大小、加粗、下划线、对齐方式等。还能够控制打印的位置、纸张进纸、切纸等操作。
例如,在商业零售场景中,收银小票打印机就是基于 ESC/POS 指令来打印出清晰、格式规范的交易小票。又比如,一些标签打印机也采用这一指令集,以便精确地打印出各种产品标签。
ESC/POS 的广泛应用,使得不同厂家生产的打印设备在一定程度上实现了指令的通用性,方便了开发者进行软件编程和控制
二、封装代码
package CyberWinPHP.Cyber_Plus;
import java.io.ByteArrayOutputStream;
import android.graphics.Bitmap;
import android.util.Log;
public class ESCUtil {
public static final byte ESC = 0x1B;// Escape
public static final byte FS = 0x1C;// Text delimiter
public static final byte GS = 0x1D;// Group separator
public static final byte DLE = 0x10;// data link escape
public static final byte EOT = 0x04;// End of transmission
public static final byte ENQ = 0x05;// Enquiry character
public static final byte SP = 0x20;// Spaces
public static final byte HT = 0x09;// Horizontal list
public static final byte LF = 0x0A;//Print and wrap (horizontal orientation)
public static final byte CR = 0x0D;// Home key
public static final byte FF = 0x0C;// Carriage control (print and return to the standard mode (in page mode))
public static final byte CAN = 0x18;// Canceled (cancel print data in page mode)
//初始化打印机
public static byte[] init_printer() {
byte[] result = new byte[2];
result[0] = ESC;
result[1] = 0x40;
return result;
}
//打印浓度指令
public static byte[] setPrinterDarkness(int value){
byte[] result = new byte[9];
result[0] = GS;
result[1] = 40;
result[2] = 69;
result[3] = 4;
result[4] = 0;
result[5] = 5;
result[6] = 5;
result[7] = (byte) (value >> 8);
result[8] = (byte) value;
return result;
}
/**
* 打印单个二维码 sunmi自定义指令
* @param code: 二维码数据
* @param modulesize: 二维码块大小(单位:点, 取值 1 至 16 )
* @param errorlevel: 二维码纠错等级(0 至 3)
* 0 -- 纠错级别L ( 7%)
* 1 -- 纠错级别M (15%)
* 2 -- 纠错级别Q (25%)
* 3 -- 纠错级别H (30%)
*/
public static byte[] getPrintQRCode(String code, int modulesize, int errorlevel){
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try{
buffer.write(setQRCodeSize(modulesize));
buffer.write(setQRCodeErrorLevel(errorlevel));
buffer.write(getQCodeBytes(code));
buffer.write(getBytesForPrintQRCode(true));
}catch(Exception e){
e.printStackTrace();
}
return buffer.toByteArray();
}
//
/* 打开钱箱指令 */
public static final byte[] cyber_ESC_OPEN_DRAWER = new byte[]{ESC, 'p', 0x00, 0x10, (byte) 0xff};
/**
* 横向两个二维码 sunmi自定义指令
* @param code1: 二维码数据
* @param code2: 二维码数据
* @param modulesize: 二维码块大小(单位:点, 取值 1 至 16 )
* @param errorlevel: 二维码纠错等级(0 至 3)
* 0 -- 纠错级别L ( 7%)
* 1 -- 纠错级别M (15%)
* 2 -- 纠错级别Q (25%)
* 3 -- 纠错级别H (30%)
*/
public static byte[] getPrintDoubleQRCode(String code1, String code2, int modulesize, int errorlevel){
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try{
buffer.write(setQRCodeSize(modulesize));
buffer.write(setQRCodeErrorLevel(errorlevel));
buffer.write(getQCodeBytes(code1));
buffer.write(getBytesForPrintQRCode(false));
buffer.write(getQCodeBytes(code2));
//加入横向间隔
buffer.write(new byte[]{0x1B, 0x5C, 0x18, 0x00});
buffer.write(getBytesForPrintQRCode(true));
}catch(Exception e){
e.printStackTrace();
}
return buffer.toByteArray();
}
/**
* 光栅打印二维码
*/
public static byte[] getPrintQRCode2(String data, int size){
byte[] bytes1 = new byte[4];
bytes1[0] = GS;
bytes1[1] = 0x76;
bytes1[2] = 0x30;
bytes1[3] = 0x00;
byte[] bytes2 = BytesUtil.getZXingQRCode(data, size);
return BytesUtil.byteMerger(bytes1, bytes2);
}
/**
* 打印一维条形码
*/
public static byte[] getPrintBarCode(String data, int symbology, int height, int width, int textposition){
if(symbology < 0 || symbology > 10){
return new byte[]{LF};
}
if(width < 2 || width > 6){
width = 2;
}
if(textposition <0 || textposition > 3){
textposition = 0;
}
if(height < 1 || height>255){
height = 162;
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try{
buffer.write(new byte[]{0x1D,0x66,0x01,0x1D,0x48,(byte)textposition,
0x1D,0x77,(byte)width,0x1D,0x68,(byte)height,0x0A});
byte[] barcode;
if(symbology == 10){
barcode = BytesUtil.getBytesFromDecString(data);
}else{
barcode = data.getBytes("GB18030");
}
if(symbology > 7){
buffer.write(new byte[]{0x1D,0x6B,0x49,(byte)(barcode.length+2),0x7B, (byte) (0x41+symbology-8)});
}else{
buffer.write(new byte[]{0x1D,0x6B,(byte)(symbology + 0x41),(byte)barcode.length});
}
buffer.write(barcode);
}catch(Exception e){
e.printStackTrace();
}
return buffer.toByteArray();
}
//光栅位图打印
public static byte[] printBitmap(Bitmap bitmap){
byte[] bytes1 = new byte[4];
bytes1[0] = GS;
bytes1[1] = 0x76;
bytes1[2] = 0x30;
bytes1[3] = 0x00;
byte[] bytes2 = BytesUtil.getBytesFromBitMap(bitmap);
return BytesUtil.byteMerger(bytes1, bytes2);
}
//光栅位图打印 设置mode
public static byte[] printBitmap(Bitmap bitmap, int mode){
byte[] bytes1 = new byte[4];
bytes1[0] = GS;
bytes1[1] = 0x76;
bytes1[2] = 0x30;
bytes1[3] = (byte) mode;
byte[] bytes2 = BytesUtil.getBytesFromBitMap(bitmap);
return BytesUtil.byteMerger(bytes1, bytes2);
}
//光栅位图打印
public static byte[] printBitmap(byte[] bytes){
byte[] bytes1 = new byte[4];
bytes1[0] = GS;
bytes1[1] = 0x76;
bytes1[2] = 0x30;
bytes1[3] = 0x00;
return BytesUtil.byteMerger(bytes1, bytes);
}
/*
* 选择位图指令 设置mode
* 需要设置1B 33 00将行间距设为0
*/
public static byte[] selectBitmap(Bitmap bitmap, int mode){
return BytesUtil.byteMerger(BytesUtil.byteMerger(new byte[]{0x1B, 0x33, 0x00}, BytesUtil.getBytesFromBitMap(bitmap, mode)), new byte[]{0x0A, 0x1B, 0x32});
}
/**
* 跳指定行数
*/
public static byte[] nextLine(int lineNum) {
byte[] result = new byte[lineNum];
for (int i = 0; i < lineNum; i++) {
result[i] = LF;
}
return result;
}
// ------------------------underline-----------------------------
//设置下划线1点
public static byte[] underlineWithOneDotWidthOn() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 1;
return result;
}
//设置下划线2点
public static byte[] underlineWithTwoDotWidthOn() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 2;
return result;
}
//取消下划线
public static byte[] underlineOff() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 0;
return result;
}
// ------------------------bold-----------------------------
/**
* 字体加粗
*/
public static byte[] boldOn() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 69;
result[2] = 0xF;
return result;
}
/**
* 取消字体加粗
*/
public static byte[] boldOff() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 69;
result[2] = 0;
return result;
}
// ------------------------character-----------------------------
/*
*单字节模式开启
*/
public static byte[] singleByte(){
byte[] result = new byte[2];
result[0] = FS;
result[1] = 0x2E;
return result;
}
/*
*单字节模式关闭
*/
public static byte[] singleByteOff(){
byte[] result = new byte[2];
result[0] = FS;
result[1] = 0x26;
return result;
}
/**
* 设置单字节字符集
*/
public static byte[] setCodeSystemSingle(byte charset){
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 0x74;
result[2] = charset;
return result;
}
/**
* 设置多字节字符集
*/
public static byte[] setCodeSystem(byte charset){
byte[] result = new byte[3];
result[0] = FS;
result[1] = 0x43;
result[2] = charset;
return result;
}
// ------------------------Align-----------------------------
/**
* 居左
*/
public static byte[] alignLeft() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 0;
return result;
}
/**
* 居中对齐
*/
public static byte[] alignCenter() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 1;
return result;
}
/**
* 居右
*/
public static byte[] alignRight() {
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 2;
return result;
}
//切刀
public static byte[] cutter() {
byte[] data = new byte[]{0x1d, 0x56, 0x01};
return data;
}
//走纸到黑标
public static byte[] gogogo(){
byte[] data = new byte[]{0x1C, 0x28, 0x4C, 0x02, 0x00, 0x42, 0x31};
return data;
}
// private /
private static byte[] setQRCodeSize(int modulesize){
//二维码块大小设置指令
byte[] dtmp = new byte[8];
dtmp[0] = GS;
dtmp[1] = 0x28;
dtmp[2] = 0x6B;
dtmp[3] = 0x03;
dtmp[4] = 0x00;
dtmp[5] = 0x31;
dtmp[6] = 0x43;
dtmp[7] = (byte)modulesize;
return dtmp;
}
private static byte[] setQRCodeErrorLevel(int errorlevel){
//二维码纠错等级设置指令
byte[] dtmp = new byte[8];
dtmp[0] = GS;
dtmp[1] = 0x28;
dtmp[2] = 0x6B;
dtmp[3] = 0x03;
dtmp[4] = 0x00;
dtmp[5] = 0x31;
dtmp[6] = 0x45;
dtmp[7] = (byte)(48+errorlevel);
return dtmp;
}
private static byte[] getBytesForPrintQRCode(boolean single){
//打印已存入数据的二维码
byte[] dtmp;
if(single){ //同一行只打印一个QRCode, 后面加换行
dtmp = new byte[9];
dtmp[8] = 0x0A;
}else{
dtmp = new byte[8];
}
dtmp[0] = 0x1D;
dtmp[1] = 0x28;
dtmp[2] = 0x6B;
dtmp[3] = 0x03;
dtmp[4] = 0x00;
dtmp[5] = 0x31;
dtmp[6] = 0x51;
dtmp[7] = 0x30;
return dtmp;
}
private static byte[] getQCodeBytes(String code) {
//二维码存入指令
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
byte[] d = code.getBytes("GB18030");
int len = d.length + 3;
if (len > 7092) len = 7092;
buffer.write((byte) 0x1D);
buffer.write((byte) 0x28);
buffer.write((byte) 0x6B);
buffer.write((byte) len);
buffer.write((byte) (len >> 8));
buffer.write((byte) 0x31);
buffer.write((byte) 0x50);
buffer.write((byte) 0x30);
for (int i = 0; i < d.length && i < len; i++) {
buffer.write(d[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
return buffer.toByteArray();
}
/**
* 设置字体大小
*/
public static byte[] setTextSize(int size) {
byte[] bytes = CMD_FontSize(size).getBytes();
return bytes;
}
// 字体的大小
// 0:正常大小 1:两倍高 2:两倍宽 3:两倍大小 4:三倍高 5:三倍宽 6:三倍大小
// 7:四倍高 8:四倍宽 9:四倍大小 10:五倍高 11:五倍宽 12:五倍大小
public static String CMD_FontSize(int nfontsize) {
String _cmdstr = "";
// 设置字体大小
switch (nfontsize) {
case -1:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 0).toString();// 29 33
break;
case 0:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 0).toString();// 29 33
break;
case 1:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 1).toString();
break;
case 2:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 16).toString();
break;
case 3:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 17).toString();
break;
case 4:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 2).toString();
break;
case 5:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 32).toString();
break;
case 6:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 34).toString();
break;
case 7:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 3).toString();
break;
case 8:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 48).toString();
break;
case 9:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 51).toString();
break;
case 10:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 4).toString();
break;
case 11:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 64).toString();
break;
case 12:
_cmdstr = new StringBuffer().append((char) 29).append((char) 33)
.append((char) 68).toString();
break;
}
Log.d("textSize",_cmdstr);
return _cmdstr;
}
}
三、阿雪技术观
拥抱开源与共享,见证科技进步奇迹,畅享人类幸福时光!
让我们积极投身于技术共享的浪潮中,不仅仅是作为受益者,更要成为贡献者。无论是分享自己的代码、撰写技术博客,还是参与开源项目的维护和改进,每一个小小的举动都可能成为推动技术进步的巨大力量
扫码,可学习更多。