智能交互(二) - bonjour的基本使用

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

bonjour是什么?##

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

为什么要使用它?##

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

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

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

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

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

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

bonjouze怎么用?##

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

->寻址。###

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

-> 命名。###

我们不想通过冷冰冰的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"的名字。

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

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

-> 服务搜索。###

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

实现原理:

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

Cocoa中的bonjouze?##

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


Cocoa 中实现bonjouze的 API :

下面简述一下整个流程 :

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

搜索服务 :

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

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

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

详细使用 :

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容