IOS上扫描发现mDns服务实现方法

IOS上类似的技术叫bonjour,其实核心也是mdns技术。官方的介绍在这添加链接描述
下面这篇博客对使用的介绍也很详细
https://www.jianshu.com/p/94c5848894e1
通俗的说,就是有人在局域网问:有叫xxx的吗?然后xxx就回复说:我就是,我微信号是xxxxxx(IP+PORT等信息)。

IOS上实现局域网扫描mDns核心是用的NetServiceBrowser对象,只要生成一个NetServiceBrowser,设置好delegete,然后去对应的方法中做操作即可。

官方的使用说明

比如作为客户端想扫描的局域网的服务是这个:

_testmdns._tcp.local.

那么可以采用下面的代码:
初始化:

	self.serviceBrowser = [[NSNetServiceBrowser alloc] init];
    [self.serviceBrowser setDelegate:self];
    [self.serviceBrowser searchForServicesOfType:@"_testmdns._tcp." inDomain:@"local."];

比较重要的两个方法:
监听是否发现了server:

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
           didFindService:(NSNetService *)aNetService
               moreComing:(BOOL)moreComing
{
	//设置代理,方便后续解析server的各种参数
    aNetService.delegate = self;
    NSLog(@"--didFindService---service name = %@", aNetService.name);
}

扫描到的对象是NSNetService,解析扫描到的server的参数:

#pragma mark NSNetServiceDelegate
- (void)netServiceDidResolveAddress:(NSNetService *)service {
    
    NSLog(@"----ResolveAddress----");
    for (NSData* data in [service addresses]) {
        char addressBuffer[100];
        struct sockaddr_in* socketAddress = (struct sockaddr_in*) [data bytes];
        int sockFamily = socketAddress->sin_family;
        if (sockFamily == AF_INET) {
            const char* addressStr = inet_ntop(sockFamily,
                                               &(socketAddress->sin_addr), addressBuffer,
                                               sizeof(addressBuffer));
            
            int port = ntohs(socketAddress->sin_port);
            
            [self._spinner stopAnimating];
            
            self.mdnsIp=[NSString stringWithFormat:@"%s",addressStr];
            self.mdnsport=[NSString stringWithFormat:@"%d",port];
            
            NSLog(@"Found service at %s:%d", addressStr, port);
            UIAlertView *mdnsAlert = [[UIAlertView alloc]
                                  initWithTitle:@"mDns扫描"
                                      message:[NSString stringWithFormat:@"name:%@ iP:%s:%d",service.name,addressStr,port]
                                  delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
            
            [mdnsAlert show];
        }
    }
    
}

解析除了IP和PORT,后面通信就比较好办了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章