uni-app 使用蓝牙打印机ESC/POS指令基础方法

最近项目使用uniapp的框架,发布Android APP,业务连接蓝牙打印机,参考网上的资料,写的都不错,使用借鉴了一个博主的内容,打印后发现打印结果格式控制不对。
由于测试的打印机,没有说明,后来查找资料,找到了生产厂家的信息:兼容ESC/POS指令集, 更多字符样式设置指令。那么问题在于解决打印指令。

打印指令

可以找到很多说明的资料
打印指令,又称打印控制命令。计算机通过打印控制语言,以软件命令的方法来控制打印机操作,解释执行打印数据,获得打印结果的。对于打印机所实现的复杂功能而言,打印控制语言是基础。它直接关系到打印输入质量的优劣。因为增强我们对打印机控制语言的了解,就可以更好地选择和使用打印机。
目前主流的打印机控制语言只要有三种:
1.Epson公司的ESC命令集(普通打印机)
2.HP公司的PCL命令集
3.Adobe公司的PostScript(简称PS)命令集
其它:CPCL命令集(移动打印机), TSPL命令集(标签打印机)
普通打印机都是ESC指令集
标签打印机这种是TSPL指令集
移动打印机CPCL打印语言
还有其它打印机厂商自己开发的打印机语言许。多厂商都使用自己的打印机控制语言,如EPSON的ESC/page,佳能的CaPSYL,施乐的XES、JDL,IBM的IPDS,DEC的ANSI/Sixel等,它们都各具特点,

好吧,是指令问题。那么怎么使用ESC/POS指令??
很容易就能找到ESC/POS指令内容,但是怎么用呢?原生Android 使用java的有,好像都没有任何uniapp中使用说明。。。

看了代码,其实就是如何组合成命令格式文件,发送给打印机,找了能找的资料,逐个分析,有些是封装了引用,但是没有代码可以看,突然发现一个暴露出来的方法,是不是可以转换自己的,测试了,总算是可以使用了,最基本的ESC/POS指令,组合自己的业务,拼装后给打印机,成功了。

Esc指令工具代码

EscPosUtil.js

//字符串转字节序列
function stringToByte(str) {  var bytes = new Array();  var len, c;  len = str.length;  for(var i = 0; i < len; i++) {  c = str.charCodeAt(i);  if(c >= 0x010000 && c <= 0x10FFFF) {  bytes.push(((c >> 18) & 0x07) | 0xF0);  bytes.push(((c >> 12) & 0x3F) | 0x80);  bytes.push(((c >> 6) & 0x3F) | 0x80);  bytes.push((c & 0x3F) | 0x80);  } else if(c >= 0x000800 && c <= 0x00FFFF) {  bytes.push(((c >> 12) & 0x0F) | 0xE0);  bytes.push(((c >> 6) & 0x3F) | 0x80);  bytes.push((c & 0x3F) | 0x80);  } else if(c >= 0x000080 && c <= 0x0007FF) {  bytes.push(((c >> 6) & 0x1F) | 0xC0);  bytes.push((c & 0x3F) | 0x80);  } else {  bytes.push(c & 0xFF);  }  }  return bytes;
}  //字节序列转ASCII码
//[0x24, 0x26, 0x28, 0x2A] ==> "$&C*"function byteToString(arr) {  if(typeof arr === 'string') {  return arr;}  var str = '',  _arr = arr;  for(var i = 0; i < _arr.length; i++) {  var one = _arr[i].toString(2),  v = one.match(/^1+?(?=0)/);  if(v && one.length == 8) {  var bytesLength = v[0].length;  var store = _arr[i].toString(2).slice(7 - bytesLength);  for(var st = 1; st < bytesLength; st++) {  store += _arr[st + i].toString(2).slice(2);  }  str += String.fromCharCode(parseInt(store, 2));  i += bytesLength - 1;  } else {  str += String.fromCharCode(_arr[i]);  }  }  return str;
}
//居中
function Center() {var Center = [];Center.push(27);Center.push(97);Center.push(1);var strCenter = byteToString(Center);return strCenter;
}//居左
function Left() {var Left = [];Left.push(27);Left.push(97);Left.push(48);var strLeft = byteToString(Left);return strLeft;
}
//标准字体
function Size1() {var Size1 = [];Size1.push(29);Size1.push(33);Size1.push(0);var strSize1 = byteToString(Size1);return strSize1;
}
//大号字体
function Size2(n) {var Size2 = [];Size2.push(29);Size2.push(33);Size2.push(n);var strSize2 = byteToString(Size2);return strSize2;
}module.exports = {Center:Center,Left:Left,Size1:Size1,Size2:Size2,byteToString:byteToString,stringToByte:stringToByte,
}

使用了js byte[] 和string 相互转换的方法,返回是字符串 形式的内容,提供拼接打印内容。

指令的使用

ESC/POS 控制指令,很容易就能找到,例如
https://www.cnblogs.com/mafeng/p/6292024.html
结合代码和控制指令,来学习下使用。
以ESC a n 选择字符对齐模式例:

代码对应的内容

//居中
function Center() {var Center = [];Center.push(27);Center.push(97);Center.push(1);var strCenter = byteToString(Center);return strCenter;
}//居左
function Left() {var Left = [];Left.push(27);Left.push(97);Left.push(48);var strLeft = byteToString(Left);return strLeft;
}

可以看到 使用了十进制的数据

第三个n值,决定了 对齐方式

通过该例子,就能理解,指令的使用参数值赋值的方法
居中 27 97 1, 靠左 27 97 0
按照这个思路,看下字体的设置

29 33 0 基础字体大小,
29 33 n 根据n值变化大小
至于打印的效果,根据业务需要自己配置命令了。这几个基础的命名,满足了基础的使用。

拼接指令使用

import ExcPostUtil from '../../utils/EscPosUtil.js';
//打印内容
printInfo(){return new Promise((resolve,reject)=>{var strCenter = ExcPostUtil.Center();var strLeft = ExcPostUtil.Left();var strSize1 = ExcPostUtil.Size1();var strSize2 = ExcPostUtil.Size2(16);let nowdate = utildate.formatTimeaAll(new Date());console.log("nowdate="+nowdate)let strCmd = strLeft + strSize2 + this.shopName +  "\n";                    strCmd += strSize1 + "订单号:" + this.orderSN + "\n";strCmd += `--------------`+ "\n"+ "\n";this.shopcar.forEach(e=>{strCmd += strSize2 + `商品:${e.cainame}`+ "\n";strCmd += `数量:    ${e.num} `+ "\n";strCmd += `价格:${e.price}X${e.num}=${e.price*e.num}元`+ "\n";strCmd += `--------------`+ "\n"+ "\n";})              strCmd +=strSize1 +'合计:      256元' + "\n";strCmd +='时间: '+ nowdate + "\n";                    strCmd += strCenter + this.omessage+ "\n";    strCmd += "\n";strCmd += "\n";resolve(strCmd);                  }).then((strCmd) => {this.bufferData = strCmd;console.log(this.bufferData)                 }).catch(error => {console.log('Error', error);})},

把bufferData 送给打印机就可以打印了
注意指令要放到每行的 第一个位置。

打印结果

以上可以使用基本的字体控制、位置控制,满足了基础要求。
原理能知道了,其它的内容 大家可以根据需要自己去测试实现了。

uni-app 使用蓝牙打印机ESC/POS指令基础方法相关推荐

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

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

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

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

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

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

  4. C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)

     C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机 支持并口,串口,网口,USB口,驱动方式等多种端口 支持开关钱箱 ...

  5. c# 中崎_C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)...

    C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机) 收藏 C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持 ...

  6. 基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机

    C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机 支持并口,串口,网口,USB口,驱动方式等多种端口 支持开关钱箱 支 ...

  7. Android 打印机----》使用android串口以及ESC/POS指令进行小票打印

    开发环境 Android studio 3.5.1 gradle版本3.5.1 android 编译版本 28 jdk1.8 win7 开发准备 对android 串口通信有一定了解 对ESC/POS ...

  8. 前端小票打印、网页打印(uniapp、小程序、ESC/POS指令)

    由于我在做项目期间遇到各种各样的打印,于是想写一篇文章来总结一下我遇到的打印需求以及解决方案.总的来说,目前我遇到的打印需求可以分为两类,网页打印和小票打印,在实现过程中,又可以分为前后端分别来实现, ...

  9. app连接蓝牙打印机实现打印并排版

    做项目的时候遇到需要连接打印机打印小票的情况,因为从未接触过这方面的东西,就在网上下载了一个demo,demo地址:http://blog.csdn.net/reality_jie_blog/arti ...

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

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

最新文章

  1. C++_类和结构体所占内存大小,静态成员问题
  2. python小数输出01_python:格式化输出(上)
  3. java 2类与对象[学堂在线]
  4. php java 架构_JAVA和PHP到底谁才是老大?
  5. gitlab 安装gitlabrunner 无法连接tiller_谈一谈GitLab Runner是个什么东东?
  6. Tensorflow c api
  7. 梁胜:做开源项目的贡献者没有意义 | 人物志
  8. Linux文本加密方法,Linux命令行文本加密的小技巧
  9. 申请退款微信php,三:申请退款
  10. webform CustomValidator
  11. 基于SSM的商旅系统
  12. Django文件上传与下载
  13. matlab实现zca去白化,白化算法
  14. java 转换成大写_java实现将数字转换成人民币大写
  15. 很短,很文艺,很唯美的英语美句
  16. halcon第七讲:基于训练学习的颜色检测
  17. c语言程序设计1253,1253c语言程序设计a(2010年1月)
  18. PDF删除水印怎么在PDF编辑软件内执行
  19. 火箭军计算机网络技术就业方向,计算机系统结构专业就业方向
  20. 和吴昊一起玩推理(第二季首映式)Round 11 —— 从无有到无穷

热门文章

  1. python再议装饰器
  2. ABP默认表结构解析
  3. linux下nohup后台运行RSSHub等nodejs项目,开启与关闭
  4. Final Cut Pro X无法导入自家的MOV格式,解决方法。
  5. 如何配置服务器的内网IP以及MTU
  6. 在计算机基础这门课程中可以学到什么,计算机基础个人总结
  7. winpe读取linux硬盘数据恢复,如何在WinPE环境下完成文件恢复
  8. php网站设计国内外研究状况,毕业论文中的国内外研究现状怎么写啊
  9. 操作性定义(Operational Definition)
  10. 程序员这高薪岗位只有计算机专业的能做?