iOS Bluetooth 打印小票(一)

在iOS app中鏈接藍牙打印機打印商品小票,在沒有電腦只有手機的狀況下,感受很是實用,並且最近常常最近公司正好也在作這個功能,因此就研究了下。這一篇主要講一下打印機的一些命令,以便下一篇文章中使用。\html

藍牙打印機命令

在藍牙打印中,比較麻煩的不是搜索,鏈接藍牙設備,而是小票的排版。而要弄出好看的小票排版,就得先熟知藍牙打印機的各類命令。我是在demo基本完成以後,才找到了詳細的命令表,若是我先搜索到這份較詳細的命令的話,確定會節省很多時間。如今寫出來,但願能幫助其餘在作這個功能的人。git

其實每一個品牌的打印機,在官網的下載裏都有完整的打印機指令文檔,記得去下載哦。github

打印機分了不少型號,不一樣的打印機所使用的指令集可能不一樣,好比Star打印機和Epson打印機,他們的所使用的指令集就不太同樣。這裏有篇文章,有幾個經常使用的指令對比: 這是地址數組

我就只記錄一種命令集:ESC/POS打印命令集。而通常的打印機支持三種格式:ASCII、十進制、十六進制。bash

這裏有一份PDF文件說明了各個命令的做用和對應的三種格式:地址app

打印命令一覽表

表中都是用ASCII碼格式,不要急,下面會介紹每個命令的十進制和十六進制格式和說明。 測試

一覽表.png

打印的各個命令詳解

等會每一個命令會按照以下格式貼出: ui

說明.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}。url

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!

相關文章
相關標籤/搜索