开发环境
- Android studio 3.5.1
- gradle版本3.5.1
- android 编译版本 28
- jdk1.8
- win7
开发准备
- 对android 串口通信有一定了解
- 对ESC/POS指令有一定了解
串口
- 下载google的串口demo https://code.google.com/archive/p/android-serialport-api/source/default/source
- 集成演示
将google串口demo中的SO库到就jniLibs下,同时将串口工具类放到自己的项目中,注意包名一致,也可以自己改;需要配置ndk相关。
做完以上步骤还需要编写一个串口工具类方便调用,提供一个示例供参考,根据实际需求而修改即可
public class SerialManager {
private final static String TAG="SerialManager";
public static final String PATH="/dev/ttyS2";
public static final int BAUTRATE=115200;
protected OutputStream mOutputStream;
private InputStream mInputStream;
protected SerialPortTool serialPortTool;
protected SerialPort mSerialPort;
private ReadThread mReadThread;
private boolean isStop=false;
private OnDataReceiveListener onDataReceiveListener=null;
private enum Singleton {
INSTANCE;
private final SerialManager client;
Singleton() {
client = new SerialManager();
}
private SerialManager getInstance() {
return client;
}
}
public static SerialManager getClient() {
return Singleton.INSTANCE.getInstance();
}
public interface OnDataReceiveListener {
public void onDataReceive(byte[] buffer, int size);
}
public void setOnDataReceiveListener(OnDataReceiveListener dataReceiveListener) {
onDataReceiveListener=dataReceiveListener;
}
/**
* Name:open Function:open printer
*
* @return true:sucessful;false:failed
*/
public boolean open() {
boolean bRet=true;
if (serialPortTool == null)
serialPortTool=new SerialPortTool ();
try {
mSerialPort=serialPortTool.getSerialPort (PATH, BAUTRATE);
mOutputStream=mSerialPort.getOutputStream ();
mInputStream=mSerialPort.getInputStream ();
mReadThread=new ReadThread ();
isStop=false;
mReadThread.start ();
bRet=true;
} catch (SecurityException e) {
} catch (IOException e) {
} catch (InvalidParameterException e) {
} catch (Exception e) {
}
return bRet;
}
/**
* Name:close; Function:close printer
*/
public void close() {
isStop=true;
if (mReadThread != null) {
mReadThread.interrupt ();
}
if (serialPortTool != null)
serialPortTool.closeSerialPort ();
mSerialPort=null;
}
public static String Bytes2HexString(byte[] b) {
String ret="";
for (int i=0; i < b.length; ++i) {
String hex=Integer.toHexString (b[i] & 255);
if (hex.length () == 1) {
hex='0' + hex;
}
ret=ret + " " + hex.toUpperCase ();
}
return ret;
}
/**
* Name:escCommand
* Function:send ESC command
*
* @param cmd
* @return
*/
public boolean escCommand(String cmd) {
if (cmd == null || cmd.length () == 0)
return false;
byte[] buffer=cmd.getBytes ();
return escCommand (buffer);
}
public boolean escCommand(byte[] cmd) {
Log.e (TAG, "escCommand: "+Bytes2HexString (cmd));
boolean bRet=true;
try {
if (cmd != null && cmd.length > 0) {
mOutputStream.write (cmd);
}
} catch (Exception ex) {
bRet=false;
}
return bRet;
}
public boolean escCommand(byte[] cmd, int count) {
boolean bRet=true;
try {
if (cmd != null && cmd.length > 0) {
mOutputStream.write (cmd, 0, count);
}
} catch (Exception ex) {
bRet=false;
Log.e ("escCommand", ex.getLocalizedMessage ());
}
return bRet;
}
public InputStream getInputStream(){
return mInputStream;
}
public OutputStream getOutputStream(){
return mOutputStream;
}
private class ReadThread extends Thread {
@Override
public void run() {
super.run ();
while (!isStop && !isInterrupted ()) {
int size;
try {
if (mInputStream == null)
return;
int ret=mInputStream.available ();
Thread.sleep (15);
byte[] buffer=new byte[ret];
if (ret > 0) {
size=mInputStream.read (buffer);
if (null != onDataReceiveListener) {
onDataReceiveListener.onDataReceive (buffer, size);
}
}
Thread.sleep (15);
} catch (Exception e) {
e.printStackTrace ();
return;
}
}
}
}
}
ESC/POS指令
我们需要打印一个带二维码的小票,