Android ZPL SDK 说明文档

#### 1 SDK 加载及使用

##### 1.1 加载

- 将sdk里面的jar包和aar包拷贝到app/libs文件夹下

- 在app中的build.gradle加入下面的代码

  ```java
  android{
    sourceSets {
          main {
              jniLibs.srcDirs = ['libs']
          }
      }
  	packagingOptions {
          pickFirst 'lib/x86/libc++_shared.so'
          pickFirst 'lib/x86_64/libc++_shared.so'
          pickFirst 'lib/armeabi-v7a/libc++_shared.so'
          pickFirst 'lib/arm64-v8a/libc++_shared.so'
      }
  }
  implementation fileTree(dir: "libs", include: ["*.jar","*.aar"])
  implementation 'com.github.barteksc:pdfium-android:1.9.0'//SDK需要的依赖库
  implementation 'com.blankj:utilcode:1.30.7'//SDK需要的依赖库
  ```



##### 1.2 使用

- 我们所用的接口都在ZPLPrinterHelper这个类中。

  ```java
  ZPLPrinterHelper mZPL = ZPLPrinterHelper.getZPL(mContext)
  mContext：上下文对象。  
  ```

- **初始化WiFi超时时间（推荐）**

  在获取ZPLPrinterHelper实例后，建议立即从本地设置中加载WiFi连接超时时间：

  ```java
  ZPLPrinterHelper zplPrinterHelper = ZPLPrinterHelper.getZPL(this);
  // 从SharedPreferences等本地存储中获取保存的超时时间，默认5000ms
  int savedTimeout = SPStaticUtils.getInt("wifi_timeout", 5000);
  zplPrinterHelper.setWifiConnectTimeOut(savedTimeout);
  ```

  **说明：**
  - WiFi连接超时时间默认为5000毫秒
  - 建议在应用启动时从本地存储中读取用户设置的超时时间
  - 最小超时时间为1000毫秒
  - 超时时间在WiFi连接时生效，影响连接等待时长

  

#### 2 SDK 连接接口

##### 2.1 蓝牙连接接口	

- 描述

  ```java
  int PortOpen(String portSetting)
  ```

- 参数

  ```java
  portSetting：”Bluetooth,”+MAC。（MAC：蓝牙地址）
  ```

- 返回

  ```java
  0：连接成功，-1：连接失败。
  ```

  

##### 2.2 WIFI连接接口	

- 描述

  ```java
  int PortOpen(String portSetting)
  ```

- 参数

  ```java
  portSetting：“WiFi,”+IP+”,”+PortNumber
  IP：打印机的IP地址。
  PortNumber：端口。 默认：9100  
  ```

- 返回

  ```java
  0：连接成功，-1：连接失败。
  ```

  

##### 2.3 USB连接接口	

- 描述

  ```java
  int PortOpen(UsbDevice usbdevice)
  ```

- 参数

  ```java
  usbdevice：UsbDevice的对象 
  ```

- 返回

  ```java
  0：连接成功，-1：连接失败。
  ```

  

##### 2.4 断开连接接口	

- 描述

  ```java
  boolean PorClose()
  ```

- 参数

  ```java
  无
  ```

- 返回

  ```java
  true：断开成功，false：断开失败。
  ```

  

#### 3 SDK 打印接口

##### 3.1 标签开始

- 描述

  ```java
  int start()
  ```

- 参数

  ```java
  无
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printText(“0”,”0”,5,”N”,3,”TEXT”);
  mZPL.end();
  ```

  

##### 3.2 设置坐标

- 描述

  ```java
  int setXY(String x,String y)
  ```

- 参数

  ```java
  X：横坐标。
  Y：纵坐标。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

  

##### 3.3 标签结束

- 描述

  ```java
  int end()
  ```

- 参数

  ```java
  无
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printText(“0”,”0”,5,”N”,3,”TEXT”);
  mZPL.end();
  ```

  

##### 3.4 字段开头指令

- 描述

  ```java
  int FD(String fd)
  ```

- 参数

  ```java
  fd：文本。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.setXY(“0”,”0”);
  mZPL.FD(“TEXT”);
  mZPL.FS();
  mZPL.end();
  ```

  

##### 3.5 字段结束指令

- 描述

  ```java
  int FS()
  ```

- 参数

  ```java
  无
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.setXY(“0”,”0”);
  mZPL.FD(“TEXT”);
  mZPL.FS();
  mZPL.end();
  ```

  

##### 3.6 打印宽度

- 描述

  ```java
  int PW(String pw)
  ```

- 参数

  ```java
  pw：宽度（单位：dots）
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.PW(“100”)
  mZPL.setXY(“0”,”0”);
  mZPL.FD(“TEXT”);
  mZPL.FS();
  mZPL.end();
  ```

  

##### 3.7 打印方向和对齐方式

- 描述

  ```java
  int FW(String rotate,String justification)
  ```

- 参数

  ```
  rotate：打印方向，取值如下：
  	N = normal
  	R = rotated 90 degrees
  	I = inverted 180 degrees
  	B = bottom-up 270 degrees, read from bottom up
  Justification：对其方式，取值如下：
  	0 = left justification
  	1 = right justification
  	2 = auto justification (script dependent)
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.FW(“N”,”0”)
  mZPL.setXY(“0”,”0”);
  mZPL.FD(“TEXT”);
  mZPL.FS();
  mZPL.end();
  ```

  

##### 3.8 打印直线

- 描述

  ```java
  int printLine(String w,String h,String t,String c,String r)
  ```

- 参数

  ```
  w：直线的宽度。（1~32000单位 点）
  H：直线的高度。（1~32000单位 点）
  T：线条的宽度。（1~32000单位 点）
  C：线条的颜色：
  	B=black；（默认：B）
  	W=white；
  R：圆角的弧度（0~8）
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.setXY(“0”,”0”);
  mZPL.printLine(“100”,”2”,”2”,”B”,”0”)//打印100点宽，2点高的横线
  mZPL.end();
  ```

  

##### 3.9 打印圆

- 描述

  ```java
  int printCircle(String d,String t,String c)
  ```

- 参数

  ```
  d：圆的直径（3~4095）。
  t：边框厚度（1~4095）。
  C：线条颜色：
  	B=black；（默认：B）
  	W=white；
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.setXY(“0”,”0”);
  mZPL.printCircle(“100”,”2”,”B”)
  mZPL.end();
  ```

  

##### 3.10 打印斜线

- 描述

  ```java
  int printSlashLine(String w,String h,String t,String c,String o)
  ```

- 参数

  ```
  w：斜线的宽度（3~32000）。
  H：斜线的高度（3~32000）。
  T：线条宽度（1~32000）。
  C：线条颜色：（默认：B）
  	B=black；
  	W=white；
  O：斜线的方向：（默认：R）
  	R (or /) = right-leaning diagonal
  	L (or \) = left-leaning diagonal
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.setXY(“0”,”0”);
  mZPL.printSlashLine(“100”,”100”,”2”,”B”,”R”)
  mZPL.end();
  ```

  

##### 3.11 设置标签原点位置

- 描述

  ```java
  int LH(String x,String y)
  ```

- 参数

  ```
  X：原点的横坐标。
  Y：原点的纵坐标。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

  

##### 3.12 设置左偏移量

- 描述

  ```java
  int LS(String ls)
  ```

- 参数

  ```
  ls：偏移量（-9999~9999）负数代表向右偏移，（默认0）。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.LS(“20”)
  mZPL.printText(“100”,”100”,5,”N”,3,”TEXT”);
  mZPL.end();
  ```

  

##### 3.13 设置文本框（可自动换行）

- 描述

  ```java
  int TB(String a,String b,String c)
  ```

- 参数

  ```
  a：文字方向：
  	N = normal
  	R = rotate 90 degrees clockwise
  	I = invert 180 degrees
  	B = read from bottom up-270 degrees
  b：文本框的宽度。
  c：文本框的高度。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.TB(“N”,”300”,”300”)
  mZPL.printText(“100”,”100”,5,”N”,3,”TEXT”);
  mZPL.end();
  ```

  

##### 3.14 打印二维码

- 描述

  ```java
  int printQRcode(String x,String y,String orientation,
                  String magnification,String size,String data)
  ```

- 参数

  ```
  x：横坐标。
  y：纵坐标。
  orientation：方向（N）。
  magnification：模式：默认（2）
  	1=普通模式。
  	2=加强模式。
  size ：尺寸（1~10）。
  data:二维码的内容
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printData("^CI14\r\n");//如果二维码内容有中文，请调用这个代码。
  mZPL.printQRcode(“10”,”10”,”N”,”2”,”5”,”abc123”);
  mZPL.end();
  ```

  

##### 3.15 打印条码

- 描述

  ```java
  int printBarcode(String x,String y,int type,String ratio,
                   String orientation,String height,String f,String data)
  ```

- 参数

  ```
  x：横坐标。
  y：纵坐标。
  Type：条码类型：
  	0=39
  	1=EAN-8
  	2=UPC-E
  	3=93
  	4=128
  	5=EAN-13
  ratio：宽窄条码比例（1-3）。	
  orientation：方向：
  	N = normal
  	R = rotated 90 degrees (clockwise)
  	I = inverted 180 degrees
  	B = read from bottom up, 270 degrees
  Height：条码高度（1-32000）。
  F：条码内容是否见（默认Y）：
  	Y = yes
  	N = no
  data:条码内容。	
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printBarcode(“10”,”10”,”0”,"2",”N”,”100”,”Y”,”123456789”);
  mZPL.end();
  ```

  

##### 3.16 打印图片

- 描述

  ```java
  void printBitmap(String x, String y, int halftoneType, Bitmap bmp)
  ```

- 参数

  ```
  x：起始的X坐标。
  y：起始的Y坐标。
  halftoneType：图片算法
  	0：二值（黑白）
  	1：抖动
  bmp：图片对象。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printBitmap(“10”,”10”,0,bitmap);
  mZPL.end();
  ```

  

##### 3.17 发数据函数

- 描述

  ```java
  int WriteData(byte[] bData)
  ```

- 参数

  ```
  bData：需要发给打印机的数据。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.WriteData(byt)
  ```

  

##### 3.18 读数据函数

- 描述

  ```java
  byte[] ReadData(int outTime)
  ```

- 参数

  ```
  outTime：超时时间（单位秒）。
  ```

- 返回

  ```java
  读取到的数据。
  ```

- 例子

  ```java
  mZPL.ReadData(2)
  ```

  

##### 3.19 打印自检页

- 描述

  ```java
  int selfTest()
  ```

- 参数

  ```
  无
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.selfTest()
  ```

  

##### 3.20 打印文本

- 描述：打印中文时需要选择编码，请参照例子。

  ```java
  int printText(String x,String y,int type,String orientation,int size,String data)
  ```

- 参数

  ```
  x：横坐标。
  y：纵坐标。
  type：字体（0~6：中文无效，7：中文）。
  orientation：方向。
  	N = normal
  	R = rotate 90 degrees clockwise
  	I = invert 180 degrees
  	B = read from bottom up-270 degrees
  size：字体大小。
  	1：10px。
  	2：20px。
  	3：30px。
  	4：40px。
  	5：50px。
  	6：60px。
  data：文本数据。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printData("^CI14\r\n")//打印中文时需要加入这句
  mZPL.printText(“0”,”0”,5,”N”,3,”TEXT”);
  mZPL.end();
  ```

  

##### 3.21 打印数量和切刀

- 描述：

  ```java
  int PQ(String q,String p,String r,String o)
  ```

- 参数

  ```
  q：打印数量。
  p：暂停前或者切刀前数量。
  r：每个序列号的副本数。
  o：切刀或者暂停。
  	Y：切刀。
  	N：暂停。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printData("^CI14\r\n")//打印中文时需要加入这句
  mZPL.printText(“0”,”0”,5,”N”,3,”TEXT”);
  mZPL.PQ(1,1,1,Y);//打印一张后切刀
  mZPL.end();
  ```

  

##### 3.22 打印模式

- 描述：

  ```java
  int setPrinterModel(String model)
  ```

- 参数

  ```
  model：
  	T = 撕扯。 
  	P = 剥离（部分机器上不可用）。
  ```

- 返回

  ```java
  大于0：正常，否则异常。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.printData("^CI14\r\n")//打印中文时需要加入这句
  mZPL.printText(“0”,”0”,5,”N”,3,”TEXT”);
  mZPL.setPrinterModel(“P”);//切换成剥离模式
  mZPL.end();
  ```

  

##### 3.23 写入RFID

- 描述：

  ```java
  int writeRFID(int address, int memory,byte[] data)
  ```

- 参数

  ```
  address：起始地址。
  	范围：大于0。(EPC区地址必须从2开始)
  memory：写入区域。 
  	0 = 保留区
  	1 = EPC区 
  	3 = User区
  data：需写入的数据。（保留区，EPC不超过12个字节，User不超过128）
  ```

- 返回

  ```java
  -1：发送失败，-2：参数错误，0：写入成功。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.writeRFID(0,1,"Test RFID".getBytes());
  mZPL.end();
  ```

  

##### 3.24 读取RFID

- 描述：

  ```java
  byte[] readRFID(int address,int length,int memory)
  ```

- 参数

  ```
  address：起始地址。
  	范围：大于0。(EPC区地址必须从2开始)
  length：读取的长度。（保留区，EPC不超过12个字节，User不超过128）
  memory：写入区域。 
  	0 = 保留区
  	1 = EPC区 
  	3 = User区
  ```

- 返回

  ```java
  读取到的数据，空表示读取失败。
  ```

- 例子

  ```java
  mZPL.start();
  mZPL.writeRFID(2,1,"中文".getBytes("GB2312"));
  mZPL.readRFID(2, 4, 1);
  mZPL.end();
  byte[] bytes = mZPL.ReadData(3);
  if (bytes!=null&&bytes.length>0){
    String hexStr = new String(bytes);
    byte[] hexByte = UtilityTooth.hexToByte(hexStr);
  	Toast.makeText(thisCon,newString(hexByte,"GB2312"),Toast.LENGTH_SHORT).show();
  }
  ```

  

##### 3.25 读取SN

- 描述：

  ```java
  String getPrinterSN()
  ```

- 参数

  ```
  无
  ```

- 返回

  ```java
  SERIAL NEMBER:SN号。
  ```

- 例子

  ```java
  mZPL.getPrinterSN();
  ```

  

##### 3.26 PDF转Bitmap

- 描述：

  ```java
  List<Bitmap> pdfToBitmap(Context context, File file, String pageNumber, int pageWidth)
  ```

- 参数

  ```
  context：上下文对象。
  file：PDF文件。
  pageNumber：需要转换的页数（"1,3-7"）。
  pageWidth：转换后bitmap的宽度。
  ```

- 返回

  ```java
  List<Bitmap>：转换后的bitmap。
  ```

- 例子

  ```java
  List<Bitmap> bitmaps = mZPL.pdfToBitmap(thisCon, file, "1", 576);
  ```

  

##### 3.27 打印高度

- 描述

	```java
	int setPrintHeight(String height)
	```

- 参数

	```java
	height：高度（单位：dots）
	```

- 返回

	```java
	大于0：正常，否则异常。
	```

- 例子

	```java
	mZPL.start();
	mZPL.setPrintHeight(“100”)
	mZPL.setXY(“0”,”0”);
	mZPL.FD(“TEXT”);
	mZPL.FS();
	mZPL.end();
	```




##### 3.28 监听打印状态

- 描述

	```java
	void setPrintListener(PrintListener listener)
	```

- 参数

	```java
	interface PrintListener {
	    fun onPrintStatus(phase: Phase)
	
	}
	data class Phase(
	    val taskID: String, //任务ID
	    val type: Type?, //打印阶段
	    val reasonList: List<Reason>, //打印错误原因
	    val numIndex: Int, //当前打印任务在多页打印任务中的序号
	    val numTotal: Int, //多页打印任务页数
	    val copyIndex: Int, //复印任务序号
	    val copyTotal: Int//复印任务总数
	)
	data class Type(
	    val code: Int, //查看4.1
	    val description: String//描述
	)
	data class Reason(
	    val code: Int, //查看4.2
	    val description: String//描述
	)
	```

- 返回

	```java
	无
	```

- 例子

	```java
	mZPL.setPrintListener(phase -> {
	            ToastUtils.showToast(thisCon, phase.toString());
	        });
	```




##### 3.29 获取打印机wifi信息

- 描述

	```java
	public PrinterWifiConfig getPrinterWifiConfig()
	```

- 参数

	```java
	无
	```

- 返回

	```java
	public class PrinterWifiConfig {
	    private int model;//0：关闭，1：AP，2：STA
	    private ApWifiConfig apWifiConfig;//AP的参数
	    private StaWifiConfig staWifiConfig;//STA的参数
	}
	public class ApWifiConfig {
	    private boolean dhcpEnabled;//是否启用DHCP配置IP
	    private String ipAddress;//IP地址
	    private String ssid;//wifi名称
	    private String password;//wifi 密码
	    private boolean isOpen;//是否需要密码（true：无需密码,false：需要密码）
	}
	public class StaWifiConfig {
	    private boolean dhcpEnabled;//是否启用DHCP配置IP
	    private String encryptionType;//加密方式（"OPEN","WEP","WPA2-PSK",
	  //"WPA/WPA2-PSK","WPA-PSK","WPA","WPA2","SAE","WPA3-WPA2-PSK-MIX","UNKNOW"）
	    private String ssid;//wifi名称
	    private String password;//wifi 密码
	    private String ipAddress;//IP地址
	    private String gateway;//网关
	    private String netmask;//子网掩码
	}
	```

- 例子

	```java
	PrinterWifiConfig printerWifiConfig = zplPrinterHelper.getPrinterWifiConfig();
	```




##### 3.30 配置ap模式下的wifi参数

- 描述

	```java
	public boolean configApWifi(ApWifiConfig apWifiConfig)
	```

- 参数

	```java
	public class ApWifiConfig {
	    private boolean dhcpEnabled;//是否启用DHCP配置IP
	    private String ipAddress;//IP地址
	    private String ssid;//wifi名称
	    private String password;//wifi 密码
	    private boolean isOpen;//是否需要密码（true：无需密码,false：需要密码）
	}
	```

- 返回

	```java
	true：发送成功，false：发送失败。
	```

- 例子

	```java
	ApWifiConfig apWifiConfig = new ApWifiConfig();
	apWifiConfig.setSsid(ssid);
	boolean apPasswordCheck = apNeedPasswordCheckBox.isChecked();
	String apPassword = "";
	if (apPasswordCheck){
			apPassword = apPasswordEditText.getText().toString();
			apWifiConfig.setPassword(apPassword);
	}
	boolean apDhcpCheckBoxChecked = apDhcpCheckBox.isChecked();
	apWifiConfig.setDhcpEnabled(apDhcpCheckBoxChecked);
	String apIp = "";
	if (!apDhcpCheckBoxChecked){
			apIp = apIpEditText.getText().toString();
			apWifiConfig.setIpAddress(apIp);
	}
	zplPrinterHelper.configApWifi(apWifiConfig);
	```



##### 3.31 配置sta模式下的wifi参数

- 描述

	```java
	public boolean configStaWifi(StaWifiConfig staWifiConfig)
	```

- 参数

	```java
	public class StaWifiConfig {
	    private boolean dhcpEnabled;//是否启用DHCP配置IP
	    private String encryptionType;//加密方式（"OPEN","WEP","WPA2-PSK",
	  //"WPA/WPA2-PSK","WPA-PSK","WPA","WPA2","SAE","WPA3-WPA2-PSK-MIX","UNKNOW"）
	    private String ssid;//wifi名称
	    private String password;//wifi 密码
	    private String ipAddress;//IP地址
	    private String gateway;//网关
	    private String netmask;//子网掩码
	}
	```

- 返回

	```java
	true：发送成功，false：发送失败。
	```

- 例子

	```java
	StaWifiConfig staWifiConfig = new StaWifiConfig();
	staWifiConfig.setSsid(ssid);
	String encryption = (String)encryptionSpinner.getSelectedItem();
	staWifiConfig.setEncryptionType(encryption);
	String staPassword = staPasswordEditText.getText().toString();
	staWifiConfig.setPassword(staPassword);
	boolean staDhcpChecked = staDhcpCheckBox.isChecked();
	staWifiConfig.setDhcpEnabled(staDhcpChecked);
	if (!staDhcpChecked){
			String staIp = staIpEditText.getText().toString();
			staWifiConfig.setIpAddress(staIp);
			String staGateway = staGatewayEditText.getText().toString();
			staWifiConfig.setGateway(staGateway);
			String staNetmask = staNetmaskEditText.getText().toString();
			staWifiConfig.setNetmask(staNetmask);
	}
	zplPrinterHelper.configStaWifi(staWifiConfig);
	```



##### 3.32 设置WiFi连接超时

- 描述

	```java
	public void setWifiConnectTimeOut(int wifiConnectTimeOut)
	```

- 参数

	```java
	wifiConnectTimeOut: WiFi连接超时时间，单位为毫秒（最小1000ms，默认5000ms）
	```

- 返回

	```java
	无
	```

- 例子

	```java
	// 设置WiFi连接超时为8000毫秒
	zplPrinterHelper.setWifiConnectTimeOut(8000);
	```



##### 3.33 获取WiFi连接超时时间

- 描述

	```java
	public int getWifiConnectTimeOut()
	```

- 参数

	```java
	无
	```

- 返回

	```java
	int: 当前WiFi连接超时时间，单位为毫秒
	```

- 例子

	```java
	// 获取当前WiFi连接超时时间
	int currentTimeout = zplPrinterHelper.getWifiConnectTimeOut();
	Log.d("WiFiTimeout", "当前超时时间：" + currentTimeout + "毫秒");
	```



##### 3.34 获取固件版本

- 描述

	```java
	public void getFirmwareVersion(FirmwareVersionListener listener)
	```

- 参数

	```java
	public interface FirmwareVersionListener {
	    void onFirmwareVersion(String firmwareVersion, String betaVersion);
	}
	```

- 返回

	```java
	无
	```

- 例子

	```java
	zplPrinterHelper.getFirmwareVersion((version, betaVersion) -> {
	    runOnUiThread(() -> {
	        AlertDialog.Builder builder = new AlertDialog.Builder(Activity_Main.this);
	        builder.setTitle(getString(R.string.firmware_version_info));
	        builder.setMessage("主版本: " + version + "\nBeta版本: " + betaVersion);
	        builder.setPositiveButton(getString(R.string.sure), null);
	        builder.show();
	    });
	});
	```



##### 3.35 获取打印机状态

- 描述

	```java
	public void getPrinterStatus(ZPLPrinterStatusListener listener)
	```

- 参数

	```java
	public interface ZPLPrinterStatusListener {
	    void onStatus(int status);
	  	//status:(0:正常，1：开盖，2：缺纸，3：过热，4：打印中，5：缺碳带)
	}
	```

- 返回

	```java
	无
	```

- 例子

	```java
	zplPrinterHelper.getPrinterStatus(status -> {
	                switch (status) {
	                    case ZPLPrinterHelper.STATUS_OK:
	                        mStatusStr = getString(R.string.status_ok);
	                        break;
	                    case ZPLPrinterHelper.STATUS_COVER_OPENED:
	                        mStatusStr = getString(R.string.status_cover_opened);
	                        break;
	                    case ZPLPrinterHelper.STATUS_NOPAPER:
	                        mStatusStr = getString(R.string.status_nopaper);
	                        break;
	                    case ZPLPrinterHelper.STATUS_OVER_HEATING:
	                        mStatusStr = getString(R.string.status_over_heating);
	                        break;
	                    case ZPLPrinterHelper.STATUS_PRINTING:
	                        mStatusStr = getString(R.string.status_printing);
	                        break;
	                    case ZPLPrinterHelper.STATUS_NORIBBONS:
	                        mStatusStr = getString(R.string.status_noribbons);
	                        break;
	                    default:
	                        break;
	                }
	                runOnUiThread(() -> Toast.makeText(thisCon, mStatusStr, Toast.LENGTH_SHORT).show());
	            });
	```



##### 3.36 防漏打功能

- 描述（1）

	该功能可以用于防止打印机漏打，然后设置任务ID，发送打印数据，最后获取打印结果。（通用接口）

	```java
	//开启防漏打功能
	public boolean setMissedHitsSwitch(boolean isOpen)
	```

	```java
	//设置打印ID（1-9999）（开头和结尾都需要设置，id还要依次递增）
	public boolean setMissedHitsID(int id)
	```

	```java
	//监听打印结果
	public void setMissedHitsTaskListener(MissedHitsTaskListener listener)
	```

- 参数

	```java
	public interface MissedHitsTaskListener {
	    void onResult(int id, int result);
	}
	//id:任务ID，result:任务结果（按位取数据）
	if (result == 0){
	    resultStr = getString(R.string.print_normal);//打印成功
	}else{
	    if ((result & 2) == 2) {
	         resultStr += getString(R.string.status_cover_opened);//开盖
	    } else if ((result & 8) == 8) {
	         resultStr += getString(R.string.status_nopaper);//缺纸
	    } else if ((result & 16) == 16) {
	         resultStr += getString(R.string.status_printing);//打印中
	    } else if ((result & 32) == 32) {
	         resultStr += getString(R.string.status_over_heating);//过热
	    } else if ((result & 64) == 64) {
	         resultStr += getString(R.string.status_form_error);//定位错误
	    }else{
	         resultStr += getString(R.string.status_other_error);//其他错误
	    }
	 }
	```

- 返回

	```java
	无
	```

- 例子

	```java
	zplPrinterHelper.setMissedHitsTaskListener((id, result) -> {
	            String resultStr = "ID:" + id;
	            if (result == 0) {
	                resultStr += getString(R.string.print_normal);
	            } else {
	                if ((result & 2) == 2) {
	                    resultStr += getString(R.string.status_cover_opened);
	                } else if ((result & 8) == 8) {
	                    resultStr += getString(R.string.status_nopaper);
	                } else if ((result & 16) == 16) {
	                    resultStr += getString(R.string.status_printing);
	                } else if ((result & 32) == 32) {
	                    resultStr += getString(R.string.status_over_heating);
	                } else if ((result & 64) == 64) {
	                    resultStr += getString(R.string.status_form_error);
	                }else{
	                    resultStr += getString(R.string.status_form_error);
	                }
	            }
	            String finalResultStr = resultStr;
	            runOnUiThread(() -> Toast.makeText(thisCon, finalResultStr, Toast.LENGTH_SHORT).show());
	        });
	zplPrinterHelper.setMissedHitsSwitch(true);
	zplPrinterHelper.setMissedHitsID(1);
	printSampleReceipt();
	zplPrinterHelper.setMissedHitsID(1);
	```



- 描述（2）

	该功能可以用于防止打印机漏打，然后设置任务ID，发送打印数据，最后获取打印结果。（仅T300Pro支持）

	```java
	//设置打印ID（0-65535）
	public boolean setTaskID(int id)
	```

	```java
	//监听打印结果
	public void setPrintResultListener(PrintResultListener listener)
	```

- 参数

	```java
	public interface PrintResultListener {
	    void onResult(int id, int result);
	}
	//id:任务ID，result:任务结果（按位取数据）
	if (result == 0){
	    resultStr = getString(R.string.print_normal);//打印成功
	}else{
	    if((result & 1) == 1){
	      resultStr = getString(R.string.status_nopaper);//打印失败（缺纸）
	    }else if((result & 2) == 2){
	      resultStr = getString(R.string.status_cover_opened);//打印失败（开盖）
	    }
	 }
	```

- 返回

	```java
	无
	```

- 例子

	```java
	zplPrinterHelper.setPrintResultListener((id, result) -> {
	            String resultStr = "";
	            if (result == 0){
	                resultStr = getString(R.string.print_normal);
	            }else{
	                if((result & 1) == 1){
	                    resultStr = getString(R.string.status_nopaper);
	                }else if((result & 2) == 2){
	                    resultStr = getString(R.string.status_cover_opened);
	                }
	            }
	            String finalResultStr = resultStr;
	            runOnUiThread(() -> Toast.makeText(thisCon, finalResultStr, Toast.LENGTH_SHORT).show());
	        });
	zplPrinterHelper.setTaskID(1);
	printSampleReceipt();
	```



##### 4.1 打印阶段

| key   | value                |
| ----- | -------------------- |
| 01001 | 开始打印             |
| 01002 | 打印完成，携带任务ID |
| 01003 | 打印失败，携带任务ID |
| 01004 | 暂停，携带任务ID     |
| 01010 | 取消打印             |
| 01011 | 异常导致取消打印     |
| 01012 | 按键取消打印         |
| 01013 | app取消打印          |
| 01020 | 打印青色             |
| 01021 | 打印红色             |
| 01022 | 打印黄色             |
| 01023 | 打印黑色             |
| 01024 | 附膜                 |



##### 4.2打印机状态错误码

| 值    | 描述                       |
| ----- | -------------------------- |
| 11001 | 无纸                       |
| 11002 | 搓纸器把纸搓到走纸通道失败 |
| 11003 | 高温                       |
| 11004 | 后盖打开                   |
| 11005 | 预热失败                   |
| 12001 | 卡在出纸那边               |
| 12002 | 卡在打印通道               |
| 12003 | 卡在后端出纸通道           |
| 12004 | 卡在双面打印回转区         |
| 13001 | 非法耗材                   |
| 13002 | 没有硒鼓                   |
| 13003 | 没有碳粉                   |
| 13004 | 未检测到黑色墨盒           |
| 13005 | 未检测到彩色墨盒           |
| 13006 | 黑色墨盒不可用             |
| 13007 | 彩色墨盒不可用             |
| 13008 | 黑色墨盒用尽               |
| 13009 | 彩色墨盒用尽               |
| 14001 | 搓纸设备异常               |
| 14002 | 走纸设备异常               |
| 14003 | 喷墨打印头接触异常         |
| 14004 | 墨车移动异常               |
| 14005 | 墨车人为移动异常           |