Frage

Ich muß in der Lage sein, eine UDP-Nachricht zu senden, und auch eine erhalten, um SSDP Geräte im Netzwerk aus dem iPhone zu entdecken.

Ich weiß, dass ich das Paket an die Multicast-Adresse und meine HTTP-Request-Anforderungen in etwa so aussehen senden:

M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: ssdp:discover
Mx: 3
ST: "urn:schemas-upnp-org:device:InternetGatewayDevice:1"

in der Dokumentenlese es scheint, dass ich das alles mit CFNetwork tun können, und trotz Lesen (und Re-Lektüre der Dokumente) Ich kämpfe, um loszulegen. Kann jemand empfehlen und Tutorials oder Code-Schnipsel mich über den anfänglichen Lern ??Buckel zu bekommen?

Ich habe die CFNetwork Programmieranleitung bekommen:

http://developer.apple.com/ mac / Bibliothek / Dokumentation / Networking / Conceptual / CFNetwork / CFNetwork.pdf

und Beej Leitfaden für Netzwerkprogrammierung über Internet Sockets:

http://beej.us/guide/bgnet/

Danke

Dave

P. S.

Ich bin nicht in der Lage eine der 3rd-Party-Bibliotheken zu verwenden und Frameworks in diesem Fall.

War es hilfreich?

Lösung 3

OK, es endlich getan. Gefunden eine Klasse in der Public Domain (Danke Chris) genannt AsyncUdpSocket, dass Sie einen UDP-Socket erstellen können, die Sie dann auf Rundfunk und verbinden die Multicast-Adresse wenden können.

Es gibt eine schöne Senddata-Methode, komplett mit zu einem Run Schleife Hinzufügen Blockierung zu verhindern.

Ich hoffe, das hilft.

Dave

Andere Tipps

Ich habe erfolgreich SSDP-Such verwendet AsyncUdpSocket zu laufen und Steuerungen zu finden. Hier ist mein Code-Schnipsel:

Initialisieren und Einrichtung der Buchse:

//  AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
    AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
    [ssdpSock setDelegate:self];

Beachten Sie die erste Zeile als Kommentar gekennzeichnet. Ich habe bei den AsyncUdpSocket Foren einige Probleme mit Duplikaten. Ich glaube nicht, dass ich sie konfrontiert war, aber ich tat es trotzdem.

Ich habe die Fehlerprüfung, und es war nützlich, weil während meiner Debuggen ich nicht zu schließen Steckdosen und ich begann Buchse Setup sich Fehler:

NSError *socketError = nil;

    if (![ssdpSock bindToPort:1900 error:&socketError]) {
        NSLog(@"Failed binding socket: %@", [socketError localizedDescription]);
        return statusController;
    }

    if(![ssdpSock joinMulticastGroup:@"239.255.255.250" error:&socketError]){
        NSLog(@"Failed joining multicast group: %@", [socketError localizedDescription]);
        return statusController;
    }

    if (![ssdpSock enableBroadcast:TRUE error:&socketError]){
        NSLog(@"Failed enabling broadcast: %@", [socketError localizedDescription]);
        return statusController;
    }

    [ssdpSock sendData:[self.discoverControllerString dataUsingEncoding:NSUTF8StringEncoding]
                toHost:@"239.255.255.250"
                  port:1900
           withTimeout:2
                   tag:1];

Beachten Sie die Änderungen, die ich zu der Zeit heraus gemacht haben. Und dann tat schließlich das Setup erhalten, und schloss die Steckdose. Beachten Sie die Steckdose in der Nähe. Da ich in meiner eigenen Klasse bin, wenn ich dies läuft -. Über den Code nicht Arbeit für mich getan hat

[ssdpSock receiveWithTimeout: 2 tag:1];
    [NSTimer scheduledTimerWithTimeInterval: 5 target: self 
                                   selector:@selector(completeSearch:) userInfo: self repeats: NO]; 





    [ssdpSock closeAfterSendingAndReceiving];

Die wichtigste Änderung wahrscheinlich zurückkehrt „NEIN“, wenn ich nicht meinen Controller finden. Die erste Empfang war übrigens die Entdeckung Nachricht selbst wieder kommen. Und wenn ich lese, durch die AsyncUdpSocket.h Datei sorgfältig - Rückkehr „NEIN“, wenn es nicht ein Paket Ihnen geholfen suchen

.

Beachten Sie auch, dass ich ARC in meinem Code verwende, aber ich die AsyncUdpSocket ohne ARC-Unterstützung kompiliert.

-(void) completeSearch: (NSTimer *)t 
{

    NSLog(@"%s",__FUNCTION__);

    //[ssdpSock close];
    //ssdpSock = nil;

}


- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock 
     didReceiveData:(NSData *)data 
            withTag:(long)tag 
           fromHost:(NSString *)host 
               port:(UInt16)port
{
    NSLog(@"%s %ld %@ %d",__FUNCTION__,tag,host,port);
    NSString *aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    NSLog(@"%@",aStr);



    NSString *compareString = [aStr stringByPaddingToLength:[self.responseString length] withString:@"." startingAtIndex:0];
    //NSLog(@"%@", compareString);
    //NSLog(@"%@", self.responseString);

    if ([compareString isEqualToString:self.responseString])
    {
        NSLog(@"String Compare, Controller Found!");
        [self.controllerList addObject:aStr];
        //NSData *controllerIP = [aStr dataUsingEncoding:NSUTF8StringEncoding];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil];


        return YES;
    }

    return NO;

}

Ich habe den folgenden Code für SSDP-Suche in meiner App:

-(void)discoverDevices {
ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
[ssdpSock enableBroadcast:TRUE error:nil];
NSString *str = @"M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nST: mydev\r\n\r\n";    
[ssdpSock bindToPort:0 error:nil];
[ssdpSock joinMulticastGroup:@"239.255.255.250" error:nil];
[ssdpSock sendData:[str dataUsingEncoding:NSUTF8StringEncoding] 
         toHost: @"239.255.255.250" port: 1900 withTimeout:-1 tag:1];
[ssdpSock receiveWithTimeout: -1 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self 
           selector:@selector(completeSearch:) userInfo: self repeats: NO]; }


-(void) completeSearch: (NSTimer *)t {
NSLog(@"%s",__FUNCTION__);
[ssdpSock close];
ssdpSock = nil;}

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
NSLog(@"%s %d %@ %d",__FUNCTION__,tag,host,port);
NSString *aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",aStr);}

Es nutzt die AsyncUdpSocket von CocoaAsyncSocket .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top