close
当前位置: 物联网在线 > 技术文库 > ios >

iOS套接字连接小票打印机

最近在开发iOS连接打印机打印小票的功能,找了很多资料,本身相关资料就少,而且还全都是c#,java的.项目是用swift写的(OC思路差不多),现整理如下.

准备工作:Xcode7.1,swift2.0,佳博GP80106 wifi打印机(根据打印机的不同,有些指令可能会有差异,但基本相同,用的都是ESC/POS指令)

前提:在同一个局域网下,设置好打印机,设置好host,port

一. Socket连接打印机

使用CocoaAsyncSocket,wifi连接打印机.具体连接方法不是本文主要内容,可参考CocoaAsyncSocket的使用

https://github.com/robbiehanson/CocoaAsyncSocket

这个是OC库,所以要将AsyncSocket.h 包含到桥接文件中PrijectName-Bridging-Header.h

//ViewController.swift import AsyncSocke var asyncSocket:AsyncSocket? //... //假设已经连接成功 二. 编写之前,先来看看socket是如何发送指令的: asyncSocket.writeData(data: NSData!, withTimeout: NSTimeInterval, tag: Int)

它是将所有指令数据写入到一个数据对象中,再发送到连接的设备(打印机),那么首先创建一个NSData对象,来储存指令

let sendData = NSMutableData(capacity: 0)! asyncSocket.writeData(sendData, withTimeout: -1, tag: 0)

最后将指令发送,因此在这里,关键就是构建sendData对象

先来创建一个通用方法,将每一条指令都写入sendData中(如果现在不知道怎么回事,看下去就明白了)

func addBytesCommand(command:UnsafePointer, length:Int){ self.sendData.appendBytes(command, length: length) } 三. 举几个例子,来演示一下如何发送指令

根据编程手册,"横向和纵向移动单位"在很多设置间距的地方有使用到,那么先来解决这条指令.

1. GS P x y设置横向和纵向移动单位

[格式]

ASCII码 GS P x y
十六进制码   1D   50   x   y  
十进制码   29   80   x   y  

[范围] 0≤x≤255 0≤y≤255

[描述] •分别将横向移动单位近似设置成25.4/ x mm(1/ x英寸)纵向移动单位设置成25.4/ y mm(1/ y英寸)。

当x和y为0时,x和y被设置成默认值,默认值x=200,y=200。

先来解释一下,GS, P就是ASCII码,下面对应的是十六进制和十进制,这里使用十六进制

func printDotDistance(x:UInt8, y:UInt8){ var char:[UInt8] = [0x1D,0x50] char.append(x) char.append(y) //步骤2中创建的通用数据写入方法 addBytesCommand(char, length: char.count) }

直接使用指令中参数有时会让你不知所云,当我们将这个接口提供给别人用的时候,他们或许并不知道x,y是什么意思.所以很有必要将参数设置成大家都明白的意思(之后也会看到其他方法),改动如下

/** 设置横向和纵向移动单位 - parameter horizontal: 横向移动单位 - parameter vertical: 纵向移动单位 */ func printDotDistance(w w:Float, h:Float){ var char = [0x1D,0x50] char.append(Int(25.4/w)) char.append(Int(25.4/h)) addBytesCommand(char, length: char.count) }

w,h是我希望设置的左右或上下移动的单位距离,单位mm.根据0≤x≤255,0≤y≤255和"移动单位近似设置成25.4/ x mm" 的规定,上述方法中w,h也是有范围的,不要越界了,不然指令无效,会变成默认设置

下面再来看一条

2.GS L nL nH 设置左边距

[格式]

ASCII码 GS L nL nH
十六进制码   1D   4C   nL   nH  
十进制码   29   76   nL   nH  

[范围] 0≤nL≤255,0≤nH≤255

[描述] •用nL和nH设置左边距;

•左边距设置为[( nL + nH × 256)×横向移动单位]]英寸。

[默认值] nL = 0, nH = 0

这里用到了刚才设置的"横向移动单位",我先调用以下方法,就将横向纵向移动单位设置成了0.1mm

printDotDistance(w: 0.1, h: 0.1)

和指令一一样,如果直接将nL,nH设置成参数,使用者不易读,因此参数需要转换下.很容易发现,nL就是模(余数),nH就是商

/** 设置左边距 - parameter margin: 做边距,单位mm */ func printLeftMargin(margin:CGFloat){ var char:[UInt8] = [0x1D,0x4C] char.append(UInt8(margin%256)) char.append(UInt8(margin/256)) addBytesCommand(char, length: char.count) }

3.文字打印

/** 添加文字 - parameter text: 字符串 */ func printAddText(text:String){ //文字编码转为GB_18030_2000 let gbkeEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue)) let data = text.dataUsingEncoding(gbkeEncoding)! let size = data.length let textData = malloc(size) data.getBytes(textData, length:size) addBytesCommand(textData, length: size) free(textData) }

4.打印图片

我用了其中转图片的方法,使用OC写的,因为项目急,直接用了.等有时间,转成swift,再帖上来.


(责任编辑:ioter)

用户喜欢...

推荐3大硬件到云设计套件,简化物联网连接和应用开发

Simplicity是IoT开发板的游戏名称,旨在降低复杂性和上市时间。 即插即用的物联网模块和设计套件通过开箱即用的解决方案进一步简化了与云的智能设备连接。它们为电子行业的众多设计人员创...


如何快速连接到云端并向其直接发送物联网数据然后进行远程访问

许多开发人员都在开发需要连接到云端的物联网 (IoT) 项目,以便进行数据存储和远程访问,以及使用即时的数据分析服务。然而,开发人员很难找到最有效、安全的连接方法。 本文将介绍如何...


为什么以及如何使用串行外设接口来简化多个设备之间的连接

嵌入式系统可使用一个或多个处理器或微控制器,在更复杂的系统中执行专用操作。这些嵌入式控制器需要与其他系统元件、传感器甚至其他控制器进行通信。虽然复杂的串行接口和协议很常见...


一种更简便的增强 Wi-Fi 连接式物联网设计安全性的解决方案

Wi-Fi 连接是许多物联网 (IoT) 设备的关键要求,也是黑客们最喜爱的攻击目标。薄弱的安全措施会导致设备在持续的网络通信过程中容易遭到入侵。更糟糕的是,物联网设备有可能在其生命周期...


使用低功耗蓝牙技术将可穿戴无线传感器连接到物联网

工业物联网 (IIoT) 在很大程度上要依赖传感器从便携式可穿戴系统收集数据,以便监控运动、压力、湿度和其他众多特征,然后将这些数据馈送至云进行处理。 通过模块方式,我们可以快速轻松...


使用Zigbee和Thread快速构建网状连接照明应用

对于家庭,建筑和工业自动化应用,连接照明系统非常方便,可以帮助节省能源。虽然基于802.15.4的网状网络提供了低功耗操作,扩展范围和可用性的有效组合,但它们实现起来很复杂。 为了降...


如何快速安全地将物联网应用程序连接到Google Cloud

企业级云服务(如Google Cloud)为物联网开发人员提供了从可扩展虚拟机服务到交钥匙人工智能(AI)应用程序的各种功能。这些服务的基本要求是使用特定的安全方法来建立和维护物联网设备与...


使用Renesas Synergy平台在10分钟内连接到云

嵌入式开发人员需要快速有效地将其设备连接到云。从概念上讲,云连接听起来很简单,但它需要将许多软件堆栈集成在一起,以至于开发人员可能花费大量时间让他们的设备连接到云,而他们...


电子书:物联时代网 如何领导一个连接的世界

电子书:物联时代网 如何领导一个连接的世界...


简单的解释 - 连接物联网

连接物联网方面,有很多选择。 蜂窝,卫星,WiFi,蓝牙,RFID,NFC,LPWAN和以太网都是连接传感器/设备的可能方式。在每个选项中,可以有不同的提供商(例如,对于移动电话,有T-Mobile,Ve...