安卓已羡慕,惠普云打印必威

来源:http://www.roro2.com 作者:必威技术 人气:54 发布时间:2019-11-08
摘要:原标题:苹果让无线打印更加便捷,安卓已羡慕 如果你进来了,点下关注行不行 _ 在使用这个bonjour协议之前, 先谈谈两个问题? 无线打印 ePrint 日常的生活与工作中,有时候难免需要从

原标题:苹果让无线打印更加便捷,安卓已羡慕

如果你进来了,点下关注行不行_
在使用这个bonjour协议之前, 先谈谈两个问题?

无线打印 ePrint

日常的生活与工作中,有时候难免需要从 iPhone 手机上打印一些文件内容。由于我们使用的 iPhone 手机与打印机,以及连接打印机的电脑系统平台的差别,从而导致我们的手机不能直接连接打印机。iPhone 其实是支持网络打印的,但只是针对一些特殊的支持的 iPhone 的打印机。这里简单介绍一些方法,可以让我们的 iPhone 连接到网络打印机或电脑上的普通打印机,从而实现打印的功能。最近的项目中,刚好遇到这样的一个功能,把APP调用打印机整理一下;

9月苹果发布会即将到来,除了期待已久的新macbook air与第四代iWatch外,新款的iPhone也将有新的突破。接下来向大家介绍一下iOS的一款功能——AirPrint(隔空打印)。隔空打印可以无损打印输出,并且无需下载或安装驱动程序。

bonjour是什么?##

bonjour是苹果公司发布的一个基于ZEROCONF工作组(IETF下属小组)的工作,用于实现零配置网络联网的解决方案。Bonjour是基于IP层协议的。简单点说,就是 某个组织发明了一套解决方案,这套协议能够不需要 (复杂的配置),即可互相发现彼此的解决方案。

ePrint 是惠普公司独有的打印技术。每一台惠普云打印照片一体机都拥有自己独有的邮件地址,任何可以发送邮件 的设备,可以在任何地方向该打印机上发送邮件,打印机会将邮件内容和附件中的图片,office文档,PDF,网页打印出来。

利用苹果iOS系统内置AirPrint功能WiFi无线打印照片,Word,PDF等各种文件到你的Air Printer打印机,但有个前提是你的打印机必须支持苹果Air Print功能,即AirPrint-Enable Printer。

必威 1

为什么要使用它?##

因为如果不用他,就要经过一套(复杂的配置),才能连接设备。简单解释下,此前的配置是怎样复杂法。

连接设备, 首先想到就是 IP, 或者 UDP广播, 另外一边监听,从而连接起来.

1, IP
通过IP连接, 就需要知道双方的IP地址, 端口, 也就是说, 在连接的时候,
查询IP与, 这是一个步骤
输入IP与端口,等待连接, 当然,这两步两端都要做, 然后进行连接,
这用户体验被虐的体无完肤

2,UDP广播
首先, 手机不断发送UDP广播, 硬件设备接收, 然后开始连接
有什么问题?

-> 网络阻塞问题。因为UDP广播会对同一本地网络的所有Host都发送信息。过于密集的发送,有可能会造成网络的堵塞。
-> 而且基于Socket实现,我们还要考虑网络的稳定性,Socket断开与重连等情况。(代码量增大)
-> 由于UDP广播的间隔时间与不稳定性,导致我们获取设备的速度不快和稳定不足。
-> 由于耗电, 影响用户体验, APP整体质量

解决这些问题, 需要大量的代码量,与实现逻辑结构

ePrint允许您通过向打印机的电子邮件地址发送电子邮件来直接打印。

目前打印机品牌如兄弟、佳能、戴尔、惠普、利盟和三星都开始制造兼容AirPrint的打印机,对于普通打印机目前有些还不支持。

AirPrint并非是从第一代iPhone开始的,最早在2010年iOS 4.2版本更新的时候才出现。AirPrint在中国大陆官网翻译为“隔空打印”,还是非常传神的。这个功能让iPhone使用者能安定从容地打印手机中的照片或文件,而不需要任何线缆连接。

bonjouze怎么用?##

  1. 寻址(分配IP地址给主机)
  2. 命名(使用名字而不是IP地址来代表主机)
  3. 服务搜索(自动在网络搜索服务)

ePrint方便易用。只要您会使用电子邮件,您即会使用ePrint。

iPhone调取打印机:

无论是在电脑上,还是在 iPhone 手机上,相信大家都会安装 QQ 这款通讯软件。当前 QQ 最新的版本支持手机连接电脑端的打印机,也就是说当我们的 QQ 在电脑上登录以后,在 iPhone 手机上的 QQ 可以远程连接到电脑上进行文件的打印。

必威 2在 iPhone 上登录 QQ 软件,点击底部的“联系人”栏目.png

大多数来自苹果的应用都支持,象Mail,Safari和iPhoto。你还可以从手机中打印电子邮件、文档和图片。

必威 3iPhoto.png

访问iTunes应用商店,找到打印应用。你会找到一个供选择的支持从iPhone打印的应用列表。关于下载应用的更多信息可以查阅如何从iTunes 应用商店下载和使用应用。

UIKit 打印 APIs 的核心是 UIPrintInteractionController。这个类的一个共享实例管理着打印工作的细节和配置任何将要呈现给用户的 UI。它还为你的内容的格式提供了三个级别的控制。

AirPrint基于无线网络连接,苹果手机通过无线网络在打印机上打印文件。而AirPrint的作用就像是手机和打印机之间的翻译——两者各有自己的一套运行方式,AirPrint将数据转换为对方能听懂的语言,实现打印。

->寻址。##

一个在网络中的设备需要有一个自己的IP。有了IP地址,我们才能基于IP协议进行通信。
实现原理: Bonjour协议的寻址依赖于IP层协议。
对于IPV6标准,IP协议已经包括了自动寻找IP地址的功能。但是目前仍然普遍使用的IPV4 不包含本地链路寻址功能。那么解决方案就是在本地网络选择一个随机的IP地址进行测试,如果已经被占用,则继续挑选另外一个地址。

必威 4

通过ePrint,您可以从任何智能手机或计算机进行打印,而无需安装任何特殊驱动程序或软件。无论是坐在打印机前面的沙发里,还是在您所在国家/地区的另一端的咖啡店里,只要您采用ePrint,您便可以进行打印。

UIPrintInteractionController设置

这里有些关于UIPrintInteractionController的设置你需要配置下在开始展示打印UI之前。它们包括:

必威 5UIPrintInteractionController设置.png

通过UIPrintInteractionController四个不同的属性,你可以选择你想要的内容控制规格。

必威 6内容格式化.png

必威 7

-> 命名。##

我们不想通过冷冰冰的IP地址来作为我们服务的标志。我们想为我们的服务取一个名字。就像打印机一样,我们希望能在网络发现它的时候,是以一个比如“二楼的打印机”这样的标志,而不是一串冷冰冰“10.9.166.45”的IP地址。

就像我们希望发现我们的需要调试的iOS设备的时候,能够知道它是“Mango's iPhone7”、因此,我们需要给我们的设备和服务命名。

我们还希望能够通过名字找到服务准确的IP地址,就像在浏览器输入"www.qq.com"一样,DNS服务器会自动帮我导向正确的网站IP地址。

而Bonjour,正是帮我们实现了命名和解析的功能。保证了我们服务的名字在本地网络是唯一的,并且把别人对我们名字的查询指向正确的IP地址和端口。

实现原理:
我们在这里抛开复杂的RFC 6762规范,用简洁的语言介绍一下原理。

指定名字:
用户在注册一个名字的时候,设备向本地网络发送查询来确定名字是否选中。如果用户提供的名字已经被使用,则Bonjour会自动重命名我们的服务。例如我们注册名字为"Mango's iPhone7"已经被使用,那么Bonjour可能会帮我们取"Mango's iPhone7-1"的名字。

必威 8

解析名字 :
如果有用户发出一个查询,说我想找名字叫"Mango's iPhone7"的设备,则本地网络收到请求的设备看看自己是不是被请求了,如果是的话,则返回正确的IP地址,端口。

必威 9

responder :
需要了解的是而Bonjour在系统级别上添加了一个mDNSResponder服务来处理请求和发送回复,从系统级层面上处理,我们就无需在应用内自己监听和返回IP地址,只需到系统内注册服务即可。减少了我们应用的工作量和提高了稳定性。就好像APNS在iOS上帮助我们维持一个系统级别的长连接。

HP ePrint服务将自动打印下列文件类型的电子邮件附件: Microsoft Word,Microsoft PowerPoint,Microsoft Outlook,Microsoft Excel,HTML,文本文件,PDF,图像。

UIPrintInfo

UIPrintInfo实例中存放着打印任务详情设置。你可以找到如下属性:

必威 10UIPrintInfo.png

不仅如此,AirPrint的超神之处在于有一套自动化的发现机制。举个例子,你用iPhone想打印的时候,并不知道网络中有几台打印机、不知道打印机的地址也不知道名字,手机同样也不知道;而AirPrint自动寻找网络中的打印机、自动和他们聊天、问每一个打印机的地址和名字,也就是发现和协商的机制,苹果官方把这个机制叫做Bonjour。

-> 服务搜索。##

我们还需要搜索网络上可用的设备和服务来查看可用的服务。Bonjour帮助我们,只需指定所需服务的类型即可收到本地网络上可用的设备列表。

实现原理:

设备在本地网络发出请求,说我需要"XXX"类型的服务,例如:我要打印机服务。所有打印机服务的设备回应自己的名字。

必威 11

以下电子邮件客户端已经过HP ePrint测试:Outlook2003、2007,Hotmail、Yahoo!Mail、Gmail,Apple Mail、BlackBerry邮件客户端,Nokia/Symbian客户端。

代码

必威 12

Cocoa中的bonjouze?##

Bonjour在Cocoa世界里的实现Stack: 调用服务

必威 13

Cocoa 中实现bonjouze的 API :

必威 14

下面简述一下整个流程 :

// 这个是wifi模块制造厂商
if (!self.mylink) {
      self.mylink = [[MYLINK alloc] initWithDelegate:self];
}

// 将wifi账号密码保存,发送给智能硬件. 发送的方法,由wifi模块框架提供
NSMutableDictionary *wifiConfig = [NSMutableDictionary dictionaryWithCapacity:20];
NSData *ssidData = [self.tfdSSID.text dataUsingEncoding:NSUTF8StringEncoding];
[wifiConfig setObject:ssidData forKey:KEY_SSID];
[wifiConfig setObject:self.tfdPWD.text forKey:KEY_PASSWORD];
[wifiConfig setObject:[NSNumber numberWithBool:YES] forKey:KEY_DHCP];
// 注册的功能, 是由wifi模组提供
[self.easylink prepareEasyLink_withFTC:wifiConfig info:nil mode:EASYLINK_V2_PLUS];
[self.easylink transmitSettings];

好了,我们已经注册了服务,接下来就是进行检索了.
定义两个变量.

// NSNetService 代表一个服务。 NSNetServiceBrowser 用于搜索服务。
@property(strong, nonatomic) NSNetServiceBrowser *brower;
@property(strong, nonatomic) NSNetService *service;

无线打印 AirPrint

打印PDF
/** * PDF * * @param sender <#sender description#> */-printAction:sender{ NSString *str = [[NSBundle mainBundle] pathForResource:@"123.pdf" ofType:nil]; self.myPDFData = [NSData dataWithContentsOfFile:str]; UIPrintInteractionController* pic = [UIPrintInteractionController sharedPrintController]; NSData *imageData = [NSData dataWithData:self.myPDFData]; if (pic && [UIPrintInteractionController canPrintData:imageData]) { pic.delegate = self; // 打印任务细节在 UIPrintInfo 实例中设置。可以使用以下属性: UIPrintInfo* printInfo = [UIPrintInfo printInfo]; // UIPrintInfoOutputType:给 UIKit 提供要打印内容的类型提示。可以是以下任意一个:// .General:文本和图形混合类型;允许双面打印。// .Grayscale:如果你的内容只包括黑色文本,那么该类型比 .General 更好。// .Photo:彩色或黑白图像;禁用双面打印,更适用于图像媒体的纸张类型。// .PhotoGrayscale:对于仅灰度的图像,根据打印机的不同,该类型可能比 .Photo 更好。 printInfo.outputType = UIPrintInfoOutputGeneral;// jobName String:此打印任务的名称。这个名字将被显示在设备的打印中心,对于有些打印机则显示在液晶屏上 printInfo.jobName = @"PrintingImage";// UIPrintInfoDuplex:.None、.ShortEdge 或 .LongEd​​ge。short- 和 long- 的边界设置指示如何装订双面页面,而 .None 不支持双面打印(这里不是 UI 切换为双面打印,令人困惑) printInfo.duplex = UIPrintInfoDuplexShortEdge; // UIPrintInfo:之前所述的打印任务的配置 pic.printInfo = printInfo;// showsPageRange Bool:当值为 true 时,让用户从打印源中选择一个子范围。这只在多页内容时有用,它默认关闭了图像。 pic.showsPageRange = NO; pic.printingItem = imageData; void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { if (!completed && error) { NSLog(@"FAILED! due to error in domain %@ with error code %lu", error.domain, error.code); } }; // [pic presentAnimated:YES completionHandler:completionHandler]; if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) { [pic presentFromRect:self.view.frame inView:self.view animated:YES completionHandler:completionHandler]; } else { [pic presentAnimated:YES completionHandler:completionHandler]; } } } 

当然这并不是说AirPrint就是万能的,而是苹果的强势话语权,打印机厂商愿意支持AirPrint协议,在打印机上开发相应的对话机制,所以在打印机宣传单或购买网页中,仔细寻找会看到“支持苹果AirPrint”字样或者对应的图标。

搜索服务 :

// 假如检索数据不成功, 请先停止上一次的检索
[self.brower stop];

// @"_mylink._tcp" 这个名字是模块上提供的服务名字(其实告诉它,喂,你搜这个名的服务!)
// 从网上看到一个好软件 Discovery - Bonjour Brower ,上AppStore搜索一下你就能搜索到,能查询服务
 [self.brower searchForServicesOfType:@"_mylink._tcp" inDomain:@"local."];

AirPrint是苹果公司iOS4.2以上版本操作系统的全新功能 ,AirPrint支持iPad/iPhone 4/iPhone 3GS/iPod touch 在Wifi无线网络环境内,通过任意一台惠普云打印机,将Safari,Mail,Photo,iNumber,iPage, Keynote等苹果软件里的内容直接打印出来。

打印UIWebView
/** * UIWebView、 * * @param sender <#sender description#> */- clike:(UIButton *)sender { UIPrintInteractionController *printC = [UIPrintInteractionController sharedPrintController];//显示出打印的用户界面。 printC.delegate = self; UIPrintInfo *printInfo = [UIPrintInfo printInfo];//准备打印信息以预设值初始化的对象。 printInfo.outputType = UIPrintInfoOutputGeneral;//设置输出类型。 printC.showsPageRange = YES;//显示的页面范围 // 打印网页 [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://nshipster.cn/uiprintinteractioncontroller/"]]];//网页 printC.printFormatter = [self.myWebView viewPrintFormatter];//布局打印视图绘制的内容。 // // 打印文本 // UISimpleTextPrintFormatter *textFormatter = [[UISimpleTextPrintFormatter alloc] // initWithText:@"ここの ういえい 子に うぃっl willingseal 20655322 你好么? #@¥%……&*"]; // textFormatter.startPage = 0; // textFormatter.contentInsets = UIEdgeInsetsMake(200, 300, 0, 72.0); // 插入内容页的边缘 1 inch margins // textFormatter.maximumContentWidth = 16 * 72.0;//最大范围的宽 // printC.printFormatter = textFormatter; // // 等待完成 void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { if (!completed && error) { NSLog(@"可能无法完成,因为印刷错误: %@", error); } }; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:sender];//调用方法的时候,要注意参数的类型-下面presentFromBarButtonItem:的参数类型是 UIBarButtonItem..如果你是在系统的UIToolbar or UINavigationItem上放的一个打印button,就不需要转换了。 [printC presentFromBarButtonItem:item animated:YES completionHandler:completionHandler];//在ipad上弹出打印那个页面 // [printC presentFromRect:CGRectMake(500, 500, 100, 200) inView:self.webView animated:YES completionHandler:completionHandler];//第二种方法 } else { [printC presentAnimated:YES completionHandler:completionHandler];//在iPhone上弹出打印那个页面 } }

必威 15

搜索之后,哪里反馈信息?

// 当检索到指定名的服务时就会调用的代理方法,想获得更细致的数据就必须通过它来做下一步动作
-(void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing{}
// 发生错误的时候调用这个方法
-(void)netService:(NSNetService *)sender didNotResolve:(NSDictionary<NSString *,NSNumber *> *)errorDict{}
// 想要获得更细致的数据,那么就需要调用这个方法,不过,首先先利用(第一个代理方法)。
-(void)netServiceDidResolveAddress:(NSNetService *)sender{}

无线打印 iPrint

所以用iPhone直接打印,需要打印机支持无线网络,更准确地说手机和打印机在网络上可以互通;打印机要支持AirPrint协议;网络节点需要开放Bonjour服务支持。一些企业网络可能会屏蔽Bonjour服务导致AirPrint不能发现网络打印机,这个锅是网管的而并不是iPhone手机或打印机的,点击阅读原文,即可查询支持隔空打印的所有打印设备!返回搜狐,查看更多

详细使用 :

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing{
    //为service设置代理,无法直接在此代理中得到地址,似乎必须通过代理回调
    NSString *serviceStr = [service.name lowercaseString];
    NSRange serviceRange = [serviceStr rangeOfString:@"#"];
    NSString *maccode = [serviceStr substringWithRange:NSMakeRange(serviceRange.location+3, 4)];
    echo(@"%@",maccode);
    // 苹果同一时间里只给你提供一个服务的详细数据
    if ([maccode isEqualToString:[self.tfdCode.text lowercaseString]] ) {
        self.service = service;
        self.service.delegate = self;
        //使用它,在下一个代理回调内得到数据
        [self.service resolveWithTimeout:1.0];    }
}

-(void)netServiceDidResolveAddress:(NSNetService *)sender{
    // 这个NSNetService, 就是代表了一个服务
    NSData *data = [sender TXTRecordData];
    NSDictionary *dict = [NSNetService dictionaryFromTXTRecordData:data];
    NSData *str = [dict objectForKey:@"MAC"];
    NSString *oldmacadress = [[NSString alloc]initWithData:str encoding:NSUTF8StringEncoding];
    //需要硬件的mac地址,那么切记字典中的数据并不是立马就能用的,必须再做处理。当然, 其他也是这样
    NSString *macadress = [oldmacadress stringByReplacingOccurrencesOfString:@":" withString:@""];
    if (macadress.length < 8) {
        return;
    }
    if (self.timer) {
        [self.timer invalidate];
    }
    _Mac = macadress;

    // 处理完成后, 一定要关闭连接
    [self stopMyLink];
}

iPrint 是惠普公司开发的,用于解决平板产品打印需求的软件。用户可以在APP Store苹果软件中下载,支持iPad/iPhone 4/iPhone 3GS/ iPod touch。用户可以在Wifi环境下的任意一台惠普云打印机上使用。 iPrint拥有更强大的设置,可将图片打印出来,或者也可用惠普云打印机将图片文稿扫描进用户的苹果产品中。

责任编辑:

关键词:云打印惠普

本文由必威发布于必威技术,转载请注明出处:安卓已羡慕,惠普云打印必威

关键词:

最火资讯