如何在不使用供应商 SDK 的情况下在 android 上使用热敏打印机(USB/Ethernet)?
How use thermal printer(USB/Ethernet) on android, without using vendor SDK,?
我已经实施了 EPSON SDK(用于蓝牙)并且工作正常,但不能在其他打印机上工作,是否有任何通用的方法来完成它。什么是 ESC 命令,它是如何工作的?,
您已经为几个不同的打印机变体找到并创建了一个实现,大多数都与另一个打印机兼容,所以它不会那么难(另外您将复制供应商的 SDK)。
然后创建两个实现都将使用的接口,例如初始化、扫描、printText、printImage、printBarCode
像这样读取设备...
static String getDeviceName() {
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
if (model.startsWith(manufacturer)) {
return capitalize(model);
} else {
return capitalize(manufacturer) + " " + model;
}
}
并使用结果来确定要使用的实现,然后再默认为适用于大多数设备的实现。一个界面会让你很快忘记你经历过的麻烦。
ESC 命令,只是给打印机的指令,这些与大多数设备几乎相同...它们用于开始新行、对齐文本、粗体等。 将它们想象成 html 标记(strong,h1,center),因为您将它们与要打印的文本混合使用,从而非常容易创建外观精美的印刷品.
请查找this one.It 对您的问题有帮助。
ESC/POS 命令参考提供了有关 ESC/POS 命令的详细信息,例如标准命令语法和协议。
它面向想要使用 ESC/POS 命令控制打印机的程序员。
ESC/POS 命令参考作为纸卷打印机的 ESC/POS APG 的替代品提供。因此,用于纸卷打印机的 ESC/POS APG 将不再修订。
ESC/POS Command Reference包含ANK模型或日本模型等标准模型的命令信息,并且可能包含中国模型或南亚模型。
其他型号如定制可能支持不同的命令或有不同的范围,或不同的命令参数默认值。请参考各产品规格。
使用下面的代码
注意:您可以使用 OutPutStream 对象来写入打印机,无论是蓝牙还是以太网还是 wifi
public class PrinterConstants {
public static int PORT=9100,TOTAL_CHAR=45,DIV1=10,DIV2=5,DIV3=10,DIV4=10,DIV5=10;
public static String IP="192.168.1.35";
private OutputStream printer;
public static final String UUID="00001101-0000-1000-8000-00805f9b34fb";
public PrinterConstants(OutputStream printer){
this.printer=printer;
}
public void printString(String str) throws IOException {
Log.i("PRINTER_PRE",str);
printer.write(str.getBytes());
printer.write(0xA);
printer.flush();
}
public void storeString(String str) throws IOException {
printer.write(str.getBytes());
printer.flush();
}
public void printStorage() throws IOException {
printer.write(0xA);
printer.flush();
}
public void feed(int feed) throws IOException {
//escInit();
printer.write(0x1B);
printer.write("d".getBytes());
printer.write(feed);printer.flush();
}
public void printAndFeed(String str, int feed) throws IOException {
//escInit();
printer.write(str.getBytes());
printer.write(0x1B);
printer.write("d".getBytes());
printer.write(feed);printer.flush();
}
public void setBold(Boolean bool) throws IOException {
printer.write(0x1B);
printer.write("E".getBytes());
printer.write((int)(bool?1:0));printer.flush();
}
/**
* Sets white on black printing
* */
public void setInverse(Boolean bool) throws IOException {
bool=false;
printer.write(0x1D);
printer.write("B".getBytes());
printer.write( (int)(bool?1:0) );printer.flush();
}
public void resetToDefault() throws IOException {
setInverse(false);
setBold(false);
setUnderline(0);
setJustification(0);printer.flush();
}
/**
* Sets underline and weight
*
* @param val
* 0 = no underline.
* 1 = single weight underline.
* 2 = double weight underline.
* */
public void setUnderline(int val) throws IOException {
printer.write(0x1B);
printer.write("-".getBytes());
printer.write(val);printer.flush();
}
/**
* Sets left, center, right justification
*
* @param val
* 0 = left justify.
* 1 = center justify.
* 2 = right justify.
* */
public void setJustification(int val) throws IOException {
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(val);
printer.flush();
}
public void setLeftRight(String left,String right) throws IOException {
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(0);
printString(left);
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(2);
printString(right);
printer.flush();
}
public void printBarcode(String code, int type, int h, int w, int font, int pos) throws IOException {
//need to test for errors in length of code
//also control for input type=0-6
//GS H = HRI position
printer.write(0x1D);
printer.write("H".getBytes());
printer.write(pos); //0=no print, 1=above, 2=below, 3=above & below
//GS f = set barcode characters
printer.write(0x1D);
printer.write("f".getBytes());
printer.write(font);
//GS h = sets barcode height
printer.write(0x1D);
printer.write("h".getBytes());
printer.write(h);
//GS w = sets barcode width
printer.write(0x1D);
printer.write("w".getBytes());
printer.write(w);//module = 1-6
//GS k
printer.write(0x1D); //GS
printer.write("k".getBytes()); //k
printer.write(type);//m = barcode type 0-6
printer.write(code.length()); //length of encoded string
printer.write(code.getBytes());//d1-dk
printer.write(0);//print barcode
printer.flush();
}
public void beep() throws IOException {
printer.write(0x1B);
printer.write("(A".getBytes());
printer.write(4);
printer.write(0);
printer.write(48);
printer.write(55);
printer.write(3);
printer.write(15);printer.flush();
}
public void setLineSpacing(int spacing) throws IOException {
//function ESC 3
printer.write(0x1B);
printer.write("3".getBytes());
printer.write(spacing);
}
public void cut() throws IOException {
printer.write(0x1D);
printer.write("V".getBytes());
printer.write(48);
printer.write(0);printer.flush();
}
}
使用上面的方法可以写ESC/POS命令直接输出流
我已经实施了 EPSON SDK(用于蓝牙)并且工作正常,但不能在其他打印机上工作,是否有任何通用的方法来完成它。什么是 ESC 命令,它是如何工作的?,
您已经为几个不同的打印机变体找到并创建了一个实现,大多数都与另一个打印机兼容,所以它不会那么难(另外您将复制供应商的 SDK)。
然后创建两个实现都将使用的接口,例如初始化、扫描、printText、printImage、printBarCode
像这样读取设备...
static String getDeviceName() {
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
if (model.startsWith(manufacturer)) {
return capitalize(model);
} else {
return capitalize(manufacturer) + " " + model;
}
}
并使用结果来确定要使用的实现,然后再默认为适用于大多数设备的实现。一个界面会让你很快忘记你经历过的麻烦。
ESC 命令,只是给打印机的指令,这些与大多数设备几乎相同...它们用于开始新行、对齐文本、粗体等。 将它们想象成 html 标记(strong,h1,center),因为您将它们与要打印的文本混合使用,从而非常容易创建外观精美的印刷品.
请查找this one.It 对您的问题有帮助。 ESC/POS 命令参考提供了有关 ESC/POS 命令的详细信息,例如标准命令语法和协议。 它面向想要使用 ESC/POS 命令控制打印机的程序员。
ESC/POS 命令参考作为纸卷打印机的 ESC/POS APG 的替代品提供。因此,用于纸卷打印机的 ESC/POS APG 将不再修订。 ESC/POS Command Reference包含ANK模型或日本模型等标准模型的命令信息,并且可能包含中国模型或南亚模型。 其他型号如定制可能支持不同的命令或有不同的范围,或不同的命令参数默认值。请参考各产品规格。
使用下面的代码
注意:您可以使用 OutPutStream 对象来写入打印机,无论是蓝牙还是以太网还是 wifi
public class PrinterConstants {
public static int PORT=9100,TOTAL_CHAR=45,DIV1=10,DIV2=5,DIV3=10,DIV4=10,DIV5=10;
public static String IP="192.168.1.35";
private OutputStream printer;
public static final String UUID="00001101-0000-1000-8000-00805f9b34fb";
public PrinterConstants(OutputStream printer){
this.printer=printer;
}
public void printString(String str) throws IOException {
Log.i("PRINTER_PRE",str);
printer.write(str.getBytes());
printer.write(0xA);
printer.flush();
}
public void storeString(String str) throws IOException {
printer.write(str.getBytes());
printer.flush();
}
public void printStorage() throws IOException {
printer.write(0xA);
printer.flush();
}
public void feed(int feed) throws IOException {
//escInit();
printer.write(0x1B);
printer.write("d".getBytes());
printer.write(feed);printer.flush();
}
public void printAndFeed(String str, int feed) throws IOException {
//escInit();
printer.write(str.getBytes());
printer.write(0x1B);
printer.write("d".getBytes());
printer.write(feed);printer.flush();
}
public void setBold(Boolean bool) throws IOException {
printer.write(0x1B);
printer.write("E".getBytes());
printer.write((int)(bool?1:0));printer.flush();
}
/**
* Sets white on black printing
* */
public void setInverse(Boolean bool) throws IOException {
bool=false;
printer.write(0x1D);
printer.write("B".getBytes());
printer.write( (int)(bool?1:0) );printer.flush();
}
public void resetToDefault() throws IOException {
setInverse(false);
setBold(false);
setUnderline(0);
setJustification(0);printer.flush();
}
/**
* Sets underline and weight
*
* @param val
* 0 = no underline.
* 1 = single weight underline.
* 2 = double weight underline.
* */
public void setUnderline(int val) throws IOException {
printer.write(0x1B);
printer.write("-".getBytes());
printer.write(val);printer.flush();
}
/**
* Sets left, center, right justification
*
* @param val
* 0 = left justify.
* 1 = center justify.
* 2 = right justify.
* */
public void setJustification(int val) throws IOException {
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(val);
printer.flush();
}
public void setLeftRight(String left,String right) throws IOException {
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(0);
printString(left);
printer.write(0x1B);
printer.write("a".getBytes());
printer.write(2);
printString(right);
printer.flush();
}
public void printBarcode(String code, int type, int h, int w, int font, int pos) throws IOException {
//need to test for errors in length of code
//also control for input type=0-6
//GS H = HRI position
printer.write(0x1D);
printer.write("H".getBytes());
printer.write(pos); //0=no print, 1=above, 2=below, 3=above & below
//GS f = set barcode characters
printer.write(0x1D);
printer.write("f".getBytes());
printer.write(font);
//GS h = sets barcode height
printer.write(0x1D);
printer.write("h".getBytes());
printer.write(h);
//GS w = sets barcode width
printer.write(0x1D);
printer.write("w".getBytes());
printer.write(w);//module = 1-6
//GS k
printer.write(0x1D); //GS
printer.write("k".getBytes()); //k
printer.write(type);//m = barcode type 0-6
printer.write(code.length()); //length of encoded string
printer.write(code.getBytes());//d1-dk
printer.write(0);//print barcode
printer.flush();
}
public void beep() throws IOException {
printer.write(0x1B);
printer.write("(A".getBytes());
printer.write(4);
printer.write(0);
printer.write(48);
printer.write(55);
printer.write(3);
printer.write(15);printer.flush();
}
public void setLineSpacing(int spacing) throws IOException {
//function ESC 3
printer.write(0x1B);
printer.write("3".getBytes());
printer.write(spacing);
}
public void cut() throws IOException {
printer.write(0x1D);
printer.write("V".getBytes());
printer.write(48);
printer.write(0);printer.flush();
}
}
使用上面的方法可以写ESC/POS命令直接输出流