原标题:苹果让有线打字与印刷越发方便,安卓已羡慕

借使您进去了,点下关切行不行\_
迟到,安卓已羡慕。在利用这么些bonjour协议此前, 先谈谈三个难点?

在 iOS 4.2 / AirPrint 推出在此以前,传来 AirPrint
并不会支撑电脑端打字与印刷机联机打字与印刷功效的音讯(Mac OS X 10.6.5
推出后,也认证的确如此),多少让人感到遗憾,但是别担心,Mac OS
的软件开发者很『耐斯』的,这几天 Collobos 就丢出了个称呼 FingerPrint
的软件来多少改善一下苹果家最近 GALAXY Tab 有线打字与印刷成效扶助的贫乏。以往 iOS 4.2
推出之后,使用者要是在 Mac 电脑端安装 FingerPrint,就能够让 三星平板 /
红米 等 iOS 4.2 装置来通过 Bonjour
技术与电脑端打字与印刷机联机,并且输出打字与印刷,可是该软件可不是免费的,索要的价格八日元,同时也从未帮忙全数的打字与印刷机,相比旧的型号近期并不帮助,那这么些使用者该如何是好吧?别担心,还有另一套叫做由
Ecamm 推出的软件 Printopia 可选,听大人说扶助的打字与印刷机型号越来越多,大家的姐妹站
TUAW 不久后将会带来该软件的测试报道,各位到时候能够到他们家参考一下。

初稿链接: …

三月苹果发表会即将到来,除了期待已久的新macbook
air与第六代i沃特ch外,新款的三星也将有新的突破。接下来向大家介绍一下iOS的一款效率——AirPrint(隔空打印)。隔空打印能够无损打字与印刷输出,并且无需下载或设置驱动程序。

bonjour是什么?##

bonjour是苹果集团发表的七个遵照ZEROCONF工作组(IETF下属小组)的劳作,用于落到实处零配置互连网联网的缓解方案。Bonjour是遵照IP层协议的。简单点说,正是某些协会申明了一套消除方案,那套协议能够不须要(复杂的配置),即可相互发现相互的化解方案。

此前一直考虑在local现场怎么与其余用户通讯,后来接力领悟了苹果的Bonjour。以往大致写一篇Bonjour的入门介绍。

澳门金沙4787.com官网 1

何以要运用它?##

因为一旦不用她,就要通过一套(复杂的布局),才能一而再装置。不难解释下,此前的布署是什么复杂法。

一而再装置, 首先想到便是 IP, 恐怕 UDP广播, 其它一边监听,从而连接起来.

1, IP
经过IP连接, 就需求领悟相互的IP地址, 端口, 也正是说, 在连接的时候,
询问IP与, 那是2个步骤
输入IP与端口,等待连接, 当然,那两步两端都要做, 然后拓展连接,
那用户体验被虐的支离破碎

2,UDP广播
先是, 手提式无线话机不断发送UDP广播, 硬件设备接收, 然后开头接连
有何难点?

->
互联网不通难点。因为UDP广播会对相同本地网络的具有Host都发送新闻。过于密集的出殡和埋葬,有也许会导致互连网的堵塞。
->
而且基于Socket完结,我们还要考虑网络的安定团结,Socket断开与重连等气象。(代码量增大)
->
由于UDP广播的间隔时间与不平静,导致大家赢得装备的速度相当慢和安居不足。
-> 由于功耗, 影响用户体验, APP全部品质

焚薮而田这么些标题, 须要大批量的代码量,与贯彻逻辑结构

bonjour其实来自英语,是您好的情致。而Bonjour服务是苹果企业发表的1个基于ZEROCONF工作组的做事,用于落实零配置互连网联网的缓解方案。Bonjour是基于IP层协议的,简单的说,正是一套消除方案,能够不供给复杂的配备,即可相互发现互相的缓解方案。能够用它来轻松探测并一而再到同样网络中的别的装置,并与别的智能硬件实行交互或然其余操作。典型的Bonjour应用有Remote、AirPrint等。

AirPrint并非是从第3代Motorola伊始的,最早在2008年iOS
4.2版本更新的时候才面世。AirPrint在中华夏族民共和国大陆官网翻译为“隔空打字与印刷”,照旧相当逼真的。那个功效让诺基亚使用者能安居乐业从容地打字与印刷手提式有线电话机中的照片或文件,而不必要任何线缆连接。

bonjouze怎么用?##

  1. 寻址(分配IP地址给主机)
  2. 取名(使用名字而不是IP地址来表示主机)
  3. 劳动搜索(自动在互联网寻找服务)

澳门金沙4787.com官网 2Bonjour-overview

AirPrint基于有线网络连接,苹果手提式有线电话机通过有线网络在打字与印刷机上打字与印刷文件。而AirPrint的作用就像是手提式有线电话机和打字与印刷机之间的翻译——两者各有温馨的一套运市价势,AirPrint将数据转换为对方能听懂的语言,实现打字与印刷。

->寻址。##\

3个在互连网中的设备亟需有2个协调的IP。有了IP地址,我们才能依据IP协议实行通讯。
兑现原理: Bonjour协议的寻址依赖于IP层协议。
对此IPV6专业,IP协议已经席卷了全自动搜索IP地址的功力。不过当前还是普遍使用的IPV4
不包罗本地链路寻址功用。那么化解方案正是在本地网络选拔一个随意的IP地址举行测试,若是已经被占用,则继续选拔其余一个地址。

澳门金沙4787.com官网 3

为了贯彻简单布署网络,Bonjour做了以下三点:

澳门金沙4787.com官网 4

-> 命名。##\

大家不想经过冷冰冰的IP地址来作为大家服务的注脚。大家想为大家的劳动取三个名字。就如打字与印刷机一样,大家盼望能在网络发现它的时候,是以三个诸如“二楼的打字与印刷机”那样的注脚,而不是一串冷冰冰“10.9.166.45”的IP地址。

就像是大家期望发现大家的须要调剂的iOS设备的时候,能够了解它是“Mango’s
OPPO7”、由此,大家要求给我们的配备和劳务命名。

我们还指望能够由此名字找到服务规范的IP地址,就好像在浏览器输入”www.qq.com”一样,DNS服务器会自动帮自个儿导向正确的网站IP地址。

而Bonjour,就是帮大家兑现了命名和剖析的效率。保障了大家服务的名字在本地网络是唯一的,并且把外人对我们名字的询问指向正确的IP地址和端口。

福寿双全原理:
大家在那边放任复杂的KoleosFC 6762正式,用精练的语言介绍一下原理。

钦命名字:
用户在登记2个名字的时候,设备向本地网络发送查询来分明名字是还是不是选中。若是用户提供的名字曾经被应用,则Bonjour会自动重命名我们的服务。例如大家报了名名字为”Mango’s
酷派7″已经被选用,那么Bonjour大概会帮大家取”Mango’s HUAWEI7-1″的名字。

澳门金沙4787.com官网 5

解析名字 :
尽管有用户发生1个询问,说笔者想找名字叫”Mango’s
华为7″的设备,则本地互连网收到请求的设备看看本人是或不是被呼吁了,假如是的话,则赶回正确的IP地址,端口。

澳门金沙4787.com官网 6

responder :
亟待领会的是而Bonjour在系统级别上添加了三个mDNSResponder服务来处理请求和发送过来,从系统级层面上拍卖,大家就无需在采纳内本人监听和再次来到IP地址,只需到系统内注册服务即可。收缩了笔者们采纳的工作量和增强了平稳。就接近APNS在iOS上扶助我们维持1个种类级别的长连接。

  1. 寻址(分配IP地址给主机)3个在网络中的设备亟需有1个投机的IP。有了IP地址,大家才能依照IP协议举行通讯。对于IPV6行业内部,IP协议已经席卷了自动搜索IP地址的功力。不过如今照旧普遍利用的IPV4不带有本地链路寻址作用。而Bonjour会在本地网络选拔3个即兴的IP地址实行测试,即使已经被占用,则持续选用别的一个地点,直到选到可用的IP地址。

  2. 取名(使用名字而不是IP地址来表示主机)Bonjour还落到实处了命名和剖析作用,保障了小编们服务的名字在本地网络是唯一的,并且把别人对大家名字的询问指向正确的IP地址和端口,而不是以IP地址那样没错读的不二法门来作为劳动的注明。而且Bonjour在系统级别上添加了多个mDNSResponder服务来处理请求和发送过来,从系统级层面上拍卖,大家就无需在动用内自个儿监听和重回IP地址,只需到系统内注册服务即可。减弱了大家采取的工作量和增进了安静。

  3. 服务搜索(自动在互连网检索服务)Bonjour能够只需点名所需服务的类型,即可吸收本地网络上可用的设施列表。设备在本地网络发出请求,说自家急需”XXX”类型的劳务,例如:作者要打字与印刷机服务。全部打字与印刷机服务的装置回应自身的名字。

不仅如此,AirPrint的超神之处在于有一套自动化的发现体制。举个例子,你用三星想打印的时候,并不知道互联网中有几台打字与印刷机、不了解打字与印刷机的地点也不精晓名字,手提式无线电电话机一律也不知道;而AirPrint自动寻找网络中的打字与印刷机、自动和她们促膝交谈、问每多个打字与印刷机的地点和名字,也便是意识和钻探的体制,苹果官方把这么些机制叫做Bonjour。

-> 服务搜索。##\

大家还索要摸索网络上可用的设施和劳务来查阅可用的劳务。Bonjour帮忙我们,只需点名所需服务的连串即可吸收本地互连网上可用的配备列表。

完毕原理:

装备在本地互连网发出请求,说小编急需”XXX”类型的劳动,例如:小编要打字与印刷机服务。全数打字与印刷机服务的装置回应自个儿的名字。

澳门金沙4787.com官网 7

Cocoa中网络框架有三层,最尾部的是依照 BSD socket库,然后是 Cocoa 中基于
C 的 CFNetwork,最上边一层是 Cocoa 中 Bonjour。常常我们不用与 socket
打交道,我们会使用经 Cocoa 封装的 CFNetwork 和 Bonjour
来成功抢先八分之四做事。

澳门金沙4787.com官网 8

Cocoa中的bonjouze?##

Bonjour在Cocoa世界里的落到实处Stack: 调用服务

澳门金沙4787.com官网 9

Cocoa 中实现bonjouze的 API :

澳门金沙4787.com官网 10

澳门金沙4787.com官网,上边简述一下一体流程 :

// 这个是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;

cocoa 很多零件都有三种达成,一种是依据 C 的以 CF 开首的类(CF=Core
Foundation),那是相比底层的;另一种是依照 Obj-C 的以 NS
开首的类(NS=Next
Step),那体系抽象层次更高,易于使用。对于网络框架也同等。Bonjour 中
NSNetService 也有对应的 CFNetService,NSInputStream 有相应的
CFInputStream。

理所当然这并不是说AirPrint正是万能的,而是苹果的强势话语权,打字与印刷机厂商愿意帮忙AirPrint协议,在打字与印刷机上付出相应的对电话机制,所以在打字与印刷机宣传单或进货网页中,仔细寻找会看到“支持苹果AirPrint”字样或许对应的图标。

探寻服务 :

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

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

通过 Bonjour,二个应用程序publish2个网络服务
service,然后网络中的其余程序就能活动发现这一个 service,从而能够向这些service 查询其 ip 和 port,然后经过获取的 ip 和 port 建立 socket
链接实行通讯。经常我们是经过 NSNetService 和 NSNet瑟维斯Browser 来利用
Bonjour 的,前者用于建立与发表 service,后者用于监听查询互联网上的
service。

澳门金沙4787.com官网 11

摸索之后,哪儿反馈音讯?

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

澳门金沙4787.com官网 12Bonjour-API

因而用HUAWEI间接打字与印刷,需求打字与印刷机协理有线互联网,更可信赖地说手提式有线电话机和打字与印刷机在互连网上能够互通;打字与印刷机要协助AirPrint协议;网络节点要求开放Bonjour服务协助。一些商店网络只怕会遮掩Bonjour服务造成AirPrint无法发现网络打字与印刷机,那些锅是网管的而并不是金立手提式有线电话机或打印机的,点击阅读原版的书文,即可查询补助隔空打字与印刷的享有打字与印刷设备!重回天涯论坛,查看越来越多

详尽使用 :

- (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];
}

总结的话,建立Bonjour连接一般须求四个步骤,即服务端公布服务、客户端浏览服务、客户端/服务端交互。

主要编辑:

澳门金沙4787.com官网 13Bonjour-API

客户端公布服务

先是通过NetService目的开头化服务,钦赐服务的域、类型、名称和端口,在同样网络中,服务类型名必须唯一,那样才能精准定位服务。Bonjour操作也必要异步举办,防止长日子阻碍主线程,所以大家将发表义务交给当前run
loop去调度。

 func setupService(){ let service = NetService.init(domain: "local.", type: "_dragon._tcp", name: "dragon", port: 2333) service.schedule(in: RunLoop.current, forMode: .commonModes) service.delegate = self let dictData = "http://fighting300.github.io".data(using: String.Encoding.utf8) let data = NetService.data(fromTXTRecord: ["node":dictData!]) service.setTXTRecord service.publish() self.service = service }

此外部需求要达成NetService协议NetServiceDelegate的代办方法跟踪服务发布新闻。

 func netServiceWillPublish(_ sender: NetService) { print("----netServiceWillPublish") } func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]) { print("----netService didNotPublish") }
客户端浏览服务

劳动公布成功后,会在代理方法中收受到宣布的音信,那时候要在客户端通过NetServiceBrowser目的来浏览本地的劳务,并出示本地网络中可用的劳动。能够透过searchForServices主意钦定须求摸索的服务类型和摸索的域,然后运转在mainRunLoop中。

 func netServiceDidPublish(_ sender: NetService) { print("----netService didPublish") let browser = NetServiceBrowser() browser.delegate = self browser.searchForServices(ofType: "_WE._tcp", inDomain: "local.") browser.schedule(in: RunLoop.current, forMode: .commonModes) RunLoop.current.run(until: Date.init(timeIntervalSinceNow: 300)) }

并且落成NetServiceBrowser的代办NetServiceBrowserDelegate方法netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool)来拍卖相应服务的解析。当前代码实例中尚无选用服务的服务,直接对扫描到的劳务来做分析。

 func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) { print("----netServiceBrowser didFind", service.domain, service.type, service.name, service.port,service) // 在界面选择对应的service self.service = service service.delegate = self service.resolve(withTimeout: 5) } func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) { print("----netServiceBrowser didRemove") }
客户端/服务端交互

最后,能够在NetService代理的辨析方法里func netServiceDidResolveAddress(_ sender: NetService),获得名称、类型、域、主机名和ip地址等音讯。

 func netServiceWillResolve(_ sender: NetService) { print("----netService willResolve") } func netServiceDidResolveAddress(_ sender: NetService) { print("----netService didResolveAddress", sender.name, sender.addresses, sender.hostName, sender.addresses?.first) let data = sender.txtRecordData() let dict = NetService.dictionary(fromTXTRecord: data!) let info = String.init(data: dict["node"]!, encoding: String.Encoding.utf8) print("mac info = ",info); } func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber]) { print("----netService didNotResolve ", errorDict) } func netServiceDidStop(_ sender: NetService) { print("----netServiceDidStop") } func netService(_ sender: NetService, didUpdateTXTRecord data: Data) { print("----netService didUpdateTXTRecord") } func netService(_ sender: NetService, didAcceptConnectionWith inputStream: InputStream, outputStream: OutputStream) { print("----netService didAcceptConnectionWith") } // MARK: util func IPFrom(data: Data) -> String { return "" }

事后依靠以上得到的音讯,须求经过Socket/Streams建立连接来进展通讯,本篇小说不对那有的做更加多的牵线,后续有时光再补偿完整。

参照文书档案

相关文章