Objective c 在Objective C中解析SSDP发现的最佳方法

Objective c 在Objective C中解析SSDP发现的最佳方法,objective-c,ios,http,nsurlrequest,ssdp,Objective C,Ios,Http,Nsurlrequest,Ssdp,我正在开发一个非常简单的应用程序,以使用SSDP发现设备,并试图找到解析此命令响应的最简单方法。我试图避免做大量的字符串或正则表达式操作 我尝试了以下两种方法: 方法1: 使用GCDAsyncUdpSocket,我能够成功发送discovery命令并获得以下响应: HTTP/1.1200正常 缓存控制:最大年龄=300 ST:roku:ecp USN:uuid:roku:ecp:1234567890 分机: 服务器:Roku UPnP/1.0 MiniUPnPd/1.4 地点: 这看起来像是

我正在开发一个非常简单的应用程序,以使用SSDP发现设备,并试图找到解析此命令响应的最简单方法。我试图避免做大量的字符串或正则表达式操作

我尝试了以下两种方法:

方法1: 使用GCDAsyncUdpSocket,我能够成功发送discovery命令并获得以下响应:


HTTP/1.1200正常
缓存控制:最大年龄=300
ST:roku:ecp
USN:uuid:roku:ecp:1234567890
分机:
服务器:Roku UPnP/1.0 MiniUPnPd/1.4
地点:


这看起来像是一个常规的HTTP响应,但使用GCDAsyncUdpSocket,我得到的响应是一个NSData对象,我可以轻松地将其转换为NSString。然而,理想的做法是以某种方式将其强制转换为NSHTTPURLResponse,然后使用其方法获取字段值。你知道这能不能做到吗

方法2: 我已经尝试使用一个常规的NSURLRequest来发送这个命令,然后我就可以得到一个NSHTTPURLResponse。但是,我不断收到一个错误,因为SSDP discovery命令要求我将此请求发送到端口1900。 我使用下面的代码发送“HTTP”请求,我知道它不是严格意义上的HTTP,但我认为它可能是发送此UDP命令的一种更简单的方法,因为要求看起来非常类似于HTTP

NSURL *url = [NSURL URLWithString:@"http://239.255.255.250:1900"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                            cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


[request setHTTPMethod:@"M-SEARCH *"];
[request setValue:@"239.255.255.250:1900" forHTTPHeaderField:@"Host"];
[request setValue:@"\"ssdp:discover\"" forHTTPHeaderField:@"Man"];
[request setValue:@"roku:ecp" forHTTPHeaderField:@"ST"];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
    if (connection)
    {
        NSLog(@"Connection success!");
    }
    else
    {
        NSLog(@"Connection failed!");   
    }
执行此操作时,连接成功,但NSURLConnection的didFailWithError委托中出现以下错误:

失败的错误域=NSPOSIXErrorDomain Code=47“操作无法完成。协议系列不支持地址系列”UserInfo=0x8875940{NSERRORFAILLINGURLKEY=http://239.255.255.250:1900/,NSErrorFailingURLStringKey=http://239.255.255.250:1900/}

只有当我使用端口1900时才会发生此错误,如果我忽略此端口或使用另一个更为HTTP友好的端口(如8080),则此错误才会发生,但显然,我试图发现的设备不会正确响应,除非它在端口1900中获得请求


感谢您提供的帮助。

端口1900已为SSDP修复。所有UPnP设备都固定在该端口上侦听,连接节点期望这样。你不能改变它。“开箱即用”是UPnP设计目标的一部分。此外,我的可可专业知识非常有限,但我认为
NSHTTPURLResponse
不会让事情变得更简单
[NSHTTPURLResponse allHeaderFields]
返回
NSDictionary
,这意味着您不再知道头字段的原始顺序。您需要知道
Ext:
后面是什么,这是一个元头


我建议您自己解析响应,这不应该比一个循环复杂得多,可以用行分隔响应,然后用
拆分。或者,不要尝试使用自己的SSDP握手,而是使用现成的Cocoish库,如Upnpx、Cyberlink或Platinum。仅仅在发现阶段,这可能会让人感觉像是不适当的重炮,但我想知道,在那之后,除了尝试在设备上调用一些操作之外,您还会对设备做些什么。

谢谢Pavel,我最终使用了GCDAsyncUdpSocket并手动解析响应。结果并不像我最初想象的那么复杂。