安卓蓝牙打印
2018-09-13 本文已影响0人
键盘小蟲
最近公司特卖会在国际博览中心开展,由于场地没有网络只能采用PDA收银,连接蓝牙打印机打印小票。PDA使用的安卓系统,连接打印机有两种方式:
手持POS和打印机都是采购的斑马设备
PDA 使用的是TC25
打印机使用的是EZ320
-
IP地址方式
-
蓝牙Mac地址
由于本次只接触了蓝牙连接方式,所以这里只记录一下蓝牙打印实现的过程。
首先获取已配对的蓝牙设备
获取所有已配对的蓝牙设备,从中找到打印设备,并获取Mac地址。关键代码如下:
private static String findPrinterMac()throws Exception {
BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();
if (defaultAdapter ==null){
throw new Exception("本机不支持蓝牙功能");
}
if(!defaultAdapter.isEnabled()){
throw new Exception("请检查蓝牙功能是否打开");
}
Set bondedDevices = defaultAdapter.getBondedDevices();
for (BluetoothDevice bond:bondedDevices) {
// 如果设置是打印机设备
if (bond.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.IMAGING){
// 返回设备的Mac地址
return bond.getAddress();
}
}
return null;
}
根据mac地址连接打印机
拿到mac地址就好办,调用斑马的sdk提供的连接方式,连接到打印机。
/**
* 连接打印机
* @return
*/
private static ZebraPrinter connect()throws Exception {
String macAddress =findPrinterMac();
if (macAddress ==null){
throw new Exception("未找到蓝牙打印机");
}
printerConnection =null;
printerConnection =new BluetoothConnection(macAddress);
try {
printerConnection.open();
}catch (ConnectionException e) {
disconnect();
System.out.println(e.getMessage());
throw new Exception("打印机连接失败");
}
ZebraPrinter printer =null;
if (printerConnection.isConnected()) {
try {
printer = ZebraPrinterFactory.getInstance(printerConnection);
}catch (ConnectionException e) {
printer =null;
System.out.println("打印机连接失败:"+e.getMessage());
disconnect();
throw e;
}catch (ZebraPrinterLanguageUnknownException e) {
printer =null;
System.out.println("获取打印机语言失败:"+e.getMessage());
disconnect();
throw e;
}
}
return printer;
}
打印
连接连接成功后就可以调起打印功能了,首先要看打印机支持的语言。打印机指令语言分为两种,ZPL和CPCL。这两种语言的中文文档非常少,有空了我把整理的中文文档一起发出来。EZ320默认使用的是CPCL语言,编写起来比ZPL稍微简单一点。
! U1 JOURNAL 打印开始
! U1 PAGE-WIDTH 600 设置页面宽度
! U1 SPEED 2 设置打印速度
! U1 ENCODING UTF-8 设置编码格式
! U1 LMARGIN 0 设置偏移量(距离左边)
! U1 SETLP GBUNSG24.CPF 0 24 设置字库(有些字库需要购买)
! U1 PCX 0 0 !<LOGO.PCX 打印图片(我们公司的logo)
! U1 SETBOLD 1 设置粗体
! U1 B 128 1 1 50 0 0 123456 打印条形码
PRINT 不要忘记
以上是行模式打印的指令,比定位模式简单多了。最后发一张实际打印的效果图。
小票