2014-12-25 16 views
5

sto cercando di ricevere una risposta SSDP utilizzando rapida con il CocoaAsyncSocket libreria (https://github.com/robbiehanson/CocoaAsyncSocket)Ricezione risposta SSDP utilizzando CocoaAsyncSocket a Swift

posso inviare correttamente il comando M-Search al gruppo multicast e ottenere una risposta, Ho visto il wireshark (http://i.imgur.com/pn6LB7R.png): Posso vedere i pacchetti di M-Search uscire e le risposte tornare ma non ho mai ricevuto NSData nella mia applicazione. (A proposito, sto cercando solo un Roku al momento)

Ho implementato il GCDAsyncUdpSocketDelegate Delegate e ho aggiunto il funzione didReceiveData, tuttavia non ho mai ricevuto i dati.

Sospetto che ci sia qualcosa di sbagliato in questa sezione:

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) 

Si prega di consultare il codice di esempio:

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

} 

risposta

8

Dopo molto giocare con il codice, ho ottenuto di lavorare, Sto postando il codice qui per aiutare chiunque altro con questo problema.

quando ho rimosso:

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

ero in grado di ricevere i dati, ho il sospetto che questo è stato il blocco in qualche modo .. Non so come o perché, sto cercando di indovinare non ho bisogno di connettersi al ospiterà come multicast

e 'ora di lavoro utilizzando il seguente codice:

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) 

} 

funzione didReceiveData è ora sempre chiamato e io in grado di stampare la risposta:

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

potresti gentilmente fornire il campione per riferimento? –

Problemi correlati