在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!