最近公司给商户做的App 允许App把卖出的商品信息通过打印机 打印标签
所以了解了一下iOS 和 打印机 之间的交互 (Ps:用的不是UIPrinter 那个扫面打印机 发送信息打印的那个框架)
主要功能 打印 .中文. 数字. 二维码
1.连接打印机
连接打印机可以通过 网线 USB 蓝牙 或者WiFi . 我们用App肯定是通过WiFi或者蓝牙连接
至于蓝牙怎么连接 可以 看看前面的文章,本文采用WiFi 链接.
App和打印机通过socket通信.使用的是 GCDAsyncSocket
做过socket通信的应该对这个库都贼鸡儿熟悉, 不多介绍.想了解的可以看看资料,用法也很简单Git地址
App通过socket向打印机发送指令控制打印机动作. 所谓指令就是标题ESC/POS 指令
开发之前先耐心看一下指令集,现在脑中有一个概念
通过端口和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