2014-12-25 12 views
5

Ich versuche, eine SSDP Reaktion mit schnellen mit der Bibliothek CocoaAsyncSocket (https://github.com/robbiehanson/CocoaAsyncSocket)Empfangen von SSDP-Antwort unter Verwendung CocoaAsyncSocket in Swift

ich den M-Search-Befehl an die Multicast-Gruppe senden kann, erfolgreich zu empfangen und eine Antwort erhalten, Ich habe mir den Wireshark angesehen (http://i.imgur.com/pn6LB7R.png): Ich kann sehen, dass die M-Search-Pakete ausgehen und die Antworten zurückkommen, aber ich bekomme niemals die NSData in meiner Anwendung. (Btw ich suche gerade nach einem Roku im Moment)

Ich habe das GCDAsyncUdpSocketDelegate Delegat eingeführt und die didReceiveData Funktion hinzugefügt, jedoch erhalte ich nie Daten.

Ich vermute, es ist etwas falsch in diesem Abschnitt ist:

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) 

Bitte beachten Sie folgende Beispielcode:

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. 
} 

} 

Antwort

8

Nach viel um mit dem Code zu spielen, habe ich es bekommen, zu arbeiten Ich poste hier den Code, um anderen mit diesem Problem zu helfen.

wenn ich entfernt:

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

konnte ich Daten empfangen, ich vermute, das es irgendwie blockiert wurde .. Nicht sicher, wie oder warum, ich vermute, ich brauche nicht zu dem verbinden Host als Multicast

Es funktioniert jetzt mit dem folgenden Code:

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 Funktion jetzt genannt wird, immer, und ich kann die Antwort drucken:

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) 

} 
+0

könnten Sie die Probe als Referenz zur Verfügung stellen? –