ios开发打印机功能,ios网络打印

iOS开发之蓝牙/Socket链接小票打印机(二)

上一篇 主要介绍了部分ESC/POS指令集,包括一些常用的排版指令,打印位图指令等。另外,还介绍了将图片转换成点阵图的方法。在这篇文章中,将主要介绍通过蓝牙和Socket连接打印机,发送打印指令相关知识。这里将用到 CoreBluetooth.framework 和 CocoaAsyncSocket 。

公司主营业务:网站设计、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出呼中免费做网站回馈大家。

蓝牙是一种支持设备间短距离通讯的无线电技术。iOS系统中,有四个框架支持蓝牙链接:

CoreBluetooth框架有两个核心概念,central(中心)和 peripheral(外设),它们分别有自己对应的API;这里显然是手机作为central,蓝牙打印机作为peripheral;

设置代理后,会回调此方法,确认蓝牙状态,当状态为 CBCentralManagerStatePoweredOn 才能去扫描设备,蓝牙状态变化时,也会回调此方法

调用此方法开始扫描外设

注意:第一个参数指定一个 CBUUID 对象数组,每个对象表示外围设备正在通告的服务的通用唯一标识符(UUID)。此时,仅返回公布这些服务的外设。当参数为 nil ,则返回所有已发现的外设,而不管其支持的服务是什么。

当扫描到4.0外设后会回调此方法,这里包含设备的相关信息,如名称、UUID、信号强度等;

调用此方法连接外设

[self.centralManager connectPeripheral:peripheral options:nil];

注意:第一个参数是要连接的外设。第二个参数 options 是可选的 NSDictionary ,系统定义了一下三个键,它们的值都是NSNumber (Boolean);默认为NO。当设置为YES,则应用进入后台或者被挂起后,系统会用Alert通知蓝牙外设的状态变化,效果是这样

连接成功或失败,都有对应的回调方法

连接成功后设置代理 peripheral.delegate = self ,调用 [peripheral discoverServices:nil]; 寻找外设内的服务。这里的参数是一个存放 CBUUID 对象的数组,用于发现特定的服务。当传nil时,表示发现外设内所有的服务。发现服务后系统会回调下面的方法:

发现服务后,调用 [peripheral discoverCharacteristics:nil forService:service]; 去发现服务中包含的特征。和上面几个方法一样,第一个参数用于发现指定的特征。为nil时,表示发现服务的所有特征。

当扫描到写入特征时,保存,用于写入数据。

写入数据,我们只需要调用方法

这里的 self.peripheral 就是连接的外设, self.characteristicInfo 就是之前保存的写入特征;这里最好使用 CBCharacteristicPropertyWrite 特征,并且 type 选择 CBCharacteristicWriteWithResponse 。当写入数据成功后,系统会通过下面这个方法通知我们:

由于蓝牙设备每次可写入的数据量是有限制的,因此,我们需要将之前拼接的打印数据进行拆分,分批发送给打印机

这里的 MAX_CHARACTERISTIC_VALUE_SIZE 是个宏定义,表示每次发送的数据长度,经笔者测试,当 MAX_CHARACTERISTIC_VALUE_SIZE = 20 时,打印文字是正常速度。但打印图片的速度非常慢, 应该在硬件允许的范围内,每次发尽量多的数据。 不同品牌型号的打印机,这个参数是不同的,笔者的蓝牙打印机该值最多到140。超出后会出现无法打印问题。 最后笔者将该值定为 MAX_CHARACTERISTIC_VALUE_SIZE = 120 ,测试了公司几台打印机都没有问题。

另外iOS9以后增加了方法 maximumWriteValueLengthForType: 可以获取写入特诊的最大写入数据量,但经笔者测试,对于部分打印机(比如我们公司的)是不准确的,因此,不要太依赖此方法,最好还是自己取一个合适的值。

注意:每个打印机都有一个缓冲区,缓冲区的大小视品牌型号有所不同。打印机的打印速度有限,如果我们瞬间发送大量的数据给打印机,会造成打印机缓冲区满。缓冲区满后,如继续写入,可能会出现数据丢失,打印乱码。

这里使用 CocoaAsyncSocket 开源框架,与打印机进行 Socket 连接。 CocoaAsyncSocket 中主要包含两个类:

这里我们只用到 GCDAsyncSocket ,因此只需要将 GCDAsyncSocket.h 和 GCDAsyncSocket.m 两个文件导入项目。

注意:手机和打印机必须在同一局域网下,设置到打印机的host和port。

连接成功后会通过代理回调

Timeout为负,表示不设置超时时间。这里的data就是 上一篇 中拼接的打印数据。

写入完成后回调

断开连接有以下几种方法

连接断开后回调

读取到数据会回调

网口打印机一般都支持状态查询,查询指令如下:

可以通过 上一篇 介绍指令拼接方法,查询打印机的状态。

本篇只是简单介绍了,通过蓝牙和Socket连接打印机的方法。虽然可以初步完成连接和打印,但是,在真正的项目中使用还是远远不够的。这里还有很多情况需要考虑,比如连接断开、打印机异常、打印机缓冲区满、打印机缺纸等。我们可以针对自身的业务情况,进行相应的处理。

Core Bluetooth Programming Guide

Getting the pixel data from a CGImage object

Core Bluetooth Programming Guide

苹果手机打印机在哪里打印

以iPhone11,iOS13系统为例,苹果手机找不到隔空打印机,有可能是不支持“隔空打印”功能或者是没有开启无线打印功能。还有可能是苹果手机和打印机没有连接至同一个Wi-Fi网络环境,这样就会导致不能找到隔空打印机。

一般不支持“隔空打印”功能的苹果手机是不能找到隔空打印机的,而支持“隔空打印”功能,那么只要设备处于一个Wi-Fi网络环境,这样就可以找到隔空打印机。

苹果手机隔空打印的方法如下:

1、首先开启打印机的无线打印功能;

2、打开手机,在手机桌面上找到“照片”并点击打开;

3、然后选择一张要打印的照片并点击它;

4、接着点击这张照片左下方的分享图标,找到打印并点击它;

5、最后选择想要的打印机并点击打印就可以了。

该答案适用于苹果大部分手机型号。

iOS 如何连接打印机

iOS 10连接打印机的方法如下:

首先运行相应的打印机程序,如下图所示:

点开对应设备上的开关,如下图所示:

然后输入相应的管理员的账号与密码,并点击“OK”如下图所示:

接下来在下图中添加或删除需要使用的打印机,并点击“OK”。如下图所示:

接下来打开iOS系统中的“打印和传真图标”,并添加需要共享的打印机。如下图所示:

同时按照下图删除不需要的打印机,如下图所示:

然后添加所需打印机,如下图所示:

检查打印机是否添加成功,如果出现下图则表示打印机添加成功。如下图所示:


网站栏目:ios开发打印机功能,ios网络打印
文章路径:http://azwzsj.com/article/phjecg.html