美文网首页iOS智能家居
iOS 智能家居 UDP查找网关

iOS 智能家居 UDP查找网关

作者: 诠释残缺 | 来源:发表于2017-04-15 16:23 被阅读149次

    需求
    本地化:在内网的情况下,客户也可以控制设备,并且在App上显示。

    需要在外网情况下登陆过App,将账号下的网关和网关下在线的设备保存在本地。

    使用CocoaAsyncSocket进行开发

    github下载地址CocoaAsyncSocket
    可以通过CocoaPods进行导入配置也可以通过手动导入

    发送UDP包查找内网环境下的网关

    使用GCDAsyncUdpSocket

    1>准备工作
    #import "GCDAsyncUdpSocket.h"
    <GCDAsyncUdpSocketDelegate>
    
    {//    UDP广播
        NSData *udpData;//UDP包信息
        NSString *udpHost;//IP地址
        UInt16 udpPort;//端口号
    }
    
    2>创建UDP广播
    #pragma mark -创建UDP广播
    - (void)makeUDP{
        [_udpSocket close];
        _udpSocket = nil;
        _udpSocket.delegate = nil;
        // 创建UDP对象
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    
        NSError *error;
      // 绑定响应端口
        if (![_udpSocket bindToPort:8200 error:&error]) {
            NSLog(@"绑定响应端口%d失败%@",8200,error);
            [_udpSocket bindToPort:8200 error:&error];
        }
      // 加入组播组
    #没有搞懂  如不写会接受到两次相同的信息 其中一次收到信息的 IP地址前会有一串::ffff:
        if (![_udpSocket joinMulticastGroup:@"224.0.0.1" error:&error]) {
            NSLog(@"加入组播组失败%@",error);
            [_udpSocket joinMulticastGroup:@"224.0.0.1" error:&error];
        }
      // 开启组播设置
        if (![_udpSocket enableBroadcast:YES error:&error]) {
            NSLog(@"开启组播设置失败%@",error);
            [_udpSocket enableBroadcast:YES error:&error];
        }
    //    发送广播
        [self sendUDP];
    //  开始接受数据
        if (![_udpSocket beginReceiving:&error]) {
            NSLog(@"开始接受数据失败%@",error);
            [_udpSocket beginReceiving:&error];
        }
    }
    
    3>发送UDP广播
    #pragma mark -发送UDP包
    - (void)sendUDP{
    #UDP广播包----根据公司产品发送消息、询问公司
        Byte byte[] = {};//要发送的信息(byte)
        udpData = [NSData dataWithBytes:byte length:15];
        // UDP地址,端口
        udpHost = @"255.255.255.255";
        udpPort = 8200;
      //  发送
        [_udpSocket sendData:udpData toHost:udpHost port:udpPort withTimeout:-1 tag:0];
    }
    
    4>GCDAsyncUdpSocketDelegate代理方法
    #pragma mark -GCDAsyncUdpSocketDelegate 代理方法
    - (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag{
        
        NSLog(@"UDP广播已经发送");
    }
    
    - (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error{
        
        NSLog(@"UDP广播发送失败%@",error);
    }
    
    - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext{
        NSLog(@"UDP广播接收到的信息%@",data);
    #在这里根据数据进行解析,拿到IP地址、MAC地址、端口号跟本地存储的MAC地址进行比对,如果一样就与网关进行TCP连接
    }
    
    - (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError *)error{
        
        NSLog(@"UDP广播关闭:%@",error.description);
    }
    

    相关文章

      网友评论

        本文标题:iOS 智能家居 UDP查找网关

        本文链接:https://www.haomeiwen.com/subject/qhlnattx.html