在iOS app中链接蓝牙打印机打印商品小票,在没有电脑只有手机的状况下,感受很是实用,并且最近常常最近公司正好也在作这个功能,因此就研究了下。这一篇主要讲一下打印机的一些命令,以便下一篇文章中使用。\html
在蓝牙打印中,比较麻烦的不是搜索,链接蓝牙设备,而是小票的排版。而要弄出好看的小票排版,就得先熟知蓝牙打印机的各类命令。我是在demo基本完成以后,才找到了详细的命令表,若是我先搜索到这份较详细的命令的话,确定会节省很多时间。如今写出来,但愿能帮助其余在作这个功能的人。git
其实每一个品牌的打印机,在官网的下载里都有完整的打印机指令文档,记得去下载哦。
github
打印机分了不少型号,不一样的打印机所使用的指令集可能不一样,好比Star打印机和Epson打印机,他们的所使用的指令集就不太同样。这里有篇文章,有几个经常使用的指令对比: 这是地址数组
我就只记录一种命令集:ESC/POS打印命令集。而通常的打印机支持三种格式:ASCII、十进制、十六进制。bash
这里有一份PDF文件说明了各个命令的做用和对应的三种格式:地址app
表中都是用ASCII码格式,不要急,下面会介绍每个命令的十进制和十六进制格式和说明。 测试
等会每一个命令会按照以下格式贴出: ui
打印命令有两种: 编码
说明: 对齐方式有两种,对应的十六进制 {0x1B,0x61,0x00}、{0x1B,0x61,0x01}、{0x1B,0x61,0x02} 或者 {0x1B,0x61,0x30}、{0x1B,0x61,0x31}、{0x1B,0x61,0x32}。url
以上是我找到的比较完整的命令集合说明,但愿能帮到他人。
这里有其余简友伊布林
提供的另外一份打印机指令集的文档地址: 打印机指令集文档
这里有我最初用最原始的指令集拼接出来的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!