2016-02-11 142 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