2014-12-25 18 views
5

Tôi đang cố gắng để nhận được phản hồi SSDP sử dụng nhanh chóng với CocoaAsyncSocket thư viện (https://github.com/robbiehanson/CocoaAsyncSocket)Nhận SSDP phản ứng sử dụng CocoaAsyncSocket trong Swift

tôi thành công có thể gửi lệnh M-Search vào nhóm multicast và nhận được một phản ứng, Tôi đã nhìn vào wireshark (http://i.imgur.com/pn6LB7R.png): Tôi có thể thấy các gói M-Search sẽ xuất hiện và các phản hồi sẽ trở lại nhưng tôi không bao giờ nhận được NSData trong ứng dụng của mình. (Btw Tôi đang tìm kiếm chỉ cho một Roku tại thời điểm này)

Tôi đã thực hiện các đại biểu GCDAsyncUdpSocketDelegate và thêm các didReceiveData func, tuy nhiên tôi không bao giờ nhận được dữ liệu.

tôi nghi ngờ có cái gì đó sai trong phần này:

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) 

Xin xem mẫu mã bên dưới:

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

} 

Trả lời

8

Sau khi chơi nhiều xung quanh với mã này, tôi đã nhận được nó để làm việc, Tôi đang đăng mã ở đây để giúp đỡ bất kỳ ai khác về vấn đề này.

khi tôi loại bỏ:

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

tôi đã có thể nhận dữ liệu, tôi nghi ngờ điều này đã được ngăn chặn nó bằng cách nào đó .. Không chắc thế nào hay tại sao, tôi đoán tôi không cần phải kết nối với đăng cai như multicast của nó

Nó làm việc bây giờ sử dụng đoạn mã sau:

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 chức năng hiện đang nhận được gọi và tôi có thể in các phản ứng:

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

bạn có thể cung cấp mẫu để tham khảo không? –

Các vấn đề liên quan