打印机属性
在进行NFC打印时我们先要了解打印机的属性,本文中打印机以EXP342为标准进行编写集成技术文档。EXP342的部分设置请参考该产品的使用说明书。我们在进行Android集成开发时需要注意打印机的黑标感应点的位置,确定打印纸张黑标是否完全覆盖打印机黑标感应点,如果未完全覆盖将会导致打印纸不能走到你预期想要的位置。标准纸张左黑标长度2.2cm,右边黑标长1.6cm,如果黑标未能达到该标准,系统默然将走纸长度为31.25cm处。
程序接入
在项目Project build.gradle添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在项目app build.gradle添加
dependencies {
implementation 'com.github.ccc920123:NfcLibrary:v1.0'
}
如果添加依赖部成功请直接到github上下载依赖包
https://github.com/ccc920123/NFCLib.git
步骤一:过滤标签,我们都知道每个NFC都有标签,当设备靠近标签时设备会前去解析标签,这里我们将过滤标签,再程序中只解析打印机标签,如果想要系统再靠近标签时不弹出系统空标签,在实际开发种我们将以下代码写在BaseActivity中,让其他Activity继承该该BaseActivity。
nfcPrinter = new NfcPrinter(this);
boolean result = nfcPrinter.check_loacl_NFC_device();//判断是否支持Nfc
if (!result)
return;
nfcPrinter.setNfcForeground();
步骤二:再Activity 的onResume与onPause,启动与暂停读取打印机标签。
@Override
public void onResume() {
super.onResume();
if (nfcPrinter != null) {
nfcPrinter.regist();
}
}
@Override
public void onPause() {
super.onPause();
if (nfcPrinter != null) {
nfcPrinter.disableForegroundDispatch();
}
}
步骤三:组装数据,所有的数据都是通过Esc工具类封装,在Esc
中主要有以下重要的方法:
Esc esc = new Esc(2048);
esc.reset();//复位ESC指令
esc.feedRightMark();//走纸到右黑标
esc.feedLeftMark()//走纸到左黑标
esc.feedDots(int dots)// 走纸n点,每个点0.125mm,有点相当于空格
esc. feedLines(final int nLines)// 走纸n行,相当于换行符
esc.setAlign(EscDefine.ALIGN.CENTER);// 居中对齐,EscDefine.ALIGN支持LEFT,CENTER,RIFHT,三种对齐方式。
esc.setTextSize(EscDefine.BAR_TEXT_SIZE.ASCII_12x24);//设置字体大小,在该工具中封装了2种字体大小分别是ASCII_12x24,ASCII_8x16
esc.text(String text);// 添加文本
esc.mouldDefine(EscDefine.MOULD_ID id, final byte []data, final int dataLen)//设置模板
esc.mouldRun(EscDefine.MOULD_ID.m0, 1);//运行模板
esc.getESCData()//得到装的esc数据
步骤四:将封装的数据发送给打印机
byte[] data = esc.getESCData();//获取需要发送的数据
this.nfcPrinter.startPrintTask(data, 1000 * 30);//开启线程发送数据
步骤五:
通过Handler来接受打印机反馈的结果。
public static Handler UImHandler;
@Override
protected void onStart() {
super.onStart();
//接受返回的数据
UImHandler = new Handler() {
@Override
public void handleMessage(Message msg) { //接收工作线程返回的消息
Bundle bundle = msg.getData();
byte[] data = bundle.getByteArray(KEY_DATA);
String str = new String(data);
Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
super.handleMessage(msg);
}
};
}
其他打印设备接入请修改Esc 类中的指令代码,例如:
/**
* 复位ESC指令
* @return
*/
public boolean reset()
{
final byte[] cmd = {0x1B, 0x40};
return add(cmd);
}
其中我们看见到的
0x1B, 0x40
这两个进制码表示打印机的复位,你只需根据其他打印机提供的进制码进行修改 。详情参考 例子