前言

前一段时间由于工作需要,要研究一下安卓程序调用打印机打印小票,并且要求不能使用蓝牙调用,研究了一下,可以利用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;/*** Created by haoguibao on 16/2/18.* Description : 封装Pos机打印工具类* Revision :*/
public class Pos {//定义编码方式private static String encoding = null;private Socket sock = null;// 通过socket流进行读写private OutputStream socketOut = null;private OutputStreamWriter writer = null;/*** 初始化Pos实例** @param ip 打印机IP* @param port  打印机端口号* @param encoding  编码* @throws IOException*/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);}/*** 关闭IO流和Socket** @throws IOException*/protected void closeIOAndSocket() throws IOException {writer.close();socketOut.close();sock.close();}/*** 打印二维码** @param qrData 二维码的内容* @throws IOException*/protected void qrCode(String qrData) throws IOException {int moduleSize = 8;int length = qrData.getBytes(encoding).length;//打印二维码矩阵writer.write(0x1D);// initwriter.write("(k");// adjust height of barcodewriter.write(length + 3); // plwriter.write(0); // phwriter.write(49); // cnwriter.write(80); // fnwriter.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); // plwriter.write(0); // phwriter.write(49); // cnwriter.write(81); // fnwriter.write(48); // mwriter.flush();}/*** 进纸并全部切割** @return* @throws IOException*/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);}/*** 打印换行** @return length 需要打印的空行数* @throws IOException*/protected void printLine(int lineNum) throws IOException {for (int i = 0; i < lineNum; i++) {writer.write("\n");}writer.flush();}/*** 打印换行(只换一行)** @throws IOException*/protected void printLine() throws IOException {writer.write("\n");writer.flush();}/*** 打印空白(一个Tab的位置,约4个汉字)** @param length 需要打印空白的长度,* @throws IOException*/protected void printTabSpace(int length) throws IOException {for (int i = 0; i < length; i++) {writer.write("\t");}writer.flush();}/*** 打印空白(一个汉字的位置)** @param length 需要打印空白的长度,* @throws IOException*/protected void printWordSpace(int length) throws IOException {for (int i = 0; i < length; i++) {writer.write("  ");}writer.flush();}/*** 打印位置调整** @param position 打印位置  0:居左(默认) 1:居中 2:居右* @throws IOException*/protected void printLocation(int position) throws IOException {writer.write(0x1B);writer.write(97);writer.write(position);writer.flush();}/*** 绝对打印位置** @throws IOException*/protected void printLocation(int light, int weight) throws IOException {writer.write(0x1B);writer.write(0x24);writer.write(light);writer.write(weight);writer.flush();}/*** 打印文字** @param text* @throws IOException*/protected void printText(String text) throws IOException {String s = text;byte[] content = s.getBytes("gbk");socketOut.write(content);socketOut.flush();}/*** 新起一行,打印文字** @param text* @throws IOException*/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();}/*** 初始化打印机** @throws IOException*/protected void initPos() throws IOException {writer.write(0x1B);writer.write(0x40);writer.flush();}/*** 加粗** @param flag false为不加粗* @return* @throws IOException*/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;@Overrideprotected 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() {@Overridepublic 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流进行输出打印,它们的打印指令都是一样的,可以下载打印手册,针对不同的设置,使用不同的打印指令即可。

某打印指令文档,仅供参考 : http://download.csdn.net/detail/haovip123/9702573

吐槽一下,资源下载积分,不是我设置的,csdn什么积分计算算法给运算出来的,我都没有权限更改,无语...

Android进阶——安卓调用ESC/POS打印机打印相关推荐

  1. 安卓开发ESC/POS打印机打印

    ESC/POS打印机打印 主要记录一下主要代码 一.设置文字对齐: mWriter.write(0x1b); mWriter.write(0x61); mWriter.write(alignment) ...

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

    sockot连接打印机EPSON ESC/POS指令打印 接了一个需求,需要用Android pad连接打印机进行打印,以前倒是没接触过,这次在网上找了下资料,简单实现了下需求.在这记录下相关代码以及 ...

  3. delphi fmx网口命令方式调用pos打印机打印

    最近用delphi fmx 在做一个pos打印程序, 如果用usb方式打印是挺简单的,以前弄过 用richedit排版好打印就可以了,但麻烦的是必须安装打印机驱动. 于是我选择用网口方式打印. 用网络 ...

  4. 【Android】Android 集成商米内置打印机打印票据

    文章目录 [Android]Android 集成商米内置打印机打印票据 1.集成商米打印依赖 2.规范接口接口 3.使用到的相关对象以及工具类 4.MainActivity初始化接口 5.Uniapp ...

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

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

  6. Android 蓝牙/wifi云打印 ESC/POS热敏打印机打印(连接篇)

    本篇我们将讲解蓝牙打印机和wifi云打印机的连接与数据发送,下一篇讲解ESC/POS命令集 一.蓝牙打印机连接 1.蓝牙权限 2.初始化配置 3.发现设备 4.连接设备 4.1 作为Client连接 ...

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

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

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

    上一篇 主要介绍了如何通过蓝牙连接到打印机.这一篇,我们就介绍如何向打印机发送打印指令,来打印字符和图片. =====================2017.05.09 更新============ ...

  9. 安卓调用PrinterShare实现无线打印功能

    最近项目需要用到蓝牙打印,百度了很多资料,关于安卓移动打印的文章都不是很详细.要知道自己去写一个蓝牙打印模块那可是一个比较大的工作量了,而且还需要对市面上的打印机进行兼容.这个我引用一篇文章大家看下: ...

最新文章

  1. CLOSE_WAIT状态的原因与解决方法 --转
  2. WebAssembly 系列(一):生动形象地介绍 WebAssembly
  3. 怎么ping虚拟计算机,虚拟机和主机如何互ping,以及虚拟机网络配置遇到的那些坑...
  4. 使用python开发网页游戏_不敢想!不敢想!我用Python自动玩转2048游戏
  5. uniapp 刷新后数据都没有了_环境温度传感器都没有连接,竟然还会有数据?
  6. QT每日一练day16:QMessageBox消息对话框
  7. MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写
  8. List集合中对象的排序
  9. 认识一个工具 Stopwatch
  10. latex 错误: BibTeX: empty journal in Lv2021
  11. SLAM--intel realsense2在ORB SLAM2 和 ORB SLAM3下建图和重定位(ubuntu 20.04, opencv 4.2.0 以上)
  12. deepin linux Qt无法输入中文
  13. 怎样把小米手机便签内容转存到百度网盘中去?
  14. 51单片机蓝牙小车程序详解
  15. 【Python笔记】pyspark.sql.functions
  16. datetime instant 转_java8 Instant 时间及转换操作
  17. 百度首页HTML(简单代码)
  18. centos6和centos7的主要区别和版本选择
  19. 微信对接会员管理系统搭建体系
  20. 英语说10点20有计算机课,101 projects  in 1001 days实例

热门文章

  1. 基于ol-plot的openlayers 5 的标绘地图
  2. 杭州市旅游资讯网站设计与实现
  3. Spring——16 自动注入
  4. HTTP报文格式及WireShark抓包分析
  5. Unparsed aapt error(s)! Check the console for output解决方法
  6. 容器云系列之Docker容器资源隔离
  7. 给小吴:从实践下手去学编程
  8. 网络互连与互联网 - 路由信息协议(RIP)
  9. dita文档_使用DITA和SKOS进行主题分类
  10. Linux的常用指令学习以及LInux的文件目录的简介