2014-12-25 5 views
5

내가 성공적으로 멀티 캐스트 그룹에 M-검색 명령을 보내고 응답을 얻을 수스위프트

라이브러리 CocoaAsyncSocket (https://github.com/robbiehanson/CocoaAsyncSocket)와 빠른 사용하여 SSDP 응답을받을하기 위해 노력하고있어에서 CocoaAsyncSocket를 사용하여 SSDP 응답을 받기, 나는 wireshark (http://i.imgur.com/pn6LB7R.png)를 보았다 : M-Search 패킷이 나가고 응답이 되돌아 오는 것을 볼 수는 있지만 애플리케이션에서 NSData를 수신하지 못한다. (Btw 나는 지금 막 Roku를 찾고있다.)

나는 GCDAsyncUdpSocketDelegate Delegate를 구현했고 didReceiveData func를 추가했다. 그러나 나는 결코 데이터를 얻지 못했다.

나는이 부분에서 문제가있는 생각 :

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

} 

답변

8

많은 코드로 장난 후에, 나는이 일을 쪘 구만, 나는이 문제로 다른 사람들을 돕기 위해 코드를 게시하고있다. 내가 제거 할 때

는 :

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) 

} 
+0

샘플을 참고로 제공 할 수 있습니까? –