前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS Bluetooth 打印小票(一)

iOS Bluetooth 打印小票(一)

作者头像
Haley_Wong
发布2018-08-22 10:41:03
1.6K0
发布2018-08-22 10:41:03
举报

在iOS app中连接蓝牙打印机打印商品小票,在没有电脑只有手机的情况下,感觉非常实用,而且最近经常最近公司正好也在做这个功能,所以就研究了下。这一篇主要讲一下打印机的一些命令,以便下一篇文章中使用。

蓝牙打印机命令

在蓝牙打印中,比较麻烦的不是搜索,连接蓝牙设备,而是小票的排版。而要弄出好看的小票排版,就得先熟知蓝牙打印机的各种命令。我是在demo基本完成之后,才找到了详细的命令表,如果我先搜索到这份较详细的命令的话,肯定会节省不少时间。现在写出来,希望能帮助其他在做这个功能的人。 其实每个品牌的打印机,在官网的下载里都有完整的打印机指令文档,记得去下载哦。

打印机分了很多型号,不同的打印机所使用的指令集可能不同,比如Star打印机和Epson打印机,他们的所使用的指令集就不太一样。这里有篇文章,有几个常用的指令对比: 这是地址

我就只记录一种命令集:ESC/POS打印命令集。而一般的打印机支持三种格式:ASCII、十进制、十六进制。

这里有一份PDF文件说明了各个命令的作用和对应的三种格式:地址

打印命令一览表

表中都是用ASCII码格式,不要急,下面会介绍每一个命令的十进制和十六进制格式和说明。

一览表.png

打印的各个命令详解

等会每个命令会按照如下格式贴出:

说明.png

1.初始化命令

初始化命令.png

2.打印命令

打印命令有两种:

打印命令.png

3.行间距设置命令

行间距设置命令.png

4.对齐方式设置

对齐方式设置.png

说明: 对齐方式有两种,对应的十六进制 {0x1B,0x61,0x00}、{0x1B,0x61,0x01}、{0x1B,0x61,0x02} 或者 {0x1B,0x61,0x30}、{0x1B,0x61,0x31}、{0x1B,0x61,0x32}。

5.字符设置命令

字符设置命令1.png

字符设置命令2.png

字符设置命令3.png

字符设置命令4.png

6.钱箱控制命令

钱箱控制命令.png

7.按键控制命令

按键控制命令.png

8.图形打印命令

设定点图命令.png

打印下装点图.png

9.状态传输命令

向主机传送打印机状态.png

状态传输命令.png

10.条码打印命令

条码命令

条码打印

11.位置和页模式命令

位置和页模式命令1

位置和页模式命令2

位置和页模式命令3

12.切纸模式命令

切纸模式命令

以上是我找到的比较完整的命令集合说明,希望能帮到他人。

其他

这里有其他简友伊布林提供的另一份打印机指令集的文档地址: 打印机指令集文档

这里有我最初用最原始的指令集拼接出来的NSData代码片段,供大家参考:

// 打印机支持的文字编码
            NSLog(@"goodsArray:%@",goodsArray);
// 用到的goodsArray跟github中的商品数组是一样的。
            NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
            
            NSString *title = @"测试电商";
            NSString *str1 = @"测试电商服务中心(销售单)";
            NSString *line = @"- - - - - - - - - - - - - - - -";
            NSString *time = @"时间:2016-04-27 10:01:50";
            NSString *orderNum = @"订单编号:4000020160427100150";
            NSString *address = @"地址:深圳市南山区学府路东科技园店";
            
            //初始化打印机
            Byte initBytes[] = {0x1B,0x40};
            NSData *initData = [NSData dataWithBytes:initBytes length:sizeof(initBytes)];
            
            //换行
            Byte nextRowBytes[] = {0x0A};
            NSData *nextRowData = [NSData dataWithBytes:nextRowBytes length:sizeof(nextRowBytes)];
            
            //居中
            Byte centerBytes[] = {0x1B,0x61,1};
            NSData *centerData= [NSData dataWithBytes:centerBytes length:sizeof(centerBytes)];
            
            //居左
            Byte leftBytes[] = {0x1B,0x61,0};
            NSData *leftdata= [NSData dataWithBytes:leftBytes length:sizeof(leftBytes)];
            
            NSMutableData *mainData = [[NSMutableData alloc]init];
            
            //初始化打印机
            [mainData appendData:initData];
            //设置文字居中/居左
            [mainData appendData:centerData];
            [mainData appendData:[title dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:[str1 dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            
//            UIImage *qrImage =[MMQRCode createBarImageWithOrderStr:@"RN3456789012"];
//            UIImage *qrImage =[MMQRCode qrCodeWithString:@"http://www.sina.com" logoName:nil size:400];
//            qrImage = [self scaleCurrentImage:qrImage];
//            
//            NSData *data = [IGThermalSupport imageToThermalData:qrImage];
//            [mainData appendData:centerData];
//            [mainData appendData:data];
//            [mainData appendData:nextRowData];
            
            [mainData appendData:leftdata];
            [mainData appendData:[line dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:[time dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:[orderNum dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:[address dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            
            [mainData appendData:[line dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            NSString *name = @"商品";
            NSString *number = @"数量";
            NSString *price = @"单价";
            [mainData appendData:leftdata];
            [mainData appendData:[name dataUsingEncoding:enc]];
            
            Byte spaceBytes1[] = {0x1B, 0x24, 150 % 256, 0};
            NSData *spaceData1 = [NSData dataWithBytes:spaceBytes1 length:sizeof(spaceBytes1)];
            [mainData appendData:spaceData1];
            [mainData appendData:[number dataUsingEncoding:enc]];
            
            Byte spaceBytes2[] = {0x1B, 0x24, 300 % 256, 1};
            NSData *spaceData2 = [NSData dataWithBytes:spaceBytes2 length:sizeof(spaceBytes2)];
            [mainData appendData:spaceData2];
            [mainData appendData:[price dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            
            CGFloat total = 0.0;
            for (NSDictionary *dict in goodsArray) {
                [mainData appendData:[dict[@"name"] dataUsingEncoding:enc]];
                
                Byte spaceBytes1[] = {0x1B, 0x24, 150 % 256, 0};
                NSData *spaceData1 = [NSData dataWithBytes:spaceBytes1 length:sizeof(spaceBytes1)];
                [mainData appendData:spaceData1];
                [mainData appendData:[dict[@"amount"] dataUsingEncoding:enc]];
                
                Byte spaceBytes2[] = {0x1B, 0x24, 300 % 256, 1};
                NSData *spaceData2 = [NSData dataWithBytes:spaceBytes2 length:sizeof(spaceBytes2)];
                [mainData appendData:spaceData2];
                [mainData appendData:[dict[@"price"] dataUsingEncoding:enc]];
                [mainData appendData:nextRowData];
                
                total += [dict[@"price"] floatValue] * [dict[@"amount"] intValue];
            }
            
            [mainData appendData:[line dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:[@"总计:" dataUsingEncoding:enc]];
            Byte spaceBytes[] = {0x1B, 0x24, 300 % 256, 1};
            NSData *spaceData = [NSData dataWithBytes:spaceBytes length:sizeof(spaceBytes)];
            [mainData appendData:spaceData];
            NSString *totalStr = [NSString stringWithFormat:@"%.2f",total];
            [mainData appendData:[totalStr dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            
            [mainData appendData:[line dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            [mainData appendData:centerData];
            [mainData appendData:[@"谢谢惠顾,欢迎下次光临!" dataUsingEncoding:enc]];
            [mainData appendData:nextRowData];
            
            
            [self.peripheral writeValue:mainData forCharacteristic:self.chatacter type:CBCharacteristicWriteWithoutResponse];

打印没反应?

如果你连接成功,但是发出打印指令后,打印机没反应,很有可能是因为你的打印机一次发送的数据长度小于146,你把146改的更小一点试试看。 我测试的两台佳博打印机,一台没有长度限制,一台最多每次只能发送146个字节,否则会出现打印没反应的情况,需要重启打印机。 不同的打印机,可能对长度的限制不太一样,据群友反应有的打印机只能支持一次发送20个字节,所以你需要将宏里面的146改的更小一点。

Have Fun!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 蓝牙打印机命令
  • 打印命令一览表
  • 打印的各个命令详解
  • 1.初始化命令
  • 2.打印命令
  • 3.行间距设置命令
  • 4.对齐方式设置
  • 5.字符设置命令
  • 6.钱箱控制命令
  • 7.按键控制命令
  • 8.图形打印命令
  • 9.状态传输命令
  • 10.条码打印命令
  • 11.位置和页模式命令
  • 12.切纸模式命令
  • 其他
  • 打印没反应?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档