一、前言
在上一篇博文 硬件系列(二)-------------wifi打印机之佳博wifi打印机踩坑之路中介绍了佳博wifi打印机的打印,但是这个是要的是sdk进行打印的,如果没有sdk呢?所以,这篇博文就介绍无sdk wifi打印。
二、浅析
wifi打印机,其实本质还是使用网络进行数据的传输,既然是数据传输,那么就涉及到了数据的读写操作了,在硬件系列(一)----------WIFI打印机之使用socket进行打印机搜索介绍到,搜索wifi打印机是使用socket进行搜索的,那么能进行搜索,而且打印是否也能使用socket进行数据打印呢?具体如何,我们接着往下看。
三、使用socket进行打印
/**
* @author Freak
* @date 2019/8/14.
*/
public class SocketPrint {
//定义编码方式
private static String encoding = null;
private String ip;
private Socket sock = null;
private int port;
/**
* 连接超时时间
*/
private final static int SOCKET_RECEIVE_TIME_OUT = 2500;
/**
* 初始化Pos实例
*
* @param ip 打印机IP
* @param port 打印机端口号
* @param encoding 编码
* @throws IOException
*/
public SocketPrint(String ip, int port, String encoding) {
try {
this.ip = ip;
this.port = port;
if (sock != null) {
closeIOAndSocket();
} else {
SocketAddress socketAddress = new InetSocketAddress(ip, port);
sock = new Socket();
sock.connect(socketAddress, SOCKET_RECEIVE_TIME_OUT);
}
if (sock.isConnected()) {
//中文打印要看设置设置的中文格式对应的是哪一个,这个佳博wifi打印机是串口的,编码是GB2312,如果设置不对就会乱码
String time = DateUtil.getTime();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), encoding));
bufferedWriter.write("打印测试");
bufferedWriter.newLine();
bufferedWriter.write("----------------------------");
bufferedWriter.newLine();
bufferedWriter.write("收银员:10001");
bufferedWriter.newLine();
bufferedWriter.write("测试时间:" + time);
bufferedWriter.newLine();
bufferedWriter.write("----------------------------");
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();
sock.close();
LogUtil.e("已打开");
} else {
LogUtil.e("没有打开");
}
} catch (Exception e) {
LogUtil.e(e.toString());
}
}
/**
* 关闭IO流和Socket
*
* @throws IOException
*/
public void closeIOAndSocket() {
try {
sock.close();
} catch (Exception e) {
}
}
}
看了上面的代码,是不是觉得很简单,没错,就是这么简单就能进行打印了,唯一需要注意的地方是,socket打印的时候,打印中文可能会乱码,这个就要看机器的字符编码是什么了,根据需求去设置字符编码就不会乱码。
三、调用方法
socket是耗时操作,不能再主线程中进行,要开启一个线程去打印。
private SocketPrint socketPrint;
ThreadPoolProxyFactory.getNormalThreadPoolProxy().execute(new Runnable() {
@Override
public void run() {
socketPrint=new SocketPrint("192.168.1.100",9100,"GB2312");
}
});
ThreadPoolProxyFactory线程创建可以查看使用线程池工厂创建线程进行使用。
到此,无sdk的wifi打印就完成了。