gpt4 book ai didi

iphone - iPhone 上的 SSDP

转载 作者:行者123 更新时间:2023-12-03 18:38:45 24 4
gpt4 key购买 nike

我需要能够发送 UDP 消息并接收消息,以便从 iPhone 发现网络上的 SSDP 设备。

我知道我需要将数据包发送到多播地址,并且我的 HTTP 请求需要如下所示:

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

从阅读文档来看,我似乎可以使用 CFNetwork 完成所有这些工作,尽管阅读(并重新阅读文档)我仍然很难开始。谁能推荐教程或代码片段来帮助我克服最初的学习困难?

我有 CFNetwork 编程指南:

http://developer.apple.com/mac/library/documentation/Networking/Conceptual/CFNetwork/CFNetwork.pdf

和 Beej 的使用 Internet 套接字进行网络编程的指南:

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

谢谢

戴夫

附注

在此实例中我无法使用任何第三方库和框架。

最佳答案

我已成功使用 AsyncUdpSocket 来运行 SSDP Discovery 并查找 Controller 。这是我的代码片段:

初始化并设置套接字:

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

注意第一行已被注释掉。我在AsyncUdpSocket forums上找到的一些重复的问题。我不认为我面对的是他们,但我还是这么做了。

我添加了错误检查,它很有用,因为在调试期间我没有关闭套接字,并且开始出现套接字设置失败:

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];

请注意我对超时所做的更改。最后完成接收设置,并关闭套接字。注意 socket 关闭。由于当我运行此代码时我在自己的类(class)中 - 上面的代码对我不起作用。

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





[ssdpSock closeAfterSendingAndReceiving];

最重要的变化可能是如果我没有找到我的 Controller ,则返回“NO”。第一次接收顺便是发现消息本身返回。当我仔细阅读 AsyncUdpSocket.h 文件时 - 当它不是您正在寻找的数据包时返回“NO”有帮助。

另请注意,我在代码中使用 ARC,但编译的 AsyncUdpSocket 没有 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;

}

关于iphone - iPhone 上的 SSDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3192989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com