android 控制POS机图文打印(二)
上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的
android 控制POS机图文打印(一)
这一篇正式介绍如何使用POS机来打印图文信息。
首先介绍一下,ESC/POS指令是如何使用的,
字体加粗指令:
byte[] FONT_B = new byte[3];
FONT_B[0] = 27;
FONT_B[1] = 33;
FONT_B[2] = 8;
字体纵向放大一倍:
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;
等等的指令使用。。。
可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。
接下来是介绍如何连接到打印机。
private static String PRINT_IP = "192.168.1.111";// 打印机IP地址
private static int PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的
这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。
然后就通过socket进行连接打印机
// 建立打印机连接
socket = new Socket();
InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机
socket.connect(iSocketAddress);// 建立连接
接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。
直接上代码了,代码里面的注释得非常清楚
/*** @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;// 字体纵向放大一倍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") + " \r\n");writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效socketOut.write(CLEAR_FONT);socketOut.write(10);writer.write("NO: " + CAIDAN_SN + " \r\n");writer.write("------------------------------\r\n");writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");writer.write("------------------------------\r\n");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) + "\r\n");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) + "\r\n");price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());}// 打印二维码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 != -1){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("------------------------------\r\n");writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");writer.write("------------------------------\r\n");writer.write(" 谢 谢 惠 顾\r\n");// 下面指令为打印完成后自动走纸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过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。
然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如
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机就能识别到指令接收到数据进行打印了,是不是挺简单的?有什么问题大家可以一起讨论的,本人也是初次接触pos机的。
android 控制POS机图文打印(二)相关推荐
- android 控制POS机图文打印(一)
因为公司业务的需要,要用android客户端控制pos机打印票据,不单只是中文的,而且还要包括二维码的打印的!经过两天的努力!终于搞定了!!!!我真是! 首先,先奉上ESC/POS指令集. EPSON ...
- java使用jnative控制北洋牌标签打印机打印二维码
[img]http://dl.iteye.com/upload/attachment/0076/8465/9b0e8b8f-3e37-326c-b453-17961ce8807f.png[/img] ...
- pos机顾显java控制打印内容_Delphi下POS机控制钱箱,客显,打印机,小票打印
1.控制POS机的客户显示屏 procedure TFrmMain.ShowMoney(Money_Port: String;Money_String:String); //Moneey_Port ...
- Delphi下POS机控制钱箱,客显,打印机,小票打印
1.控制POS机的客户显示屏 procedure TFrmMain.ShowMoney(Money_Port: String;Money_String:String); //Moneey_Port ...
- pos机顾显java控制打印内容_Delphi下POS机控制钱箱,客显,打印机
1.控制POS机的客户显示屏 procedure TFrmMain.ShowMoney(Money_Port: String;Money_String:String); //Moneey_Por ...
- android pos机打印
研究了好几天的pos机打印,终于搞好了,在此做个笔记.第一次写博客 ,如有不对,望提出. 由于pos机可打印多种类型图片,我打印的是光栅位图,另外pos机也可打印其他多种类型图片,在此只说明光栅位图的 ...
- android连接小票打印机,打印小票数据的两种模式
为了开发android无线点餐系统,需要用到打印小票任务,根据网上查找资料所得,学习了两种方法,一种为通过tomcat服务连接服务器所连接的打印机打印,一种为直接连接网络打印机打印 一.通过tomca ...
- 全平台支付一机搞定 海信Hi98智能POS机评测
1.互联网支付解决方案 海信Hi98智能POS机全平台兼容 互联网时代让我们的生活发生的很大的变化,就连平时购物消费使用信用卡消费的次数越来越少了,随着支付宝.微信支付.百度钱包.ApplePay等移 ...
- Android硬件控制之POS热敏打印(支持任意图表)
简介 在Android实现Pos打印的应用场景?实现pos打印的难度?如何用只支持黑白的热敏打印机打印出灰阶效果? 在Android实现Pos打印的应用场景? pos热敏打印机在平时生活中还是挺常见的 ...
最新文章
- mysql多重主键错误,老师,jd_spider中数据插入Mysql时一直显示主键错误,求助~
- 【JS】执行上下文(ExcecutionContext)
- window.navigator.userAgent用来区分设备和浏览器
- 动态添加内容到百度搜索框里
- rtl support
- python开发笔记软件_图解Python编程神器Jupyter Notebook
- “睡服”面试官系列第十七篇之Reflect(建议收藏学习)
- C++语言基础 —— STL —— 容器与迭代器 —— map 与 multimap
- eigen库安装_Python-OpenCV 1. 图像处理库OpenCV安装
- less-postcss
- postman怎么传对象list_postman 传递json的参数里面带了List对象
- 我在美团的八年,技术人必读
- SVN提交时显示:Path is not a working copy directory
- jQuery.proxy用法
- 使用Retryer优雅地实现对Callable各种各样的重试调用
- Android 音频管理器AudioManager类介绍
- Paddle飞桨动态图教程——轻量级人像语义分割BiSeNet V2(算法原理、训练、部署,含完整代码和数据)
- Linux学习-02-Linux的安装
- 同步时钟之hwclock命令(硬件-系统,系统-硬件)
- android记账app开发全过程,android开发实战-记账本APP(一)