Ho utilizzato AsyncUdpSocket correttamente per eseguire SSDP Discovery e trovare i controller. Qui sono i miei frammenti di codice:
inizializzazione e la configurazione della presa:
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
Nota la prima linea commentata. Ho trovato su AsyncUdpSocket forums alcuni problemi con i duplicati. Non penso di essere di fronte a loro, ma l'ho fatto comunque.
ho aggiunto il controllo degli errori, ed è stato utile perché durante la mia debug non ero chiudendo le prese e ho cominciato a ricevere gli errori di impostazione presa:
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];
notare i cambiamenti che ho fatto per il time out. E poi finalmente ha fatto il setup di ricezione, e ha chiuso lo zoccolo. Notare la chiusura della presa. Dato che sono nella mia classe quando sto eseguendo questo, il codice sopra non ha funzionato per me.
[ssdpSock receiveWithTimeout: 2 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self
selector:@selector(completeSearch:) userInfo: self repeats: NO];
[ssdpSock closeAfterSendingAndReceiving];
Il cambiamento più importante probabilmente è stato restituire "NO" se non ho trovato il mio controller. La prima ricezione fu incidentalmente il messaggio di scoperta stesso che ritornava. E quando leggo attentamente il file AsyncUdpSocket.h - restituisco "NO" quando non è un pacchetto che stai cercando aiutato.
Si noti inoltre che sto usando ARC nel mio codice ma ho compilato AsyncUdpSocket senza supporto ARC.
-(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;
}
Ciao Savvybud, sembra ok, ma dalla parte superiore della mia testa (è stato qualche tempo fa l'ho fatto) Penso che il tuo problema risiede nel bindToPort. Sono abbastanza sicuro che questa sia la porta che invierà i messaggi e non dovrebbe essere 1900 poiché è riservata ai multicast. Se si imposta questo a zero, il sistema ne assegnerà uno e dovrebbe funzionare. sendData sembra a posto. –
Magic Bullet Dave, tu sei l'uomo! – savvybud