在SaaS App中有很多地方需要通過(guò)連接藍(lán)牙打印機(jī)打印結(jié)算及訂單小票滞项,而且在結(jié)算的時(shí)候使用打印機(jī)的的頻率比較高轰异,這就需要保證藍(lán)牙的鏈接敦迄,同時(shí)支持各種類型的排版斧散,這篇文章主要是通過(guò)藍(lán)牙鏈接打印機(jī)通過(guò)排版和組合各種指令來(lái)進(jìn)行打印,過(guò)程比較繁瑣悼凑,所以做了一個(gè)匯總偿枕,以備后續(xù)查詢。
藍(lán)牙打印機(jī)命令
在藍(lán)牙打印過(guò)程中户辫,首先要保證藍(lán)牙鏈接的及時(shí)和穩(wěn)定性渐夸,其次比較麻煩的不是搜索、連接藍(lán)牙設(shè)備渔欢,而是小票的排版墓塌。要做出樣式整齊好看的小票排版,就得先熟知藍(lán)牙打印機(jī)的各種命令奥额。在查找資料后苫幢,收集到藍(lán)牙打印的命令表,每個(gè)品牌的打印機(jī)垫挨,一般在官網(wǎng)或者技術(shù)支持哪里可以找到打印機(jī)的操作和指令文檔态坦。
打印機(jī)分了很多型號(hào),不同的打印機(jī)所使用的指令集可能不同棒拂,比如Star打印機(jī)和Epson打印機(jī),他們的所使用的指令集就不太一樣。我們常用的一般是佳博熱敏打印機(jī)使用的是:ESC/POS打印命令集帚屉。而一般的打印機(jī)支持三種格式:ASCII谜诫、十進(jìn)制、十六進(jìn)制(一般使用十六進(jìn)制格式較多)攻旦。
這份PDF文件說(shuō)明了各個(gè)命令的作用和對(duì)應(yīng)的三種格式:打印命令集
打印命令一覽表
下表中都是用ASCII碼格式
命令詳解
下面會(huì)詳細(xì)的介紹每個(gè)每一個(gè)命令對(duì)應(yīng)的ASCII碼喻旷、十進(jìn)制和十六進(jìn)制格式
1、初始化命令
初始化或者重置
2牢屋、打印命令
打印命令有兩種
3且预、行間距設(shè)置
4、對(duì)齊設(shè)置
5烙无、對(duì)齊設(shè)置
6锋谐、錢(qián)箱控制命令
7、按鍵控制命令
8截酷、圖形打印命令
9涮拗、圖形打印命令
10、條碼打印命令
11迂苛、位置和頁(yè)模式命令
12三热、切紙模式
換行和制表符:
直接輸出對(duì)應(yīng)的字符:這兩個(gè)指令在打印訂單詳情的時(shí)候使用最多。尤其是制表符三幻,可以讓每一列的文字對(duì)齊就漾。
常用的打印機(jī)命令方法
/** 文字對(duì)齊方式 */
typedef NS_ENUM(NSInteger, LLTextAlignment) {
LLTextAlignmentLeft = 0x00,
LLTextAlignmentCenter = 0x01,
LLTextAlignmentRight = 0x02
};
/** 字號(hào) */
typedef NS_ENUM(NSInteger, LLFontSize) {
LLFontSizeTitleSmalle = 0x00,
LLFontSizeTitleMiddle = 0x11,
LLFontSizeTitleBig = 0x22
};
/** * 換行 */
- (void)appendNewLine
{
Byte nextRowBytes[] = {0x0A};
[_printerData appendBytes:nextRowBytes length:sizeof(nextRowBytes)];
}
/** * 回車(chē) */
- (void)appendReturn
{
Byte returnBytes[] = {0x0D};
[_printerData appendBytes:returnBytes length:sizeof(returnBytes)];
}
/** * 設(shè)置對(duì)齊方式 * @param alignment 對(duì)齊方式:居左、居中念搬、居右 */
- (void)setAlignment:(LLTextAlignment)alignment
{
Byte alignBytes[] = {0x1B,0x61,alignment};
[_printerData appendBytes:alignBytes length:sizeof(alignBytes)];
}
/** * 設(shè)置字體大小 *
@param fontSize 字號(hào)
*/
- (void)setFontSize:(LLFontSize)fontSize
{
Byte fontSizeBytes[] = {0x1D,0x21,fontSize};
[_printerData appendBytes:fontSizeBytes length:sizeof(fontSizeBytes)];
}
/** * 添加文字抑堡,不換行
* @param text 文字內(nèi)容
*/
- (void)setText:(NSString *)text
{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *data = [text dataUsingEncoding:enc];
[_printerData appendData:data];
}
* 添加文字,不換行
* * @param text 文字內(nèi)容
* @param maxChar 最多可以允許多少個(gè)字節(jié),后面加...
*/
- (void)setText:(NSString *)text maxChar:(int)maxChar
{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *data = [text dataUsingEncoding:enc];
if (data.length > maxChar) {
data = [data subdataWithRange:NSMakeRange(0, maxChar)];
text = [[NSString alloc] initWithData:data encoding:enc];
if (!text) {
data = [data subdataWithRange:NSMakeRange(0, maxChar - 1)];
text = [[NSString alloc] initWithData:data encoding:enc];
}
text = [text stringByAppendingString:@"..."];
}
[self setText:text];
}
/** * 設(shè)置偏移文字
* @param text 文字 偏移設(shè)置必須在文字設(shè)置之前
*/
- (void)setOffsetText:(NSString *)text
{
// 1.計(jì)算偏移量,因字體和字號(hào)不同锁蠕,所以計(jì)算出來(lái)的寬度與實(shí)際寬度有誤差(小字體與22字體計(jì)算值接近)
NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:22.0]};
NSAttributedString *valueAttr = [[NSAttributedString alloc] initWithString:text attributes:dict];
int valueWidth = valueAttr.size.width;
// 2.設(shè)置偏移量
[self setOffset:368 - valueWidth];
// 3.設(shè)置文字
[self setText:text];
}
/** * 設(shè)置偏移量
* @param offset 偏移量
*/
- (void)setOffset:(NSInteger)offset
{
NSInteger remainder = offset % 256;
NSInteger consult = offset / 256;
Byte spaceBytes2[] = {0x1B, 0x24, remainder, consult};
[_printerData appendBytes:spaceBytes2 length:sizeof(spaceBytes2)];
}
/** 設(shè)置行間距
* @param points 多少個(gè)點(diǎn)
*/
- (void)setLineSpace:(NSInteger)points
{
//最后一位夷野,可選 0~255
Byte lineSpace[] = {0x1B,0x33,points};
[_printerData appendBytes:lineSpace length:sizeof(lineSpace)];
}
/** 設(shè)置行默認(rèn)間距 2
* 設(shè)置行間距為1/6英寸,約34個(gè)點(diǎn)
*/ 同一個(gè)打印流程中如果設(shè)置多個(gè)行間距荣倾,后面的設(shè)置會(huì)覆蓋掉前面的間距設(shè)置
- (void)seDefaultLineSpace
{
Byte lineSpace[] = {0x1B,0x32};
[_printerData appendBytes:lineSpace length:sizeof(lineSpace)];
}
/*** 設(shè)置尾部換行間距
* @param points 多少個(gè)點(diǎn)
*/
- (void)setFooterSpace:(NSInteger)points
{
//最后一位悯搔,可選 0~255
Byte footerSpace[] = {0x1B,0x4A,points};
[_printerData appendBytes:footerSpace length:sizeof(footerSpace)];
}