android 控制POS机图文打印(二)
来源:程序员人生 发布时间:2014-12-16 08:40:29 阅读次数:2996次
上1篇文章结束了ESC/POS的指令集,没看过的可以去看1下,可以当作工具文档来使用的
android 控制POS机图文打印(1)
这1篇正式介绍如何使用POS机来打印图文信息。
首先介绍1下,ESC/POS指令是如何使用的,
字体加粗指令:
byte[] FONT_B =
new byte[3];
FONT_B[0] = 27;
FONT_B[1] = 33;
FONT_B[2] = 8;
字体纵向放大1倍:
byte[] CLEAR_FONT =
new byte[3];
CLEAR_FONT[0] = 0x1c;
CLEAR_FONT[1] = 0x21;
CLEAR_FONT[2] = 0;
清除字体放大指令:
byte[] FD_FONT =
new byte[3];
FD_FONT[0] = 0x1c;
FD_FONT[1] = 0x21;
FD_FONT[2] = 4;
打印条形码指令:
byte[] PRINT_CODE =
new byte[9];
PRINT_CODE[0] = 0x1d;
PRINT_CODE[1] = 0x68;
PRINT_CODE[2] = 120;
PRINT_CODE[3] = 0x1d;
PRINT_CODE[4] = 0x48;
PRINT_CODE[5] = 0x10;
PRINT_CODE[6] = 0x1d;
PRINT_CODE[7] = 0x6B;
PRINT_CODE[8] = 0x02;
等等的指令使用。。。
可以参考下上1篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行10进制和106进制的设定的,这个大家要注意了。
接下来是介绍如何连接到打印机。
private static String
PRINT_IP =
"192.168.1.111";// 打印机IP地址
private static
int
PRINT_PORT = 9100;// 打印机端口 默许为9100 建议不要修改打印机端口,修改了可能会连接不上的
这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默许的设置,最好就不要去修改,如果修改了,可能致使连接不上的,我1开始的时候设置了9000,就连接不上了。。。
然后就通过socket进行连接打印机
// 建立打印机连接
socket = new Socket();
InetSocketAddress iSocketAddress =
new InetSocketAddress(PRINT_IP,
PRINT_PORT);// 绑定打印机
socket.connect(iSocketAddress);// 建立连接
接下来就是写1个打印的方法,调用打印机传输指令和数据到打印机进行打印。
直接上代码了,代码里面的注释得非常清楚
/**
* @param PRINT_DATA
* 小票主要数据
* @param GS_INFO
* 小票附带信息
* @param CAIDAN_SN
* 小票号码
*/
public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {
if (PRINT_DATA != null && PRINT_DATA.size() > 0) {
try {
// 条码打印指令
byte[] PRINT_CODE = new byte[9];
PRINT_CODE[0] = 0x1d;
PRINT_CODE[1] = 0x68;
PRINT_CODE[2] = 120;
PRINT_CODE[3] = 0x1d;
PRINT_CODE[4] = 0x48;
PRINT_CODE[5] = 0x10;
PRINT_CODE[6] = 0x1d;
PRINT_CODE[7] = 0x6B;
PRINT_CODE[8] = 0x02;
// 清除字体放大指令
byte[] FD_FONT = new byte[3];
FD_FONT[0] = 0x1c;
FD_FONT[1] = 0x21;
FD_FONT[2] = 4;
// 字体加粗指令
byte[] FONT_B = new byte[3];
FONT_B[0] = 27;
FONT_B[1] = 33;
FONT_B[2] = 8;
// 字体纵向放大1倍
byte[] CLEAR_FONT = new byte[3];
CLEAR_FONT[0] = 0x1c;
CLEAR_FONT[1] = 0x21;
CLEAR_FONT[2] = 0;
// 计算合计金额
int price = 0;
// 初始化打印机
socketOut.write(27);
socketOut.write(64);
socketOut.write(FD_FONT);// 字体放大
socketOut.write(FONT_B);// 字体加粗
socketOut.write(10);
writer.write(" " + GS_INFO.get("GS_Name") + "
");
writer.flush();// 关键,很重要,不然指令1次性输出,后面指令覆盖前面指令,致使取消放大指令无效
socketOut.write(CLEAR_FONT);
socketOut.write(10);
writer.write("NO: " + CAIDAN_SN + "
");
writer.write("------------------------------
");
writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "
");
writer.write("地址: " + GS_INFO.get("GS_address") + "
");
writer.write("联系电话: " + GS_INFO.get("GS_tel") + "
");
writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "
");
writer.write("------------------------------
");
writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)
+ Fix_String_Lenth(0,Colum_Name[1], 14)
+ Fix_String_Lenth(1,Colum_Name[2], 4)
+ Fix_String_Lenth(1,Colum_Name[3], 6) + "
");
for (int i = 0; i < PRINT_DATA.size() - 1; i++) {
writer.write(Fix_String_Lenth(1,i + 1 + "", 2)
+ Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)
+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)
+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "
");
price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());
}
// 打印2维码
Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");
byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
socketOut.write(data);
data[0] = (byte)0x00;
data[1] = (byte)0x00;
data[2] = (byte)0x00; //重置参数
int pixelColor;
// ESC * m nL nH 点阵图
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };
escBmp[2] = (byte)0x21;
//nL, nH
escBmp[3] = (byte)(bmp.getWidth() % 256);
escBmp[4] = (byte)(bmp.getWidth() / 256);
// 每行进行打印
for (int i = 0; i < bmp.getHeight() / 24 + 1; i++){
socketOut.write(escBmp);
for (int j = 0; j < bmp.getWidth(); j++){
for (int k = 0; k < 24; k++){
if (((i * 24) + k) < bmp.getHeight()){
pixelColor = bmp.getPixel(j, (i * 24) + k);
if (pixelColor != ⑴){
data[k / 8] += (byte)(128 >> (k % 8));
}
}
}
socketOut.write(data);
// 重置参数
data[0] = (byte)0x00;
data[1] = (byte)0x00;
data[2] = (byte)0x00;
}
//换行
byte[] byte_send1 = new byte[2];
byte_send1[0] = 0x0d;
byte_send1[1] = 0x0a;
socketOut.write(byte_send1);
}
//换行
byte[] byte_send2 = new byte[2];
byte_send2[0] = 0x0d;
byte_send2[1] = 0x0a;
//发送测试信息
socketOut.write(byte_send2);
writer.write("------------------------------
");
writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元
");
writer.write("------------------------------
");
writer.write(" 谢 谢 惠 顾
");
// 下面指令为打印完成后自动走纸
writer.write(27);
writer.write(100);
writer.write(4);
writer.write(10);
writer.close();
socketOut.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦1下,需要把图片转换成点阵数据然落后行每行打印,可以参考print方法。
然后直接调用该方法就能够进行打印了,记住,android4.0以后不能在主线程中履行了,需要新建1个线程来履行该方法,如
new Thread() {
<span style="white-space:pre"> </span>public void run() {
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>new PrintLine().print(lists, mapgs, sn);
<span style="white-space:pre"> </span>} catch (IOException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>};
}.start();
其实android调用pos机进行打印也不是想象中的那末难弄的,只要把ESC/POS指令掌握了,如何传输指令和数据过去弄定了,就不难了,如果还需要其他操作,比如打印特殊符号,字体的其他效果的打印等等,都可以参考print方法中传输指令的方式进行设定,pos机就可以辨认到指令接收到数据进行打印了,是否是挺简单的?有甚么问题大家可以1起讨论的,本人也是初次接触pos机的。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠