He utilizado AsyncUdpSocket con éxito para ejecutar SSDP Discovery y encontrar controladores. Aquí están mis fragmentos de código:
inicializar y configurar el zócalo:
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
nota la primera línea comentada. Encontré en el AsyncUdpSocket forums algunos problemas con los duplicados. No creo que los enfrentara, pero lo hice de todos modos.
he añadido la comprobación de errores, y era útil porque durante mi depuración no estaba cerrando los zócalos y empecé a recibir errores de instalación del zócalo:
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];
Aviso los cambios que he hecho para el tiempo de espera. Y finalmente hizo la configuración de recepción y cerró el socket. Tenga en cuenta que el socket está cerca. Como estoy en mi propia clase cuando estoy ejecutando esto, el código anterior no funcionó para mí.
[ssdpSock receiveWithTimeout: 2 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self
selector:@selector(completeSearch:) userInfo: self repeats: NO];
[ssdpSock closeAfterSendingAndReceiving];
El cambio más importante fue probablemente volviendo "NO" si no he encontrado mi controlador. La primera recepción fue, por cierto, el mensaje de descubrimiento en sí. Y cuando leo atentamente el archivo AsyncUdpSocket.h, devuelvo "NO" cuando no está ayudando un paquete que está buscando.
También tenga en cuenta que estoy usando ARC en mi código, pero compilé AsyncUdpSocket sin compatibilidad con 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;
}
Hola Savvybud, se ve bien, pero desde lo más alto de mi cabeza (hace un tiempo esto lo hice), creo que tu problema está en bindToPort. Estoy bastante seguro de que este es el puerto donde se enviarán los mensajes de devolución y no debería ser 1900, ya que está reservado para multidifusiones. Si establece esto en cero, el sistema asignará uno y debería funcionar. sendData se ve bien. –
Magic Bullet ¡Dave, eres el hombre! – savvybud