我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android进阶——安卓调用ESC/POS打印机打印实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android进阶——安卓调用ESC/POS打印机打印实例

前言

前一段时间由于工作需要,要研究一下安卓程序调用打印机打印小票,并且要求不能使用蓝牙调用,研究了一下,可以利用socket连接,来实现打印功能。写了个Demo,分享一下。

工具:一台打印机(芯烨XP-80XX),一台安卓测试机

开发环境:Android Studio 1.5

需求:点击按钮,实现打印小票功能,小票上除必要文字外,还要有二维码。

封装了一个Pos打印工具类:


package com.example.haoguibao.myapplication; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
 
public class Pos { 
  //定义编码方式 
  private static String encoding = null; 
  private Socket sock = null; 
  // 通过socket流进行读写 
  private OutputStream socketOut = null; 
  private OutputStreamWriter writer = null; 
   
  public Pos(String ip, int port, String encoding) throws IOException { 
    sock = new Socket(ip, port); 
    socketOut = new DataOutputStream(sock.getOutputStream()); 
    this.encoding = encoding; 
    writer = new OutputStreamWriter(socketOut, encoding); 
  } 
   
  protected void closeIOAndSocket() throws IOException { 
    writer.close(); 
    socketOut.close(); 
    sock.close(); 
  } 
   
  protected void qrCode(String qrData) throws IOException { 
    int moduleSize = 8; 
    int length = qrData.getBytes(encoding).length; 
    //打印二维码矩阵 
    writer.write(0x1D);// init 
    writer.write("(k");// adjust height of barcode 
    writer.write(length + 3); // pl 
    writer.write(0); // ph 
    writer.write(49); // cn 
    writer.write(80); // fn 
    writer.write(48); // 
    writer.write(qrData); 
    writer.write(0x1D); 
    writer.write("(k"); 
    writer.write(3); 
    writer.write(0); 
    writer.write(49); 
    writer.write(69); 
    writer.write(48); 
    writer.write(0x1D); 
    writer.write("(k"); 
    writer.write(3); 
    writer.write(0); 
    writer.write(49); 
    writer.write(67); 
    writer.write(moduleSize); 
    writer.write(0x1D); 
    writer.write("(k"); 
    writer.write(3); // pl 
    writer.write(0); // ph 
    writer.write(49); // cn 
    writer.write(81); // fn 
    writer.write(48); // m 
    writer.flush(); 
  } 
   
  protected void feedAndCut() throws IOException { 
    writer.write(0x1D); 
    writer.write(86); 
    writer.write(65); 
    //    writer.write(0); 
    //切纸前走纸多少 
    writer.write(100); 
    writer.flush(); 
    //另外一种切纸的方式 
    //    byte[] bytes = {29, 86, 0}; 
    //    socketOut.write(bytes); 
  } 
   
  protected void printLine(int lineNum) throws IOException { 
    for (int i = 0; i < lineNum; i++) { 
      writer.write("\n"); 
    } 
    writer.flush(); 
  } 
   
  protected void printLine() throws IOException { 
    writer.write("\n"); 
    writer.flush(); 
  } 
   
  protected void printTabSpace(int length) throws IOException { 
    for (int i = 0; i < length; i++) { 
      writer.write("\t"); 
    } 
    writer.flush(); 
  } 
   
  protected void printWordSpace(int length) throws IOException { 
    for (int i = 0; i < length; i++) { 
      writer.write(" "); 
    } 
    writer.flush(); 
  } 
   
  protected void printLocation(int position) throws IOException { 
    writer.write(0x1B); 
    writer.write(97); 
    writer.write(position); 
    writer.flush(); 
  } 
   
  protected void printLocation(int light, int weight) throws IOException { 
    writer.write(0x1B); 
    writer.write(0x24); 
    writer.write(light); 
    writer.write(weight); 
    writer.flush(); 
  } 
   
  protected void printText(String text) throws IOException { 
    String s = text; 
    byte[] content = s.getBytes("gbk"); 
    socketOut.write(content); 
    socketOut.flush(); 
  } 
   
  protected void printTextNewLine(String text) throws IOException { 
    //换行 
    writer.write("\n"); 
    writer.flush(); 
    String s = text; 
    byte[] content = s.getBytes("gbk"); 
    socketOut.write(content); 
    socketOut.flush(); 
  } 
   
  protected void initPos() throws IOException { 
    writer.write(0x1B); 
    writer.write(0x40); 
    writer.flush(); 
  } 
   
  protected void bold(boolean flag) throws IOException { 
    if (flag) { 
      //常规粗细 
      writer.write(0x1B); 
      writer.write(69); 
      writer.write(0xF); 
      writer.flush(); 
    } else { 
      //加粗 
      writer.write(0x1B); 
      writer.write(69); 
      writer.write(0); 
      writer.flush(); 
    } 
  } 
} 

其中,打印机的IP和端口号从打印机的属性设置处可查。

MainActivity中进行调用:


package com.example.haoguibao.myapplication; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import java.io.IOException; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 
import java.util.List; 
public class MainActivity extends AppCompatActivity { 
  //订单菜品集合 
  private List<FoodsBean> foodsBean; 
  private Pos pos; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bt_print = (Button) findViewById(R.id.button); 
    bt_print.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        // 开启一个子线程 
        new Thread() { 
          public void run() { 
            try { 
              pos = new Pos("IP", 9100, "GBK");  //第一个参数是打印机网口IP 
              //初始化打印机 
              pos.initPos(); 
              //初始化订单数据 
              initData(); 
              pos.bold(true); 
              pos.printTabSpace(2); 
              pos.printWordSpace(1); 
              pos.printText("**测试店铺"); 
              pos.printLocation(0); 
              pos.printTextNewLine("----------------------------------------------"); 
              pos.bold(false); 
              pos.printTextNewLine("订 单 号:1005199"); 
              pos.printTextNewLine("用 户 名:15712937281"); 
              pos.printTextNewLine("桌  号:3号桌"); 
              pos.printTextNewLine("订单状态:订单已确认"); 
              pos.printTextNewLine("订单日期:2016/2/19 12:34:53"); 
              pos.printTextNewLine("付 款 人:线下支付(服务员:宝哥)"); 
              pos.printTextNewLine("服 务 员:1001"); 
              pos.printTextNewLine("订单备注:不要辣,少盐"); 
              pos.printLine(2); 
              pos.printText("品项"); 
              pos.printLocation(20, 1); 
              pos.printText("单价"); 
              pos.printLocation(99, 1); 
              pos.printWordSpace(1); 
              pos.printText("数量"); 
              pos.printWordSpace(3); 
              pos.printText("小计"); 
              pos.printTextNewLine("----------------------------------------------"); 
              for (FoodsBean foods : foodsBean) { 
                pos.printTextNewLine(foods.getName()); 
                pos.printLocation(20, 1); 
                pos.printText(foods.getPrice()); 
                pos.printLocation(99, 1); 
                pos.printWordSpace(1); 
                pos.printText(foods.getNumber()); 
                pos.printWordSpace(3); 
                pos.printText(foods.getSum()); 
              } 
              pos.printTextNewLine("----------------------------------------------"); 
              pos.printLocation(1); 
              pos.printLine(2); 
              //打印二维码 
              pos.qrCode("http://blog.csdn.net/haovip123"); 
              //切纸 
              pos.feedAndCut(); 
              pos.closeIOAndSocket(); 
              pos = null; 
            } catch (UnknownHostException e) { 
              e.printStackTrace(); 
            } catch (IOException e) { 
              e.printStackTrace(); 
            } 
          } 
        }.start(); 
      } 
    }); 
  } 
  private void initData() { 
    foodsBean = new ArrayList<>(); 
    for (int i = 0; i < 4; i++) { 
      FoodsBean fb = new FoodsBean(); 
      fb.setName("测试菜品" + i); 
      fb.setPrice("90.00"); 
      fb.setNumber("1" + i); 
      fb.setSum("10" + i + ".00"); 
      foodsBean.add(fb); 
    } 
  } 
} 

附:小票中菜品的Bean类


public class FoodsBean { 
  private String name; 
  private String price; 
  private String number; 
  private String sum; 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public String getPrice() { 
    return price; 
  } 
  public void setPrice(String price) { 
    this.price = price; 
  } 
  public String getNumber() { 
    return number; 
  } 
  public void setNumber(String number) { 
    this.number = number; 
  } 
  public String getSum() { 
    return sum; 
  } 
  public void setSum(String sum) { 
    this.sum = sum; 
  } 
} 

打印小票样品如图:

小结:

对于调用打印机,不论使用Java语言还是其他语言,思路都是一样的,利用Socket连接上打印机以后,通过IO流进行输出打印,它们的打印指令都是一样的,可以下载打印手册,针对不同的设置,使用不同的打印指令即可。

您可能感兴趣的文章:Android实现PDF预览打印功能Android gradle插件打印时间戳的方法详解Android编程实现计算两个日期之间天数并打印所有日期的方法Android中如何安全地打印日志详解Mac 下 Android Studio 不打印日志的解决办法Android jni调试打印char阵列的实例详解Android下的POS打印机调用的简单实现Android 蓝牙连接 ESC/POS 热敏打印机打印实例(ESC/POS指令篇)Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)Android打印机--小票打印格式及模板设置实例代码Android手机通过蓝牙连接佳博打印机的实例代码Android实现系统打印功能


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android进阶——安卓调用ESC/POS打印机打印实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android进阶——安卓调用ESC/POS打印机打印实例

前言前一段时间由于工作需要,要研究一下安卓程序调用打印机打印小票,并且要求不能使用蓝牙调用,研究了一下,可以利用socket连接,来实现打印功能。写了个Demo,分享一下。工具:一台打印机(芯烨XP-80XX),一台安卓测试机开发环境:An
2022-06-06

Android 蓝牙连接 ESC/POS 热敏打印机打印实例(ESC/POS指令篇)

上一篇 主要介绍了如何通过蓝牙连接到打印机。这一篇,我们就介绍如何向打印机发送打印指令,来打印字符和图片。1. 构造输出流 首先要明确一点,就是蓝牙连接打印机这种场景下,手机是 Client 端,打印机是 Server 端。 在上一篇的最后
2022-06-06

Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)

公司的一个手机端的 CRM 项目最近要增加小票打印的功能,就是我们点外卖的时候经常会见到的那种小票。这里主要涉及到两大块的知识:蓝牙连接及数据传输ESC/POS 打印指令 蓝牙连接不用说了,太常见了,这篇主要介绍这部分的内容。但ESC/PO
2022-06-06

Android下的POS打印机调用的简单实现

本文基于GP58系列,它可以兼容ESC/POS指令集,对EPSON的打印机通用. Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。这里采用的是调用USB接口来控制打印机输出
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录