最近项目需要,打印订单信息,携带二维码,并且要做二维码识别。打印机使用芯烨xp58系列的打印机,以前只打印文字,今天研究了一下他的栅格图像协议,实现了二维码打印,理论上打印二值化图像也是可以。

协议解析:

官方文档给的协议,描述有些太过地方不是很详细,整体协议是这样,16进制表示

1D 76 30 0 这4个字节,前3个是固定的,第4个0,表示正常模式200DPI,具体参考上图

xL xH 表示宽度,是字节数,等于图像的宽度/8,如果除不尽,增加一个,于是x=(width+7)/8。

xL是宽度的低位,xH是宽度高位,所以宽度=xh*256+xl

yL yH是高度,这个就等于图像高度,就是像素行数

总字节数=8(4个头,x,y)+x*y

另外:图最后特别强调了,每个字节的位,是从高到低排列。

实现思路:生成二维码,宽度最好是8的整数倍,然后遍历二维码,将黑色部分映射到字节数组某个位上,设置为1。

映射规则,p=8+y*n+x/8;//当前操作的是第几个字节,前面有8个头,每行n个,所以是y*n,当前行x/8,因为按bit算点,
 bit=7-x%8;//bit位置0-7,高位在前,低位在后

具体代码

/*** 对接芯烨xp58系列热敏打印机驱动* @author qujia**/
public class XPrinter58 {final static  byte[] cut=new byte[] {0x1D,0x56,0x42,0x00,0x0A,0x0A,0x00};//切纸命令final byte[] charwidth2=new byte[] {0x1C,0x57,0x01};//汉字宽度2倍final byte[] charwidth1=new byte[] {0x1C,0x57,0x02};//宽度默认final byte[] charsize2=new byte[] {0x1B,0x21,0x18};//字体变大加粗final byte[] charsize1=new byte[] {0x1B,0x21,0x01};//正常字体final byte[] alienLeft=new byte[] {0x1B,0x61,0x00};//左对齐final byte[] alienCenter=new byte[] {0x1B,0x61,0x01};//居中对齐final byte[] lineHeight=new byte[] {0x1B,0x33,0x4f};//行高指令/*** 打印机ip*/private String ip;/*** 链接客户端*/private Socket client;public XPrinter58(String ip) {this.ip=ip;       client=new Socket();}/*** 链接到打印机* @return*/private boolean connect()  {if(client.isConnected())return true;//已经链接了try {   client.connect(new InetSocketAddress("192.168.0.100" , 9100),1000);//链接打印机return client.isConnected();}catch (Exception e) {// TODO: handle exceptionreturn false;}}/*** 发送指令* @param dat*/private void sendData(byte [] dat) {try {if(connect()) {          client.getOutputStream().write(dat);//发送切纸指令Thread.sleep(20);}}catch (Exception e) {// TODO: handle exception}}/*** 切纸*/public void cut() {sendData(cut);try {client.close();}catch (Exception e) {// TODO: handle exception}}/*** 打印一般字符,小字符,\\r\\n换行* @param con*/public void printString(String con) {sendData(charsize1);//小字体sendData(alienLeft);//左对齐sendData(lineHeight);//行高加高sendData(charwidth1);//小宽度sendData(con.getBytes());//内容}/*** 打印标题,大号字符* @param title*/public void printTitle(String title) {sendData(charsize2);//大字体sendData(charwidth2);//大宽度sendData(alienCenter);//居中sendData(title.getBytes());//标题sendData(charsize1);//小字体sendData("\r\n  \r\n".getBytes());//增加一个空行}/*** 打印二维码* @param code* @param width* @param heigt*/public void printQrCode(String code,int width,int height) {sendData(alienCenter);//居中sendData(getQrCodeData(code,width,height));//打印二维码}/*** 产生二维码byte* @param con* @param width* @param height* @return*/private byte[] getQrCodeData(String con,int width,int height) {byte[] dat=null;Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 1);try {BitMatrix bts = new MultiFormatWriter().encode(con, BarcodeFormat.QR_CODE, width, width, hints);int n=(width+7)/8;//一行多少个字节,不足8个字节,补一个dat=new byte[8+n*height];//前8个字节是二维码打印头 1d 76 30 0 xL xH yL yHdat[0]=0x1d;dat[1]=0x76;dat[2]=0x30;dat[3]=0x0;//打印模式正常 200 dpidat[4]=(byte)(n&0x000000ff);//xL低位  dat[5]=(byte)((n>>8)&0x000000ff);//高位dat[6]=(byte)(height&0x000000ff);//xL低位  dat[7]=(byte)((height>>8)&0x000000ff);//高位//数据头准备完毕int p,bit;//当前字节位置和bit位置for (int y = 0; y < height; y++) {//循环行,y方向for (int x = 0; x < width; x++) {//循环列,x方向                  p=8+y*n+x/8;//当前操作的是第几个字节,前面有8个头,每行n个,所以是y*n,当前行x/8,因为按bit算点,bit=7-x%8;//bit位置0-7,高位在前,低位在后if (bts.get(x, y)) {//如果为true表示这个是一个黑色点,黑色点要打印dat[p]|=0x01<<bit;//给这个位设置成1} }}           } catch (WriterException e) {// TODO Auto-generated catch blocke.printStackTrace();}        return dat;}}

调用示例:

public class main {public static void main(String[] args) {String con="供应商:    乐乐\r\n订单号:123123123123\r\n提货单号:2324234234\r\n产品类别:10-16MM\r\n数量:70T\r\n单价:125¥\r\n车牌:豫C22312A\r\n卡号:AB23EDF323\r\n";XPrinter58 printer=new XPrinter58("192.168.0.100");printer.printTitle("中信自助装车系统");//标题printer.printString(con);//内存printer.printQrCode("CITIC202203150010", 256, 256);//打印二维码printer.cut();//切纸}}

java对接芯烨XP58系列打印机,网络驱动相关推荐

  1. 基于springboot对接芯烨云无线打印机(非云打印机)

    前言:最近公司产品经理提了一个无线打印的功能,看了一下打印机官网文档,花费几天时间,对接成功,在此先记录一下. 1 下载芯烨云开发包以测试工具(芯烨云官网) 2 配置芯烨云打印网口 选择自己购买的打印 ...

  2. 惠普打印信息页无法连接到服务器,惠普M400系列打印机网络连接无法打印怎么办?...

    M400系列打印机网络连接无法打印的排查方法.本文主要介绍以win7系统为例网络连接不能打印的简单排查思路.排查时主要从打印机.驱动.软件三个步骤来排查. 1.打印机的角度,我们需要先打印网络摘要,确 ...

  3. java对接丰海IF-KXB系列可变信息板

    项目场景: 对接丰海IF-KXB 系列led显示屏 问题描述: 把byte数组转成16进制字符串,通过网络调试工具测试可以上传显示信息.但是用代码跑就怎么都不通,一直卡在读取socket服务端返回信息 ...

  4. 惠普打印机网络驱动安装方法

       本文内容参考了这篇文章,在此基础上略有修改. &emps;  惠普打印机的驱动安装都挺麻烦的,要对应型号安装后才能正常使用,这里我给大家说说如何简单快速安装打印机驱动. 确定打印机ip ...

  5. 无线打印 打印服务器错误,HP LaserJet Pro 400 M401 系列打印机 - 网络连接打印时报错79 ERROR...

    1.查看打印机中是否安装了附加设备,例如:内存条,字库条等.将附加设备取下测试打印是否报错,是否由某个附加设备导致. 2.打印hp laserjet m401配置页,查看是否出现79ERROR报错. ...

  6. Linux 网络驱动实验(有线)

    目录 嵌入式网络简介 嵌入式下的网络硬件接口 MII/RMII 接口 MDIO 接口 RJ45 接口 I.MX6ULL ENET 接口简介 PHY 芯片详解 PHY 基础知识简介 LAN8720A 详 ...

  7. Linux 网络驱动-内核网络驱动框架(二)

    net_device 结构体 Linux 内核使用 net_device 结构体表示一个具体的网络设备,net_device 是整个网络驱动的 灵魂.网络驱动的核心就是初始化 net_device 结 ...

  8. linux内核网络驱动框架(linux驱动开发篇)

    网络驱动的核心: 1.就是初始化 net_device 结构体中的各个成员变量, 2.然后将初始化完成以后的 net_device 注册到 Linux 内核中 1.网络设备(用net_device结构 ...

  9. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  10. 芯烨网口打印机用安卓手机端修改IP

    安卓跨网段修改IP步骤 注:此工具只适用于支持跨网段修改IP芯烨网口打印机使用 第一步:打印机用网线连接到路由器上 第二步:安卓手机或者安卓收银机连接打印机所连接的路由器WiFi或有线 第三步:打印机 ...

最新文章

  1. Springboot集成websocket实例
  2. Android(四)——View和ViewGroup
  3. Cpp 11 / 线程库 / 可以做为线程的执行对象有哪些?
  4. php实现java socket_php与java通过socket通信的实现代码
  5. optional空值判断_Java 8 Optional不仅用于替换空值
  6. Jetty实战之 安装 运行 部署
  7. 聊聊2019年的web前端
  8. php 管理mysql数据库_php管理mysql数据库类
  9. Android - 返回上一个界面finish()方法
  10. 奇安信代码安全实验室帮助Red Hat修复多个QEMU高危漏洞,获官方致谢
  11. noip2011——普及组——瑞士轮
  12. HSP java坦克大战
  13. 读后感系列-2.《看见》柴静(二)
  14. opencv的学习与人脸情绪识别项目(一)
  15. 高通WLAN框架学习(36)-- ACS(Auto Channel Selection)自动信道选择
  16. 老域名及用户行为习惯.
  17. 本地主机Xshell连接虚拟机Linux CentOS7
  18. 神经网络是算法还是模型,神经元网络算法的思想
  19. 阿里2019社招内推!阿里云高级专家(P8)帮内推!投递简历邮箱看正文!
  20. C++11 std::thread-使用lambda表达式-GCC 4.9编译通过

热门文章

  1. linux安装moodle最新版,于linux已安装moodle
  2. 现代操作系统 第六章 死锁 习题答案
  3. nfs 跟rpcbind的关系
  4. html转换成avi,HTML_视频转换大师WinMPG Video Convert 6.63,支持格式丰富,可快速完成AVI(RM - phpStudy...
  5. 情人节--我们依旧单身(制作属于自己的QQ拼音皮肤)(带全部ps素材)
  6. OpenGL 编程指南 ( 原书第 9 版 ) --- 第一章
  7. 电力系统同步发电机励磁系统的建模与仿真
  8. 大象英语-电脑键盘练习工具儿童版(学英语、学电脑)
  9. 金蝶KIS 14.1 专业版安装教程
  10. 《初级会计电算化实用教程(金蝶KIS专业版)》一1.4 会计核算软件