最近做了利用socket连接打印机的小功能,记录一下,demo在最下面.
-
SocketManager
连接管理类:使用的是GCDAsyncSocket,使用详情自己看demo就可以,其实挺简单的.
@interface SocketManager : NSObject
/** 单利 */
+ (instancetype)shareInstance;
/** 连接socket */
- (void)socketConnectToHost:(NSString *)host port:(uint16_t)port timeout:(NSTimeInterval)timeout;
/** 发送数据 */
- (void)socketWriteData:(NSData *)data;
/** 断开连接 */
- (void)socketDisConnect;
- LCPrinterManager打印机指令管理类(可能不同的打印机指令有点不同,这部分指令参考打印机的开发文档)
@interface LCPrinterManager : NSObject
// 打印数据(文字图片信息)
@property (nonatomic, strong) NSMutableData *sendData;
// 录入文字
-(void)printAddText:(NSString *)text;
// 打印并换行
-(void)printAndGotoNextLine;
// 设置绝对打印位置
-(void)printAbsolutePosition:(NSInteger)location;
// 选择位图模式
- (void)printBitmapModel:(UIImage *)bitmap;
// 设置默认行间距(约3.75mm)
- (void)printDefaultLineSpace;
// 初始化打印机
- (void)printInitialize;
// 打印并走纸
- (void)printPrintAndFeedPaper:(CGFloat)space;
// 设置字号
- (void)printSelectFont:(kCharFont)size;
// 设置成标准模式
- (void)printSetStanderModel;
// 设置对齐方式
-(void)printAlignmentType:(kAlignmentType)type;
// 产生钱箱控制脉冲
-(void)printOpenCashDrawer;
// 选择字符大小
-(void)printCharSize:(kCharScale)scale;
// 设置左边距
- (void)printLeftMargin:(CGFloat)left;
// 设置横向和纵向移动单位
- (void)printDotDistanceW:(CGFloat)w h:(CGFloat)h;
// 选择切纸模式并切纸
-(void)printCutPaper:(kCutPaperModel)model Num:(UInt8)n;
// 设置每行打印宽度
- (void)printAreaWidth:(CGFloat)width;
- 打印机使用的是ESC/POS指令 ,举几个例子演示指令的发送.详情参阅demo.
打印机初始化
/** 初始化打印机 */
- (void)printInitialize {
unsigned char data[] = {0x1B, 0x40};
[self.sendData appendBytes:data length:2];
}
-
设置横向和纵向移动单位
[范围] 0≤x≤255 0≤y≤255
[描述] 分别将横向移动单位近似设置成25.4/ x mm(1/ x英寸)纵向移动单位设置成25.4/ y mm(1/ y英寸)。
/**
注意:文档中表示:横向移动单位 = 25.4 / x, 纵向移动单位 = 25.4 / y
*/
- (void)printDotDistanceX:(int)x y:(int)y {
unsigned char data[] = {0x1D,0x50,x,y};
[self addBytesCommand:data Length:4];
}
/**
希望能够直接设置横向和纵向移动单位,改成下面写法
- parameter horizontal: 横向移动单位
- parameter vertical: 纵向移动单位
*/
- (void)printDotDistanceW:(CGFloat)w h:(CGFloat)h {
unsigned char width = (unsigned char)(25.4/w);
unsigned char height = (unsigned char)(25.4/h);
unsigned char data[] = {0x1D,0x50,width,height};
[self addBytesCommand:data Length:4];
}
- LCSockerPrinterManager打印小票管理类
@interface LCSockerPrinterManager : NSObject
/** 单利 */
+ (instancetype)shareInstance;
/** 销毁单利 */
+ (void)destoryInstance;
/** 连接打印机 */
- (void)connectWithHost:(NSString *)host port:(uint16_t)port timeout:(NSTimeInterval)timeout;
/** 基础设置 */
- (void)basicSetting;
/** 清空缓存数据 */
- (void)clearData;
/** 写入单行文字 */
- (void)writeData_title:(NSString *)title Scale:(kCharScale)scale Type:(kAlignmentType)type;
/** 写入多行文字 */
- (void)writeData_items:(NSArray *)items;
/** 打印图片 */
- (void)writeData_image:(UIImage *)image alignment:(kAlignmentType)alignment maxWidth:(CGFloat)maxWidth;
/** 条目,菜单,有间隔, 字典数组中字典用key1, key2,...表示 */
- (void)writeData_content:(NSArray *)items;
/** 打印分割线 */
- (void)writeData_line;
/** 打开钱箱 */
- (void)openCashDrawer;
/** 打印小票 */
- (void)printReceipt;
- 使用方法
// LCSocketPrintViewController.m
- (void)printReceipt:(id)sender {
NSString *host = @"192.168.1.241";
UInt16 port = 9100;
NSTimeInterval timeout = 10;
LCSockerPrinterManager *manager = [LCSockerPrinterManager shareInstance];
[manager connectWithHost:host port:port timeout:timeout];
[manager basicSetting];
[manager writeData_title:@"XXX外卖店" Scale:scale_2 Type:MiddleAlignment];
[manager writeData_items:@[@"收银员:001", @"交易时间:2016-03-17", @"交易号:201603170001"]];
[manager writeData_line];
[manager writeData_content:@[@{@"key1":@"名称", @"key2":@"单价", @"key3":@"数量", @"key4":@"总价"}]];
[manager writeData_line];
[manager writeData_content:@[@{@"key1":@"汉堡", @"key2":@"10.00", @"key3":@"2", @"key4":@"20.00"}, @{@"key1":@"炸鸡", @"key2":@"8.00", @"key3":@"1", @"key4":@"8.00"}]];
[manager writeData_line];
[manager writeData_items:@[@"支付方式:现金", @"应收:98.00", @"实际:100.00", @"找零:2.00"]];
[manager openCashDrawer];
[manager printReceipt];
}