首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Swift解析UPnP响应?

用Swift解析UPnP响应?
EN

Stack Overflow用户
提问于 2016-01-31 23:06:17
回答 1查看 1.4K关注 0票数 1

这个问题可能不需要如此具体,但我正在进行一个正在搜索UPnP设备的项目(工作非常好)。

我得到这样的数据;

代码语言:javascript
复制
func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {

        var host: NSString?
        var port1: UInt16 = 0
        GCDAsyncUdpSocket.getHost(&host, port: &port1, fromAddress: address)
        //print(host)

        let response: NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
        print(response)

    }

数据响应以NSString的形式返回,如下所示;

代码语言:javascript
复制
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=120
DATE: Sun, 31 Jan 2016 22:47:45 GMT
ST: upnp:rootdevice
USN: uuid:f7a65ab0-f527-4b85-a8ad-68104aa2b322::upnp:rootdevice
EXT:
SERVER: Linux/BHR4 UPnP/1.1 MiniUPnPd/1.8
LOCATION: http://192.168.1.1:49420/rootDesc.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: 1
BOOTID.UPNP.ORG: 1
CONFIGID.UPNP.ORG: 1337


HTTP/1.1 200 OK
Cache-Control: max-age=600
EXT: 
Location: http://192.168.1.1:1901/root.xml
SECURELOCATION.UPNP.ORG: https://192.168.1.1:1902/root.xml
Server: Linux/3.4 UPnP/2.0 bhr4/1.2
ST: upnp:rootdevice
USN: uuid:9518ecfc-cf2f-57e4-bb23-5182aa6a23cd::upnp:rootdevice
DATE: Wed, 19 Jan 2000 02:39:56 GMT
BOOTID.UPNP.ORG: 1


HTTP/1.1 200 OK
Cache-Control: max-age=600
EXT: 
Location: http://192.168.1.1:1901/root.xml
SECURELOCATION.UPNP.ORG: https://192.168.1.1:1902/root.xml
ST: urn:schemas-upnp-org:device:ManageableDevice:2
USN: uuid:9518acfc-cf2f-57e4-cc23-5a12aa6a23cd::urn:schemas-upnp-org:device:ManageableDevice:2
Server: Linux/3.4 UPnP/2.0 bhr4/1.2
DATE: Wed, 19 Jan 2000 02:39:56 GMT
BOOTID.UPNP.ORG: 1

我对如何解析XML或JSON响应有一定的了解,但由于这个响应似乎只是一个冗长的字符串,所以我试图弄清楚如何将数据解析到字典中,这样我就可以做一个;

for item in response { print(item.location) }

这不一定是特定于UPnP的,而是一个需要把握的总体前提。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 12:23:48

不久前,我还在开发一个快速的UPNP库。下面是我如何使用正则表达式的一种方法:https://github.com/ambientlight/ambientUPNP/blob/master/ambientUPNP/SSDPMessage.swift

您可以使用解析SSDP消息,但是对于UPNP事件,您不应该使用这种方法,因为它们是通过TCP的,因此您有一个流套接字,您应该相应地将其作为流读取。看看这里:https://github.com/ambientlight/ambientUPNP/blob/master/ambientUPNP/components/HTTPInternals.swift

引用(从UDP套接字读取-固定长度)https://github.com/ambientlight/ambientUPNP/blob/master/ambientUPNP/SSDPServer.swift

代码语言:javascript
复制
self.readMulticastSocket = try PosixInternals.initMulticastUDPSocket(SSDPDefaultPort, multicastAddress: SSDPMulticastAddress)
let readMulticastSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, UInt(readMulticastSocket), 0, _readMulticastQueue)

dispatch_source_set_event_handler(readMulticastSource) {

     do {

          let (data, senderAddress) = try PosixInternals.recvData(self.readMulticastSocket, readSize: SSDPDefaultReadSize)
          let message = try SSDPMessage.messageWithDataAndAddress(data, senderAddress: senderAddress)
          //print("\(message)\n")
          self._processMessage(message)

    } catch {
          print(error)
    }
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35120659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档