iOS 连接打印机 ESC/POS 指令打印 打印图片二维码

最近公司给商户做的App 允许App把卖出的商品信息通过打印机 打印标签

所以了解了一下iOS 和 打印机 之间的交互 (Ps:用的不是UIPrinter 那个扫面打印机 发送信息打印的那个框架)

主要功能 打印 .中文. 数字. 二维码

1.连接打印机

连接打印机可以通过 网线 USB 蓝牙 或者WiFi . 我们用App肯定是通过WiFi或者蓝牙连接

至于蓝牙怎么连接 可以 看看前面的文章,本文采用WiFi 链接.

App和打印机通过socket通信.使用的是 GCDAsyncSocket

做过socket通信的应该对这个库都贼鸡儿熟悉,  不多介绍.想了解的可以看看资料,用法也很简单Git地址

App通过socket向打印机发送指令控制打印机动作.  所谓指令就是标题ESC/POS 指令

ESC指令  我觉得这个PDF清晰一点 ESC指令2

开发之前先耐心看一下指令集,现在脑中有一个概念

通过端口和IP地址 连接打印机

    @IBAction func connectAction(_ sender: Any) {
        
        let queue = DispatchQueue.global()
        self.socket = GCDAsyncSocket.init(delegate: self, delegateQueue: queue)
        do {
            try self.socket.connect(toHost: address, onPort: 9100)
        } catch  {
            print("出毛病了")
        }
    }

可以实现GCDAsyncSocketDelegate 查看socket的连接状态

extension HomeViewController: GCDAsyncSocketDelegate {

    func socket(_ sock: GCDAsyncSocket, didConnectTo url: URL) {
        
    }
    
    func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
        print("链接成功")
    }

    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        print("断开连接")
    }

    func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
        print("写入成功")
    }

    func socket(_ sock: GCDAsyncSocket, shouldTimeoutReadWithTag tag: Int, elapsed: TimeInterval, bytesDone length: UInt) -> TimeInterval {
        return 10
    }

}

 

2.POS简单指令

/**
 * 这些数据源自爱普生指令集,为POS机硬件默认
 */
let ESC:UInt8 = 27;//换码
let FS:UInt8 = 28;//文本分隔符
let GS:UInt8 = 29;//组分隔符
let DLE:UInt8 = 16;//数据连接换码
let EOT:UInt8 = 4;//传输结束
let ENQ:UInt8 = 5;//询问字符
let SP:UInt8 = 32;//空格
let HT:UInt8 = 9;//横向列表
let LF:UInt8 = 10;//打印并换行(水平定位)
let CR:UInt8 = 13;//归位键
let FF:UInt8 = 12;//走纸控制(打印并回到标准模式(在页模式下) )
let CAN:UInt8 = 24;//作废(页模式下取消打印数据 )

swift方法

//MARK:-- ------------------------打印机初始化-----------------------------
    
    
    /**
     * 打印机初始化
     * @return
     */
    func init_printer() -> [UInt8] {
        let foo : [UInt8] = [UInt8(ESC), 64]
        return foo
    }
    
//MARK:-- ------------------------换行-----------------------------
    
    
    /**
     * 换行
     * @param
     * @return
     */
    func nextLine(number:Int) -> [UInt8] {
        var foo:[UInt8] = [UInt8].init();
        for _ in 0..<number {
            foo.append(LF)
        }
        return foo
    }
    
//MARK:-- ------------------------打印空格-------------------------
    /**
     * 打印空格
     * @param
     * @return
     */
    func blankWithCount(number:Int) -> [UInt8] {
        var foo:[UInt8] = [UInt8].init();
        for _ in 0..<number {
            foo.append(SP)
        }
        return foo
    }
    
//MARK:-- ------------------------下划线-----------------------------
    
    
    /**
     * 绘制下划线(1点宽)
     * @return
     */
    func underlineWithOneDotWidthOn() -> [UInt8] {
        var foo:[UInt8] = [UInt8].init();
        foo.append(ESC);
        foo.append(45)
        foo.append(1)
        return foo
    
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值