2016-02-11 144 views
4

我正在努力開發一種方法,從iOS應用程序發現本地網絡上的Logitech Harmony Hub設備。這個概念受到this NODE.JS項目的啓發,該項目似乎將UDP廣播發送到255.255.255.255地址,然後獲取Logitech的IP地址(這就是我所要做的)。在我的Mac上測試家庭網絡上的NODE.JS項目時,它成功找到了Logitech Harmony Hub。iOS上的UDP廣播/設備發現?

我正在使用CocoaASyncSocket,並且必須承認,我對UDP廣播/發現如何工作的理解可能會在這裏出現偏差。這是我正在做的事情;

import UIKit 
import CocoaAsyncSocket 

class ViewController: UIViewController, GCDAsyncUdpSocketDelegate { 

var address = "255.255.255.255" 
var port:UInt16 = 5224 
var socket:GCDAsyncUdpSocket! 
var socketReceive:GCDAsyncUdpSocket! 
var error : NSError? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let message = "_logitech-reverse-bonjour._tcp.local.\n61991".dataUsingEncoding(NSUTF8StringEncoding) 

    socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
    socket.sendData(message, toHost: address, port: port, withTimeout: 1000, tag: 0) 

    do { 
     try socket.bindToPort(port) 
    } catch { 
     print(error) 
    } 

    do { 
     try socket.enableBroadcast(true) 
    } catch { 
     print(error) 
    } 

    do { 
     try socket.beginReceiving() 
    } catch { 
     print(error) 
    } 

} 

    func udpSocket(sock: GCDAsyncUdpSocket!, didConnectToAddress address: NSData!) { 
     print("didConnectToAddress"); 
    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didNotConnect error: NSError!) { 
     print("didNotConnect \(error)") 
    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didSendDataWithTag tag: Int) { 
     print("didSendDataWithTag") 
    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didNotSendDataWithTag tag: Int, dueToError error: NSError!) { 
     print("didNotSendDataWithTag") 
    } 

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) 
    print("From \(host!)") 

    let gotdata: NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)! 
    print(gotdata) 

} 

} 

當我編譯這個時,我得到的唯一回應是我剛發出的消息;

didSendDataWithTag 
From ::ffff:192.168.1.101 
_logitech-reverse-bonjour._tcp.local. 
61991 
From 192.168.1.101 
_logitech-reverse-bonjour._tcp.local. 
61991 

我擔心,我與這裏的廣播的概念理解問題,我真誠地希望有人也許能夠指出我的資源或有助於理解爲什麼我沒有收到來自任何迴應設備在我的代碼。

謝謝!

回答

2

從代碼的外觀看,您似乎只實現了一半的解決方案。它的工作方式是:

  • 廣播消息被髮送到端口5224。這個消息包括字符串logitech-reverse-bonjour._tcp.local.加上和諧應該回連接的端口號 - 在你的情況已經硬編碼了61991.
  • 據推測,Harmony收到這個數據包後,會識別該消息,然後啓動一個連接回到在指定端口發送廣播的設備(本例中爲61991)。

由於您的應用程序未在此端口上偵聽,您不會收到任何響應。這是在node.js項目中的responseCollector.js文件中實現的

+0

感謝您澄清@ Paulw11。這非常有幫助。爲了進一步實現這一點,我是否需要實現某種'socket.connectToHost'函數來監聽指定的主機?我正在研究如何在我的代碼中實現該功能。 – ZbadhabitZ

+0

它不會是'connectToHost',而是一個監聽功能 - Harmony集線器將連接到您的設備 – Paulw11

+0

Thanks @ Paulw11。我的答案是正確的,因爲你的答案明確說明了UDP廣播是如何工作的,儘管請不要冒犯,因爲我可能需要打開另一個關於如何使用CocoaASyncSocket實現你的建議的問題,因爲我還沒有弄清楚如何同時播放和收聽響應。 – ZbadhabitZ