研究了好几天的pos机打印,终于搞好了,在此做个笔记。第一次写博客 ,如有不对,望提出。

 由于pos机可打印多种类型图片,我打印的是光栅位图,另外pos机也可打印其他多种类型图片,在此只说明光栅位图的打印。
  
  给pos机传的都是16进制,所以以下指令都是16进制的字符串。
  先贴出我用到的打印机指令:
  
String MIDDLE="1B 61 01"; //居中
String LEFT="1B 61 00";  //靠左
String LINE="0A";  //换行

居中、靠左、换行这几个指令对于文本和图片都是可用的

下面是打印光栅位图的指令:

String i1 = "1D";
String i2 = "76";
String i3 ="30";
String i4 ="00" ;
String xL;
String xH;
String yL;
String yH;

以上指令中:i4值可 根据需求制定:0普通模式,1倍宽模式,2倍高模式,3四倍大小

xL+xH*256=图片的宽/8

yL+yH*256=图片的高

为什么这里宽要除8呢?

一个像素点需要把自己的信息传递给pos机,信息中1代表打印 0代表不打印,而1byte=8bit;一个像素点是一个byte; 需要用8位二进制传递信息,传给打印机的时候8位二进制会转成高位和低位的十六进制.

对于这个的理解我也不是很透彻,还不太理解的自行百度.

有了以上指令就可以pos机打印啦 直接贴代码

打印文本:

StringBuffer sb=new StringBuffer();

sb.append(MIDDLE).append(title).append(LINE).append(LEFT).append(name).append(LINE).append(time).append(LINE).append(money).append(LINE);

以上代码居中命令在需要居中的文本之前调用,靠左只需调用一次,pos机默认靠左, title,name,time,money是需要打印的信息 这些信息也是需要转成十六进制滴

文本信息转十六进制代码:

/**
 * 字符串转换为16进制字符
 */

public  static String str2HexStr(String str){char[] chars = "0123456789ABCDEF".toCharArray();
    StringBuilder sb = new StringBuilder("");
    byte[] bs = new byte[0];
    try {bs = str.getBytes("GBK");
    } catch (UnsupportedEncodingException e) {e.printStackTrace();
    }int bit;

    for (int i = 0; i < bs.length; i++){bit = (bs[i] & 0x0f0) >> 4;
        sb.append(chars[bit]);
        bit = bs[i] & 0x0f;
        sb.append(chars[bit]);
        sb.append(' ');
    }return sb.toString().trim();
}

通过以上就拿到文本的16进制字符串,当然打印机需要的是16进制字节, 16进制字符串转16进制byte数组代码在文章最后

打印图片:

//打印机打印图片指令  xl+xh*256=宽 yl+yh*256=高
int width= bitmap.getWidth()/8;
int height=bitmap.getHeight();

int   xl=width%256;  //低位取余 高位取商
int   xh=width/256;

int   yl=height%256;
int   yh=height/256;

xl,xh,yl,yh在这里还是十进制的 需要转成十六进制, 十进制转十六进制代码:

//10进制转16进制
public static String IntToHex(int n){char[] ch = new char[20];
        int nIndex = 0;
        while ( true ){int m = n/16;
                int k = n%16;
                if ( k == 15 )ch[nIndex] = 'F';
                else if ( k == 14 )ch[nIndex] = 'E';
                else if ( k == 13 )ch[nIndex] = 'D';
                else if ( k == 12 )ch[nIndex] = 'C';
               else if ( k == 11 )ch[nIndex] = 'B';
                else if ( k == 10 )ch[nIndex] = 'A';
                else
                    ch[nIndex] = (char)('0' + k);
               nIndex++;
                if ( m == 0 )break;
                n = m;
            }StringBuffer sb = new StringBuffer();
        sb.append(ch, 0, nIndex);
        sb.reverse();
        String result=sb.toString();
    if(result.length()==1){result="0"+result;
    }return result;
    }

现在打印图片的头指令有了,后面再加上图片的数据就可以了  图片转byte :

   public static byte[] sendBWImage(Bitmap img, Context ctx) {int width = img.getWidth();         //获取位图的宽
        int height = img.getHeight();       //获取位图的高

        int[] pixels = new int[width * height]; //通过位图的大小创建像素点数组
        img.getPixels(pixels, 0, width, 0, 0, width, height);
        int[] gray=new int[height*width];

        for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {int grey = pixels[width * i + j];
                int red = ((grey  & 0x00FF0000 ) >> 16);
                gray[width*i+j]=red;

            }}//551
        int e=0;
        int byteLen = width/8;
        byte[] result=new byte[byteLen*height];
        int k=0;
        for (int i = 0; i < height; i++) {byte[] bt = new byte[byteLen];
            for (int j = 0; j < width; j++) {int g=gray[width*i+j];
                int byteIndex = j/8;
                int bitIndex = j%8;
                if (g>=128) {pixels[width*i+j]=0xffffffff;
                    e=g-255;
                }else {pixels[width*i+j]=0xff000000;
                    if(j < byteLen*8){bt[byteIndex] += 1<<(7-bitIndex);
                    }e=g-0;
                }if (j<width-1&&i<height-1) {//右边像素处理
                    gray[width*i+j+1]+=3*e/8; //下
                    gray[width*(i+1)+j]+=3*e/8;//右下
                    gray[width*(i+1)+j+1]+=e/4;
                }else if (j==width-1&&i<height-1) {//靠右或靠下边s的像素的情况
                    //下方像素处理
                    gray[width*(i+1)+j]+=3*e/8;
                }else if (j<width-1&&i==height-1) {//右边像素处理
                    gray[width*(i)+j+1]+=e/4;
                }}for(int m=0;m<bt.length;m++){result[k++]=bt[m];
            }}Bitmap mBitmap=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        mBitmap.setPixels(pixels, 0, width, 0, 0, width, height);
//        ImageUtils.saveMyBitmap("0001", mBitmap);

        return result;
    }

现在头指令和图片数据都有了 怎么把String类型的16进制和byte类型的结合在一起呢?

16进制字符串转byte数组代码:

/**
 * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" –> byte[]{0x2B, 0×44, 0xEF,
 * 0xD9}
 *
 * @param src
 *            String
 * @return byte[]
 */
public static byte[] HexString2Bytes(String src) {if (null == src || 0 == src.length()) {return null;
    }byte[] ret = new byte[src.length() / 2];
    byte[] tmp = src.getBytes();
    for (int i = 0; i < (tmp.length / 2); i++) {ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
    }return ret;
}
/**
 * 将两个ASCII字符合成一个字节; 如:"EF"–> 0xEF
 *
 * @param src0
 *            byte
 * @param src1
 *            byte
 * @return byte
 */
public static byte uniteBytes(byte src0, byte src1) {byte _b0 = Byte.decode("0x" + new String(new byte[] {src0})).byteValue();
    _b0 = (byte) (_b0 << 4);
    byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
    byte ret = (byte) (_b0 ^ _b1);
    return ret;
}

把16进制字节发给打印机就ok了.

第一次写博客 排版可能不太好  望谅解 有不对的地方多谢指出.

android pos机打印相关推荐

  1. Pos机打印空格问题

    遇到pos机打印小票的需求,接了pos机厂商的的设备sdk,在看打印api时发现打印左边是标题,右边是值的时候发现一行内设置了标题左对齐值右对齐没生效,全部右对齐了,问了客服说要计算打印样式的一行的文 ...

  2. android pos机对接微信刷脸支付时如何做到双屏异显-2020年10月9日

    --------------------越让你感到困难的东西其实内在越简单. 对接微信支付刷脸支付时出现的问题,因为我这边使用的是大屏的双屏异显的pos机,在做第二个屏幕显示的时候我使用的是prese ...

  3. Canvas画POS机打印小票图片,打印机直接打印图片

    之前做了个pos机的项目,当时因为是给缅甸客户用的,界面用的是缅甸文,但是打印机不支持缅甸文,所以只能以打印图片的方式实现:所以利用canvas直接画小票图片,直接打印图片实现打印功能:下面是利用ca ...

  4. PDA手持无线POS机,打印条形码小票凭条系统案例

    做类似PDA方面的项目倒也多了,像PDA打印条形码的终端设备还是比普通的PDA先进了一点,其实也简单,就是一个简单的PDA主机集成其他的行业应用模块 比如热敏微型打印机,激光扫描器,以及RFID非接触 ...

  5. java web 打印pos小票_JS+调用word打印功能实现在Webfrom客户端pos机打印小票(58x210mm)...

    本文主要解决在web网页上通过点击某个按钮现实打印小票的功能.修改于2015.8.15. 页面html代码: 调用Word打印机打印 function doPrint() { viewToWord(& ...

  6. 安卓四核PDA手持PDA智能POS机 打印二维码 分享

    很多项目都会用到 类似的要求  移动手持终端 通过程序 可以生成条码或二维码 打印出小票或标签纸 下面直接上代码 希望对大家有点用处 private void print(){ csys.setTex ...

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

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

  8. 前往华虹下载POS机应用,回来又上传安装卡应用

    今天都做了什么. 上午我来到公司,接上U转串线运行InitTool工具,不料打开串口失败,之后就给罗总打电话过去.罗总说重新安装了下U转串驱动程序,果然就安装成功了.接下来我在COM4端口上连接POS ...

  9. pos机显示交易拨号失败服务器无响应,POS机常见故障解答

    POS机常见故障解答 现在POS机获取途径越来越多,在生活中越来越常见,那么POS机出现了问题我们该如何解决呢.南京POS机办理就为大家列出使用POS机时出现的常见问题! Pos机无法开机问题 1.检 ...

最新文章

  1. 慕课袁春风老师《计算机系统基础》一二三部分练习题
  2. 八个JS中你见过的类型。
  3. Boost:BOOST_VERIFY的用法测试程序
  4. JSON Web Tokens(JWT)
  5. javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现
  6. [Android]发布Sqlite数据库
  7. 【POJ2676】Sudoku(优化搜索顺序)
  8. 分布式锁--Redis实现
  9. python求立方尾不变_蓝桥杯—立方尾不变,有些数字的立方的末尾正好是该数字本身...
  10. TcpSocket的Qt串口实现与QtSocket接收数据不完整处理方法
  11. 干细胞科学家李陶博士入股机器人365
  12. 【git】git强制覆盖单个文件
  13. 【NLP】(task8)Transformers完成抽取式问答+多选问答任务(更新ing)
  14. python定量城市研究_Python定量城市研究实战
  15. vue 运行项目浏览器页面显示“该网页无法正常运作”
  16. 当RPA进化成IPA:开启人机协作新时代
  17. Idea中git进行回滚版本操作和查看修改记录
  18. Navicat安装教程和评测
  19. 7000 字 23 张图,Pandas 一键生成炫酷的动态交互式图表
  20. 第二届“红明谷”杯数据安全大赛-安全意识赛

热门文章

  1. 亚马逊防关联:资料安全你了解吗?
  2. 数据传输性能与安全不能兼顾?Rambus安全方案“动静”两相宜
  3. canvas-绘制背景
  4. 笔记本电脑+第二块显示屏如何双屏操作
  5. 计算机奖学金用英语怎么说,奖学金证书的翻译,三好学生荣誉证书,优秀学生干部荣誉证书的英语,英语四、六级和计算机证书,辅修证书的英语怎么说, 教学实践单项奖,社会实践单项奖用英语怎么说...
  6. python 脚本下载bilibili右上角表情包
  7. PIM SM RP控制原理与实验
  8. 虚幻行为树EQS(环境查询)
  9. Windows bat 编程基本语法
  10. 从PD充电器取9V12V给产品供电快充,PD取电芯片概述