Получение ответа SSDP с использованием CocoaAsyncSocket в Swift

Я пытаюсь получить ответ SSDP с помощью swift с библиотекой CocoaAsyncSocket ( https://github.com/robbiehanson/CocoaAsyncSocket)

Я могу успешно отправить команду M-Search в группу многоадресной рассылки и получить ответ. Я посмотрел на wireshark ( http://i.imgur.com/pn6LB7R.png): Я вижу, что пакеты M-Search работают и ответы возвращаются, но я никогда не получаю NSData в моем приложении. (Кстати, я сейчас ищу только Roku)

Я реализовал делегат GCDAsyncUdpSocketDelegate и добавил функцию 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.
}

}

1 ответ

Решение

После того, как я много поигрался с кодом, я заставил его работать, я выкладываю код здесь, чтобы помочь кому-либо еще с этой проблемой.

когда я удалил:

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)

 }
Другие вопросы по тегам