android 控制POS机图文打印(二)
上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的
这一篇正式介绍如何使用POS机来打印图文信息。
首先介绍一下,ESC/POS指令是如何使用的,
字体加粗指令:
byte[] FONT_B =new byte[3];
FONT_B[0] = 27;
FONT_B[1] = 33;
FONT_B[2] = 8;
字体纵向放大一倍:
byte[] CLEAR_FONT =new byte[3];
CLEAR_FONT[0] = 0x1c;
CLEAR_FONT[1] = 0x21;
CLEAR_FONT[2] = 0;
清除字体放大指令:
byte[] FD_FONT =new byte[3];
FD_FONT[0] = 0x1c;
FD_FONT[1] = 0x21;
FD_FONT[2] = 4;
打印条形码指令:
byte[] PRINT_CODE =new byte[9];
PRINT_CODE[0] = 0x1d;
PRINT_CODE[1] = 0x68;
PRINT_CODE[2] = 120;
PRINT_CODE[3] = 0x1d;
PRINT_CODE[4] = 0x48;
PRINT_CODE[5] = 0x10;
PRINT_CODE[6] = 0x1d;
PRINT_CODE[7] = 0x6B;
PRINT_CODE[8] = 0x02;
等等的指令使用。。。
可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。
接下来是介绍如何连接到打印机。
private static StringPRINT_IP = "192.168.1.111";// 打印机IP地址
private staticint PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的
这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。
然后就通过socket进行连接打印机
// 建立打印机连接
socket = new Socket();
InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机
socket.connect(iSocketAddress);// 建立连接
接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。
直接上代码了,代码里面的注释得非常清楚
[java] view plaincopy
- /**
- * @param PRINT_DATA
- * 小票主要数据
- * @param GS_INFO
- * 小票附带信息
- * @param CAIDAN_SN
- * 小票号码
- */
- public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {
- if (PRINT_DATA != null && PRINT_DATA.size() > 0) {
- try {
- // 条码打印指令
- byte[] PRINT_CODE = new byte[9];
- PRINT_CODE[0] = 0x1d;
- PRINT_CODE[1] = 0x68;
- PRINT_CODE[2] = 120;
- PRINT_CODE[3] = 0x1d;
- PRINT_CODE[4] = 0x48;
- PRINT_CODE[5] = 0x10;
- PRINT_CODE[6] = 0x1d;
- PRINT_CODE[7] = 0x6B;
- PRINT_CODE[8] = 0x02;
- // 清除字体放大指令
- byte[] FD_FONT = new byte[3];
- FD_FONT[0] = 0x1c;
- FD_FONT[1] = 0x21;
- FD_FONT[2] = 4;
- // 字体加粗指令
- byte[] FONT_B = new byte[3];
- FONT_B[0] = 27;
- FONT_B[1] = 33;
- FONT_B[2] = 8;
- // 字体纵向放大一倍
- byte[] CLEAR_FONT = new byte[3];
- CLEAR_FONT[0] = 0x1c;
- CLEAR_FONT[1] = 0x21;
- CLEAR_FONT[2] = 0;
- // 计算合计金额
- int price = 0;
- // 初始化打印机
- socketOut.write(27);
- socketOut.write(64);
- socketOut.write(FD_FONT);// 字体放大
- socketOut.write(FONT_B);// 字体加粗
- socketOut.write(10);
- writer.write(" " + GS_INFO.get("GS_Name") + " \r\n");
- writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效
- socketOut.write(CLEAR_FONT);
- socketOut.write(10);
- writer.write("NO: " + CAIDAN_SN + " \r\n");
- writer.write("------------------------------\r\n");
- writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");
- writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");
- writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");
- writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");
- writer.write("------------------------------\r\n");
- writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)
- + Fix_String_Lenth(0,Colum_Name[1], 14)
- + Fix_String_Lenth(1,Colum_Name[2], 4)
- + Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");
- for (int i = 0; i < PRINT_DATA.size() - 1; i++) {
- writer.write(Fix_String_Lenth(1,i + 1 + "", 2)
- + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)
- + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)
- + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");
- price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());
- }
- // 打印二维码
- Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");
- byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
- socketOut.write(data);
- data[0] = (byte)0x00;
- data[1] = (byte)0x00;
- data[2] = (byte)0x00; //重置参数
- int pixelColor;
- // ESC * m nL nH 点阵图
- byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };
- escBmp[2] = (byte)0x21;
- //nL, nH
- escBmp[3] = (byte)(bmp.getWidth() % 256);
- escBmp[4] = (byte)(bmp.getWidth() / 256);
- // 每行进行打印
- for (int i = 0; i < bmp.getHeight() / 24 + 1; i++){
- socketOut.write(escBmp);
- for (int j = 0; j < bmp.getWidth(); j++){
- for (int k = 0; k < 24; k++){
- if (((i * 24) + k) < bmp.getHeight()){
- pixelColor = bmp.getPixel(j, (i * 24) + k);
- if (pixelColor != -1){
- data[k / 8] += (byte)(128 >> (k % 8));
- }
- }
- }
- socketOut.write(data);
- // 重置参数
- data[0] = (byte)0x00;
- data[1] = (byte)0x00;
- data[2] = (byte)0x00;
- }
- //换行
- byte[] byte_send1 = new byte[2];
- byte_send1[0] = 0x0d;
- byte_send1[1] = 0x0a;
- socketOut.write(byte_send1);
- }
- //换行
- byte[] byte_send2 = new byte[2];
- byte_send2[0] = 0x0d;
- byte_send2[1] = 0x0a;
- //发送测试信息
- socketOut.write(byte_send2);
- writer.write("------------------------------\r\n");
- writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");
- writer.write("------------------------------\r\n");
- writer.write(" 谢 谢 惠 顾\r\n");
- // 下面指令为打印完成后自动走纸
- writer.write(27);
- writer.write(100);
- writer.write(4);
- writer.write(10);
- writer.close();
- socketOut.close();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。
然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如
[java] view plaincopy
- new Thread() {
- <span style="white-space:pre"> </span>public void run() {
- <span style="white-space:pre"> </span>try {
- <span style="white-space:pre"> </span>new PrintLine().print(lists, mapgs, sn);
- <span style="white-space:pre"> </span>} catch (IOException e) {
- <span style="white-space:pre"> </span>e.printStackTrace();
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>};
- }.start();
其实android调用po
android 控制POS机图文打印(二)的更多相关文章
- (JavaScript) JS方式调用POS机蓝牙打印
function print(mac_address) { if (!mac_address) { mui.toast('请选择蓝牙打印机'); return; } main = plus.andro ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- 安卓四核PDA手持PDA智能POS机 打印二维码 分享
很多项目都会用到 类似的要求 移动手持终端 通过程序 可以生成条码或二维码 打印出小票或标签纸 下面直接上代码 希望对大家有点用处 private void print(){ csys.setTex ...
- 手持PDA智能条码扫描RFID打印POS机
手持PDA智能条码扫描RFID打印POS机 一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...
- 【转】C#使用ESC指令控制POS打印机打印小票
.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...
- C#使用ESC指令控制POS打印机打印小票
1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...
- 手持终端打印POS机(安装移动销售开单订货会软件)无线传输到订货会后台销售管理系统
当今的服装市场是品牌竞争时代,产品能否紧随潮流前线并迅速推出市场抢得先机,是品牌成功与否的关键.而订货会是每个鞋服企业新产品走向市场至关重要的开端,订货会如何演绎.成功与否,与品牌在竞争洪流中的命运息 ...
- PDA手持终端集成一体打印 二次开发
PDA手持终端集成一体打印 二次开发支持 VS2008或VS2005开发工具 c#或C++开发语言 Mobile6.5,支持GSM通话,GPRS,EDGE网络;内置wifi,蓝牙,gps商场单品管理小 ...
- 使用FastReport打印二维码
简单介绍一下该功能所在的项目背景:C#语言编写的WPF客户端应用程序,在“结账”模块中,打印出的收款小票上需要显示一个二维码,服务生拿着小票去找顾客,顾客可以选择现金.银行卡等普通支付方式,也可以直接 ...
随机推荐
- web.xml 整合 SpringMVC
啦啦啦 <context-param> <param-name>defaultHtmlEscape</param-name> <param-value> ...
- photoshop制作简单ico图标
新建16 * 16透明画布 字体20px 半径4px
- itchat+pillow实现微信好友头像爬取和拼接
源码下载链接:https://pan.baidu.com/s/1cPZhwy 密码:2t2o ###效果图 使用方法: 下载项目到本地,打开项目主目录,打开命令行,输入: pip install -r ...
- Maven update project...后jdk变成1.5,update project后jdk版本改变
Maven update project...后jdk变成1.5,update project后jdk版本改变 ============================== 蕃薯耀 2018年3月14 ...
- MongoDB(六)-- 集群搭建
一.集群介绍 sharding通过将数据集分布于多个也称作分片(shard)的节点上来降低单节点的访问压力.每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上的完整意义的数据库.因此,分片 ...
- [Command] alias - 别名
alias 命令可以让用户使用预置的字符串来执行系统命令. 命令是指用户输入指令指示电脑完成工作.命令一般在命令行输入,以回车键完成输入.命令被传递给shell.shell是类Unix操作系统提供的纯 ...
- 怎样用Windows10全屏流畅运行红色警戒2
https://jingyan.baidu.com/article/9113f81b1cb7f22b3214c724.html jpg 转 rar
- Android textview及其子类
属性: android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all) andr ...
- 【转载】.NET 开发者必备的工具箱
本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...
- 【swagger学习】.net WebApi中使用swagger
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...