上一篇文章结束了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机图文打印(二)相关推荐

  1. android 控制POS机图文打印(一)

    因为公司业务的需要,要用android客户端控制pos机打印票据,不单只是中文的,而且还要包括二维码的打印的!经过两天的努力!终于搞定了!!!!我真是! 首先,先奉上ESC/POS指令集. EPSON ...

  2. java使用jnative控制北洋牌标签打印机打印二维码

    [img]http://dl.iteye.com/upload/attachment/0076/8465/9b0e8b8f-3e37-326c-b453-17961ce8807f.png[/img] ...

  3. pos机顾显java控制打印内容_Delphi下POS机控制钱箱,客显,打印机,小票打印

    1.控制POS机的客户显示屏 procedure TFrmMain.ShowMoney(Money_Port:   String;Money_String:String); //Moneey_Port ...

  4. Delphi下POS机控制钱箱,客显,打印机,小票打印

    1.控制POS机的客户显示屏 procedure TFrmMain.ShowMoney(Money_Port:   String;Money_String:String); //Moneey_Port ...

  5. pos机顾显java控制打印内容_Delphi下POS机控制钱箱,客显,打印机

    1.控制POS机的客户显示屏 procedure  TFrmMain.ShowMoney(Money_Port:   String;Money_String:String); //Moneey_Por ...

  6. android pos机打印

    研究了好几天的pos机打印,终于搞好了,在此做个笔记.第一次写博客 ,如有不对,望提出. 由于pos机可打印多种类型图片,我打印的是光栅位图,另外pos机也可打印其他多种类型图片,在此只说明光栅位图的 ...

  7. android连接小票打印机,打印小票数据的两种模式

    为了开发android无线点餐系统,需要用到打印小票任务,根据网上查找资料所得,学习了两种方法,一种为通过tomcat服务连接服务器所连接的打印机打印,一种为直接连接网络打印机打印 一.通过tomca ...

  8. 全平台支付一机搞定 海信Hi98智能POS机评测

    1.互联网支付解决方案 海信Hi98智能POS机全平台兼容 互联网时代让我们的生活发生的很大的变化,就连平时购物消费使用信用卡消费的次数越来越少了,随着支付宝.微信支付.百度钱包.ApplePay等移 ...

  9. Android硬件控制之POS热敏打印(支持任意图表)

    简介 在Android实现Pos打印的应用场景?实现pos打印的难度?如何用只支持黑白的热敏打印机打印出灰阶效果? 在Android实现Pos打印的应用场景? pos热敏打印机在平时生活中还是挺常见的 ...

最新文章

  1. mysql多重主键错误,老师,jd_spider中数据插入Mysql时一直显示主键错误,求助~
  2. 【JS】执行上下文(ExcecutionContext)
  3. window.navigator.userAgent用来区分设备和浏览器
  4. 动态添加内容到百度搜索框里
  5. rtl support
  6. python开发笔记软件_图解Python编程神器Jupyter Notebook
  7. “睡服”面试官系列第十七篇之Reflect(建议收藏学习)
  8. C++语言基础 —— STL —— 容器与迭代器 —— map 与 multimap
  9. eigen库安装_Python-OpenCV 1. 图像处理库OpenCV安装
  10. less-postcss
  11. postman怎么传对象list_postman 传递json的参数里面带了List对象
  12. 我在美团的八年,技术人必读
  13. SVN提交时显示:Path is not a working copy directory
  14. jQuery.proxy用法
  15. 使用Retryer优雅地实现对Callable各种各样的重试调用
  16. Android 音频管理器AudioManager类介绍
  17. Paddle飞桨动态图教程——轻量级人像语义分割BiSeNet V2(算法原理、训练、部署,含完整代码和数据)
  18. Linux学习-02-Linux的安装
  19. 同步时钟之hwclock命令(硬件-系统,系统-硬件)
  20. android记账app开发全过程,android开发实战-记账本APP(一)

热门文章

  1. zabbix使用宏自动发现网卡并实现监控(入职小灰)
  2. 专訪印度电商Snapdeal CEO:学阿里还是京东
  3. 国办督查曝光的河北多地非法瓶装液化气问题 通过“RFID+二维码”电子标签可解
  4. 10款非Windows免费操作系统推介
  5. eclipse中创建spring boot项目
  6. WebPack实战 WebPack打包Vue项目
  7. swift 拼音转化为英文字母
  8. echarts饼图属性设置-饼图中间设置总和
  9. springboot接口防刷实现
  10. COCO数据集标注格式详解----object instances