gpt4 book ai didi

ios - 在 Swift 中使用 CocoaAsyncSocket 接收 SSDP 响应

转载 作者:搜寻专家 更新时间:2023-10-30 22:07:41 28 4
gpt4 key购买 nike

我正在尝试使用带有库 CocoaAsyncSocket ( https://github.com/robbiehanson/CocoaAsyncSocket ) 的 swift 接收 SSDP 响应

我可以成功地将 M-Search 命令发送到多播组并获得响应,我查看了 wireshark ( http://i.imgur.com/pn6LB7R.png ):我可以看到 M-Search 数据包发出并且响应返回但是我从来没有在我的应用程序中收到 NSData。 (顺便说一句,我现在正在寻找 Roku)

我已经实现了 GCDAsyncUdpSocketDelegate Delegate 并添加了 didReceiveData 函数,但是我从来没有得到数据。

我怀疑这部分有问题:

ssdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
ssdpSocket.bindToPort(ssdpPort, error: &error)
ssdpSocket.beginReceiving(&error)
ssdpSocket.enableBroadcast(true, error: &error)
ssdpSocket.connectToHost(ssdpAddres, onPort: ssdpPort, error: &error)
ssdpSocket.joinMulticastGroup(ssdpAddres, error: &error)

请看下面的示例代码:

import UIKit
class ViewController: UIViewController, GCDAsyncUdpSocketDelegate {

//ssdp stuff
var ssdpAddres = "239.255.255.250"
var ssdpPort:UInt16 = 1900
var ssdpSocket:GCDAsyncUdpSocket!
var ssdpSocketRec:GCDAsyncUdpSocket!
var error : NSError?

override func viewDidLoad() {
super.viewDidLoad()

ssdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
ssdpSocket.bindToPort(ssdpPort, error: &error)
ssdpSocket.beginReceiving(&error)
ssdpSocket.enableBroadcast(true, error: &error)
ssdpSocket.connectToHost(ssdpAddres, onPort: ssdpPort, error: &error)
ssdpSocket.joinMulticastGroup(ssdpAddres, error: &error)

//replace ST:roku:ecp with ST:ssdp:all to view all devices
let data = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: roku:ecp\r\nUSER-AGENT: iOS UPnP/1.1 TestApp/1.0\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)
ssdpSocket.sendData(data, withTimeout: 1, tag: 0)
}


func udpSocket(sock:GCDAsyncUdpSocket!,didConnectToAddress data : NSData!){
println("didConnectToAddress")
println(data)
}

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
println("didReceiveData")
println(data)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

最佳答案

在反复研究代码之后,我已经开始工作了,我将代码发布在这里以帮助其他人解决这个问题。

当我删除时:

ssdpSocket.connectToHost(ssdpAddres, onPort: ssdpPort, error: &error)

我能够接收数据,我怀疑这是以某种方式阻止了它.. 不确定如何或为什么,我猜我不需要连接到主机作为它的多播

现在可以使用以下代码:

let mSearchData = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: ssdp:all\r\nUSER-AGENT: iOS UPnP/1.1 TestApp/1.0\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding) //all devices

override func viewDidLoad() {
super.viewDidLoad()

//send M-Search
ssdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
ssdpSocket.sendData(mSearchData, toHost: ssdpAddres, port: ssdpPort, withTimeout: 1, tag: 0)

//bind for responses
ssdpSocket.bindToPort(ssdpPort, error: &error)
ssdpSocket.joinMulticastGroup(ssdpAddres, error: &error)
ssdpSocket.beginReceiving(&error)

}

didReceiveData 函数现在被调用,我可以打印响应:

 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)
println("From \(host!)")


let gotdata: NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
println(gotdata)

}

关于ios - 在 Swift 中使用 CocoaAsyncSocket 接收 SSDP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650143/

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