sockot连接打印机EPSON ESC/POS指令打印

 接了一个需求,需要用Android pad连接打印机进行打印,以前倒是没接触过,这次在网上找了下资料,简单实现了下需求。在这记录下相关代码以及踩的坑
  • 首先第一步就是通过socket连接打印机
  • 再通过socket发送打印指令就行

代码步骤都比较简单,先看下代码

public class EscPos {public static final byte FS = 0x1C;public static final byte HT = 0x9;public static final byte LF = 0x0A;public static final byte CR = 0x0D;public static final byte ESC = 0x1B;public static final byte DLE = 0x10;public static final byte GS = 0x1D;public static final byte STX = 0x02;public static final byte US = 0x1F;public static final byte CAN = 0x18;public static final byte CLR = 0x0C;public static final byte EOT = 0x04;/* 初始化打印机 */public static final byte[] ESC_INIT = new byte[]{ESC, '@'};/* 设置标准模式 */public static final byte[] ESC_STANDARD = new byte[]{ESC, 'S'};/* 设置汉字打印模式 */public static final byte[] ESC_CN_FONT = new byte[]{FS, '&'};/* 选择字符集 */public static final byte[] ESC_SELECT_CHARACTER = new byte[]{ESC, 'R', 9};/* 设置用户自定义汉字字体 焗7118 */public static final byte[] ESC_FS_2 = new byte[]{FS, 0x32, 0x71, 0x18};/* 取消用户自定义字体 */public static final byte[] ESC_CANCEL_DEFINE_FONT = new byte[]{ESC, '%', 0};/* 打开钱箱指令 */public static final byte[] ESC_OPEN_DRAWER = new byte[]{ESC, 'p', 0x00, 0x10, (byte) 0xff};/* 切纸指令GS V m* m 0,48 Executes a full cut(cuts the paper completely)* 1,49 Excutes a partilal cut(one point left uncut)*/public static final byte[] POS_CUT_MODE_FULL = new byte[]{GS, 'V', 0x00};public static final byte[] POS_CUT_MODE_PARTIAL = new byte[]{GS, 'V', 0x01};/* 西文字符 (半宽)字体A (6 ×12),汉字字符 (全宽)字体A (12×12) */public static final byte[] ESC_FONT_A = new byte[]{ESC, '!', 0};/* 西文字符 (半宽)字体B (8×16),汉字字符 (全宽)字体B (16×16) */public static final byte[] ESC_FONT_B = new byte[]{ESC, '!', 1};/* 12*24 0/48*/public static final byte[] ESC_FONTA = new byte[]{ESC, 'M', 48};/* 9*17 1/49*/public static final byte[] ESC_FONTB = new byte[]{ESC, 'M', 1};/* 默认颜色字体指令 */public static final byte[] ESC_FONT_COLOR_DEFAULT = new byte[]{ESC, 'r', 0x00};/* 红色字体指令 */public static final byte[] ESC_FONT_COLOR_RED = new byte[]{ESC, 'r', 0x01};/* 标准大小 */public static final byte[] FS_FONT_ALIGN = new byte[]{FS, 0x21, 1, ESC, 0x21, 1};/* 横向放大一倍 */public static final byte[] FS_FONT_ALIGN_DOUBLE = new byte[]{FS, 0x21, 4, ESC, 0x21, 4};/* 纵向放大一倍 */public static final byte[] FS_FONT_VERTICAL_DOUBLE = new byte[]{FS, 0x21, 8, ESC, 0x21, 8, GS, '!', 0x01};/* 横向纵向都放大一倍 */public static final byte[] FS_FONT_DOUBLE = new byte[]{FS, 0x21, 12, ESC, 0x21, 48};/* 靠左打印命令 */public static final byte[] ESC_ALIGN_LEFT = new byte[]{0x1b, 'a', 0x00};/* 居中打印命令 */public static final byte[] ESC_ALIGN_CENTER = new byte[]{0x1b, 'a', 0x01};/* 靠右打印命令 */public static final byte[] ESC_ALIGN_RIGHT = new byte[]{0x1b, 'a', 0x02};/* 字体加粗 */public static final byte[] ESC_SETTING_BOLD = new byte[]{ESC, 0x45, 1};/* 取消字体加粗 */public static final byte[] ESC_CANCEL_BOLD = new byte[]{ESC, 0x45, 0};public static final int STATE_1 = 1;// 创建Socket连接public static final int STATE_2 = 2;// 获取输出流public static final int STATE_3 = 3;// 关闭Socketpublic static final int STATE_0 = 0;// 成功public static final int ERROR_2 = -2;// 创建Socket失败public static final int ERROR_3 = -3;// 获取输出流失败public static final int ERROR_4 = -4;// 关闭Socket出错public static final int ERROR_100 = -100;// 失败// 通过socket流进行读写private OutputStream socketOut = null;// 以ip作为key,EscPos实例作为value的Mapprivate static Map<String, EscPos> posMap = new HashMap<String, EscPos>();private static EscPos escPos = null;// 默认端口public static int DEFAULT_PORT = 9100;private Socket socket;private OnPrinterListener listener;private String ip;private int port;/*** 根据ip、端口、字符编码构造工具类实例** @param ip   打印机ip* @param port 打印机端口,默认9100* @throws IOException*/public EscPos(String ip, int port) {this.ip = ip;this.port = port;}public synchronized static EscPos getInstance(String ip, Integer port) {escPos = posMap.get(ip);if (escPos == null) {escPos = new EscPos(ip, port);}return escPos;}public static synchronized EscPos getInstance(String ip) {return getInstance(ip, DEFAULT_PORT);}public static synchronized EscPos getInstance() {//这儿写死或者传入打印机地址和端口return getInstance("","";}public static void myPrinter(final List<String> list, final OnPrinterListener printerListener) {Runnable runnable = new Runnable() {@Overridepublic void run() {EscPos escPos = EscPos.getInstance();escPos.setListener(printerListener);escPos.connectSocket();try {escPos.init();for (int i = 0; i < list.size(); i++) {escPos.line(1);escPos.boldOff(true);escPos.printStr(list.get(i));//escPos.printStr("测试字体6");}escPos.line(10);escPos.feedAndCut();escPos.closeIOAndSocket();printerListener.onListener(STATE_0);} catch (IOException e) {printerListener.onError(ERROR_100);LOGGER.error("Socket printer write ===> ", e);e.printStackTrace();}}};new Thread(runnable).start();}public void connectSocket() {try {socket = new Socket();SocketAddress socAddress = new InetSocketAddress(ip, port);socket.connect(socAddress, 5000);if (listener != null) {listener.onListener(STATE_1);}try {socketOut = socket.getOutputStream();if (listener != null) {listener.onListener(STATE_2);}} catch (IOException e) {if (listener != null) {listener.onError(ERROR_3);}LOGGER.error("Socket printer getOutputStream ===> ", e);e.printStackTrace();}} catch (IOException e) {if (listener != null) {listener.onError(ERROR_2);}LOGGER.error("Socket printer connect ===> ", e);e.printStackTrace();}}/*** 换行** @param lineNum 换行数,0为不换行* @return* @throws IOException*/public EscPos line(int lineNum) throws IOException {for (int i = 0; i < lineNum; i++) {socketOut.write("\n".getBytes());socketOut.flush();}return this;}/*** 加粗** @param flag false为不加粗* @return* @throws IOException*/public EscPos bold(boolean flag) throws IOException {if (flag) {socketOut.write(ESC_SETTING_BOLD);}return this;}/*** 取消粗体** @param flag true为取消粗体模式* @return* @throws IOException*/public EscPos boldOff(boolean flag) throws IOException {if (flag) {socketOut.write(ESC_CANCEL_BOLD);//socketOut.write(FS_FONT_DOUBLE);}return this;}/*** 初始化打印机** @return* @throws IOException*/EscPos init() throws IOException {socketOut.write(ESC_INIT);return this;}/*** 打印空白** @param length 需要打印空白的长度* @throws IOException*/private void printSpace(int length) throws IOException {for (int i = 0; i < length; i++) {socketOut.write(" ".getBytes());}socketOut.flush();}/*** 进纸并全部切割** @return* @throws IOException*/public EscPos feedAndCut() throws IOException {socketOut.write(POS_CUT_MODE_FULL);socketOut.flush();return this;}public void closeIOAndSocket() {try {socketOut.close();socket.close();if (listener != null) {listener.onListener(STATE_3);}} catch (IOException e) {if (listener != null) {listener.onError(ERROR_4);}LOGGER.error("Socket printer close ===> ", e);e.printStackTrace();}}/*** 打印字符串** @param str 所需打印字符串* @return* @throws IOException*/public EscPos printStr(String str) throws IOException {socketOut.write(ESC_CN_FONT);socketOut.write(str.getBytes(Charset.forName("GBK")));socketOut.write(LF);socketOut.flush();return this;}public void setListener(OnPrinterListener listener) {this.listener = listener;}public interface OnPrinterListener {void onListener(int status);void onError(int errorCode);}
}

打印调用示例代码

//printerData 是list<string>类型的数据   循环打印文案
EscPos.myPrinter(printerData, new EscPos.OnPrinterListener() {@Overridepublic void onListener(int status) {}@Overridepublic void onError(final int errorCode) {((Activity) context).runOnUiThread(new Runnable() {@Overridepublic void run() {//此时已在主线程中,可以更新UI了if (errorCode == EscPos.ERROR_2) {Toast.makeText(context, "连接打印机失败", Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, "打印异常", Toast.LENGTH_SHORT).show();}}});}});

过程遇到的坑

  • socket连不上打印机
    1.确保打印机的网和手机在同一个网段内
    2.打印机端口和地址正确(可百度查询如何确定打印机IP和端口)

  • socket发送打印指令不起作用
    这个当时坑死我了,我用一个串测试“hello word” ,结果就因为中间多加了空格,就是打印不出来,后来才知道,这种空格没法打印,一定要写个简单的串先测试。

Android sockot连接打印机EPSON ESC/POS指令打印相关推荐

  1. Android在针式打印机上通过ESC/P指令打印二维码

    Android在针式打印机上通过ESC/P指令打印二维码 前言 正文 前言 最近有个需求就是在rk3399上通过usb口打印发票单,各大品牌的针式打印机几乎都没有Android平台的SDK,后查找相关 ...

  2. iOS 连接打印机 ESC/POS 指令打印 打印图片二维码

    最近公司给商户做的App 允许App把卖出的商品信息通过打印机 打印标签 所以了解了一下iOS 和 打印机 之间的交互 (Ps:用的不是UIPrinter 那个扫面打印机 发送信息打印的那个框架) 主 ...

  3. EPSON ESC/POS指令

    英文模式下的命令 代码 功能 CR 回车 ESC ! 设置打印方式 ESC % 选择或取消用户自定义字符集 ESC & 定义用户自定义字符集 ESC * 设置位映射方式 ESC @ 初始化打印 ...

  4. Android 蓝牙/wifi云打印机 ESC/POS热敏打印机打印(ESC/POS指令篇)

    上一篇主要介绍了如何通过蓝牙打印机和wifi云打印机的连接与数据发送,这一篇,我们就介绍向打印机发送打印指令,来打印字符和图片. 由于公司暂且买了两台打印机,一台佳博GP-58MIII,一台GP-SH ...

  5. C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)

     C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机 支持并口,串口,网口,USB口,驱动方式等多种端口 支持开关钱箱 ...

  6. EPSON ESC/POS打印机指令

    原文地址::http://blog.csdn.net/feng88724/article/details/17474351 相关文章 1.微型热敏打印机指令集----https://wenku.bai ...

  7. android 蓝牙打印机(ESC/POS 热敏打印机),打印菜单小票和图片,对蓝牙配对和连接打印功能进行了封装,让你超快实现蓝牙打印功能

    BluetoothPrint 项目地址:liuGuiRong18/BluetoothPrint  简介:android 蓝牙打印机(ESC/POS 热敏打印机),打印菜单小票和图片,对蓝牙配对和连接打 ...

  8. c# 中崎_C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)...

    C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机) 收藏 C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持 ...

  9. 基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机

    C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机 支持并口,串口,网口,USB口,驱动方式等多种端口 支持开关钱箱 支 ...

最新文章

  1. oracle日期处理(一)
  2. 计算机信息技术为教育带来的变化,信息技术对课堂教学带来的变化
  3. 1.ELF之Elf Header
  4. Linux内存压力测试stressapptest
  5. centos7 关闭防火墙的指令_CentOS7服务器安装Ansys 19.2过程
  6. 单例设计模式之间的区别
  7. linux和windows的ip区别吗,windows与linux ping 显示的ip不一样
  8. yii2 restful的自定义api
  9. Windows 8部署系列PART7:配置MDT部署目标
  10. Bartender模板三种动态图片设置方法(仅供参考)
  11. html雪花飘落效果,使用js实现雪花飘落效果
  12. vue2.x进阶知识点总结
  13. qq群排名如何引流?QQ群排名引流方法,QQ群排名如何做?
  14. BUPT计导第三次机考12.8数组+二分答案详解
  15. 什么是测试环境?如何搭建测试环境?
  16. facebook 邀请好友
  17. 以微博为例进行Oauth2进行第三方授权登录
  18. html条码枪响应慢,条码扫描枪使用时的常见问题
  19. 闲鹿工作流 activiti6.0 显示已结束的流程图
  20. flash 与CODE memory ,ROM与Xdata

热门文章

  1. C语言:str函数(一)
  2. 25.3. Continuous Archiving and Point-in-Time Recovery (PITR)
  3. angularjs 动态监控数据
  4. 查找网站的IP地址的两种方法
  5. SQL SERVER DAY函数
  6. 中华名将索引 - 第一批:李世民
  7. 寒假集训难题(四)QWQ和神奇的传送器nefu1608
  8. 学栈和队列时的人生感悟
  9. 用HTML+CSS做一个漂亮简单的节日网页【元宵节】
  10. 巧用快捷键轻松设置Eexel单元格格式(转)