美文网首页
iOS Socket连接打印机打印小票

iOS Socket连接打印机打印小票

作者: _冰淇淋_ | 来源:发表于2017-11-09 17:11 被阅读560次

    最近做了利用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.

    打印机初始化

    image
    /** 初始化打印机 */
    - (void)printInitialize {
        unsigned char data[] = {0x1B, 0x40};
        [self.sendData appendBytes:data length:2];
    }
    

    • 设置横向和纵向移动单位


      image

      [范围] 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];
    }
    

    示例demo

    相关文章

      网友评论

          本文标题:iOS Socket连接打印机打印小票

          本文链接:https://www.haomeiwen.com/subject/qblmmxtx.html