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

  • 前言
  • 正文

前言

最近有个需求就是在rk3399上通过usb口打印发票单,各大品牌的针式打印机几乎都没有Android平台的SDK,后查找相关材料发现,可通过ESC/P指令利用usb口通信进行打印。

正文

1.注册usb服务,打开usb通信,网上相关资料很多,这边简单列举一下,注意配置usb权限

private void init(Context context) {mContext = context;mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);mContext.registerReceiver(mUsbDeviceReceiver, filter);// 列出所有的USB设备,并且都请求获取USB权限HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();for (UsbDevice device : deviceList.values()) {usbInterface = device.getInterface(0);if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) {Log.d("device", device.getProductName() + "     " + device.getManufacturerName());Log.d("device", device.getVendorId() + "     " + device.getProductId() + "      " + device.getDeviceId());Log.d("device", usbInterface.getInterfaceClass() + "");if (!mUsbManager.hasPermission(device)) {mUsbManager.requestPermission(device, mPermissionIntent);}else {connectUsbPrinter(device);}}}
}private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();UsbDevice mUsbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (ACTION_USB_PERMISSION.equals(action)) {synchronized (this) {if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && mUsbDevice != null) {connectUsbPrinter(mUsbDevice);} else {ToastUtil.showShort(mContext,"USB设备请求被拒绝");}}} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {if (mUsbDevice != null) {ToastUtil.showShort(mContext, "有设备拔出");}} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {if (mUsbDevice != null) {usbInterface = mUsbDevice.getInterface(0);if(usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER){ToastUtil.showShort(mContext, "有打印机设备插入");if (!mUsbManager.hasPermission(mUsbDevice)) {mUsbManager.requestPermission(mUsbDevice, mPermissionIntent);}else {connectUsbPrinter(mUsbDevice);}}}}}};private void connectUsbPrinter(UsbDevice mUsbDevice) {if (mUsbDevice != null) {for (int i = 0; i < usbInterface.getEndpointCount(); i++) {ep = usbInterface.getEndpoint(i);if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice);printerEp = ep;if (mUsbDeviceConnection != null) {ToastUtil.showShort(mContext, "设备已连接");mUsbDeviceConnection.claimInterface(usbInterface, true);mUsbDeviceConnection.releaseInterface(usbInterface);}}}}} else {ToastUtil.showShort(mContext, "未发现可用的打印机");}
}

2.USB输出ESC/P指令

private static final byte[] RESET = {27, '@'};
// 纸张大小设置-定义单位
private static final byte[] PAPER_UNIT = {27, 40, 85, 1, 0, 60};
// 纸张大小设置-页长-按照定义单位设置页长
private static final byte[] PAPER_LENGHT_1 = {27, 40, 67, 2, 0, 100, 01};
//退纸
private static final byte[]OUT = {0x0c};
//结束初始化
private byte[] over = new byte[]{0x1b, '@',0x0d};private boolean write(byte[] byte1,byte[]... bytes) {if (mUsbDeviceConnection != null) {byte[] newbyte = concat(byte1,bytes);//usb输出byteint b =mUsbDeviceConnection.bulkTransfer(printerEp,newbyte,newbyte.length,TIME_OUT);LogHelper.i("bulkTransfer,b-->" + b);return b>0;} else {ToastUtil.showShort(mContext, "未发现可用的打印机");return false;}}private void printBitmap(Bitmap bmp) throws IOException {bmp = compressPic(bmp);byte[] bmpByteArray = draw2PxPoint(bmp);write(bmpByteArray);
}/**
* 对图片进行压缩(去除透明度)** @param bitmapOrg*/
public static Bitmap compressPic(Bitmap bitmapOrg) {// 获取这个图片的宽和高int width = bitmapOrg.getWidth();int height = bitmapOrg.getHeight();// 定义预转换成的图片的宽度和高度int newWidth = IMAGE_SIZE;int newHeight = IMAGE_SIZE+30;Bitmap targetBmp = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);Canvas targetCanvas = new Canvas(targetBmp);targetCanvas.drawColor(0xffffffff);targetCanvas.drawBitmap(bitmapOrg, new Rect(0, 0, width, height), new Rect(0, 0, newWidth, newHeight), null);return targetBmp;
}public static byte[] draw2PxPoint(Bitmap bmp) {//先设置一个足够大的size,最后在用数组拷贝复制到一个精确大小的byte数组中int size = bmp.getWidth() * bmp.getHeight() ;/// 8 + 1000;byte[] tmp = new byte[size];int k = 0;// 设置行距为0tmp[k++] = 0x1B;tmp[k++] = 0x33;tmp[k++] = 0x00;// 居中打印tmp[k++] = 0x1B;tmp[k++] = 0x61;tmp[k++] = 1;for (int j = 0; j < bmp.getHeight() / 24f; j++) {//-------------tmp[k++] = 0x1B;//设置水平绝对位置tmp[k++] = 0x24;tmp[k++] = (byte)0x96;
//            tmp[k++] = (byte)0x0c;tmp[k++] = 0x01;//-------------tmp[k++] = 0x1B;tmp[k++] = 0x2A;// 0x1B 2A 表示图片打印指令tmp[k++] = 33; // m=33时,选择24点密度打印tmp[k++] = (byte) (bmp.getWidth() % 256); // nLtmp[k++] = (byte) (bmp.getWidth() / 256); // nHfor (int i = 0; i < bmp.getWidth(); i++) {for (int m = 0; m < 3; m++) {for (int n = 0; n < 8; n++) {byte b = px2Byte(i, j * 24 + m * 8 + n, bmp);tmp[k] += tmp[k] + b;}k++;}}//tmp[k++] = 10;// 换行tmp[k++] = 0x1B;tmp[k++] = 0x4A;tmp[k++] = 0x18;tmp[k++] = 0x0D;}// 恢复默认行距tmp[k++] = 0x1B;tmp[k++] = 0x32;byte[] result = new byte[k];System.arraycopy(tmp, 0, result, 0, k);return result;
}public void test(){write(RESET); write(PAPER_UNIT);//定义单位write(PAPER_LENGHT_1);//设置页长printBitmap(bitmap);write(OUT,over);
}

Android在针式打印机上通过ESC/P指令打印二维码相关推荐

  1. PHP调用ZPL斑马指令 打印二维码标签

    ZPL是斑马条码打印机的编程指令.恰巧有个项目要用到,打印机是得实DP-230 无线便携打印机, 虽然不是斑马的,但支持ZPL II指令,首先设置好打印机,设置IP地址及端口,仿真模式选ZPLII. ...

  2. 对#Hello,2015征文#+Android 热敏打印机打印二维码(图片)博客的尝试

    原博客链接 #Hello,2015征文#+Android 热敏打印机打印二维码 昨天晚上说抽时间来写一篇关于Android 热敏打印机打印二维码和图片的文章,所幸在下班之前把它给写了,和大家分享吧.我 ...

  3. Android打印二维码对热敏打印机的适配

    经过一段时间的研究,目前得出了Android连接蓝牙打印机打印二维码的方式有2种: 第一种:采用ESC/POS二维码指令打印的方式打印,代码如下 /*** 设置二维码大小*/public static ...

  4. Android 热敏打印机打印二维码(转载)

    一.打印机的型号 RP-POS80S或RP-POS80P或RP-POS80CS或RP-POS80CP打印机 高速热敏打印机 打印方式:直接热敏打印 打印密度:640点/行 打印纸宽:80mm 有效打印 ...

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

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

  6. Android Zxing3.3.2扫描、生成、解析二维码,以及近距离无法识别的问题

    Zxing目前最新版本3.3.2,打开摄像头就成功了,真正的极速扫描,效果喜人. 一.集成流程 1.克隆代码就不说了. 2.zxing项目巨大,我们只需要扫描部分的代码. 将android.andro ...

  7. Android 基于google Zxing实现对手机中的二维码进行扫描

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 我之前写了一篇关于google Zxing扫描二维码的文章,效果是仿微信 ...

  8. android连接打印机打印二维码

    打印机打印出来的二维码是一张图,所以要得到img文件的图片流,不是文本流,下面是将流进行了转换: code: package org.fdcch.iotserver.persenter;import ...

  9. Android开源之行之走进zxing,轻松实现二维码扫描(二)

    对于Zxing开源项目的简化上文已给出,源码经过测试且不断修改.众所周知,Zxing项目的扫描是横向的,这么引用的用户体验确实不好:然而盲目的修改会出现拉伸以及样本采集的偏离.所以这里说一下如何将横屏 ...

最新文章

  1. 【廖雪峰python入门笔记】字符串_转义字符的使用
  2. 编译安装LNMP Centos 6.5 x64(6.6 x64) + Nginx1.6.0 + PHP5.5.13 + Mysql5.6.19
  3. sphinx配置 + php
  4. 程序员相比于黑客(Hacker),差距有多远?看看程序员怎么说!
  5. 详谈分布式系统缓存的设计细节
  6. mysql快速导入导出数据库_mysql快速导出与导入
  7. 关于heapsize heapgrowthlimit
  8. 对阵Flash 实战HTML 5技巧之页面设计
  9. mysql之 percona-xtrabackup 2.4.7安装(热备工具)
  10. Windows Server 2003 R2中的DFS复制与管理
  11. python3实现校园网认证客户端
  12. JSONArray.fromObject(str)
  13. android11代码关机
  14. 局域网打印机一键共享工具_AppStore今日推荐分享 支持局域网设备共享的抓包工具...
  15. 拟物设计和Angular的实现 - Material Design (持续更新)
  16. 提交网址到bing搜索引擎
  17. r语言绘制精美pcoa图_R数据可视化4: PCA和PCoA图
  18. 凤凰系统运行linux,在Deepin操作系统中安装凤凰系统(Phoenix OS)的方法
  19. 拓扑排序介绍及其应用
  20. H3C路由交换常用命令

热门文章

  1. Rust-WebAssembly 开发者布道师招聘
  2. 星加坡php开发_新加坡樟宜机场新地标-星耀樟宜 | 贝诺Benoy
  3. 打开Skype的时候提醒:TOM-Skype 已经停止工作,这是什么意思? 重装了一遍还是不能用。...
  4. 融360|简普科技《维度》报告:超过三成受访者遇过理财投资陷阱 90后受害最深
  5. TP框架中S函数使用方法
  6. php找爸爸,暖哭!萌娃外滩找爸爸:“他两天没回家”
  7. error: fatal error: no input files
  8. 浏览器主页被hao123等篡改解决方法
  9. php ubound,VBA UBound()函数
  10. JavaScript中ubound函数