Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS上的UDP广播/设备发现?_Ios_Swift_Udp_Cocoaasyncsocket_Logitech - Fatal编程技术网

iOS上的UDP广播/设备发现?

iOS上的UDP广播/设备发现?,ios,swift,udp,cocoaasyncsocket,logitech,Ios,Swift,Udp,Cocoaasyncsocket,Logitech,我正在努力开发一种方法,从iOS应用程序中发现本地网络上的Logitech Harmony Hub设备。这个概念受到NODE.JS项目的启发,它似乎向255.255.255.255地址发送UDP广播,然后获取Logitech的IP地址(这就是我所追求的)。从Mac在我的家庭网络上测试NODE.JS项目时,它成功地找到了Logitech Harmony Hub 我使用的是CoCoCoaAsyncSocket,我必须承认,我对UDP广播/发现工作原理的理解可能有偏差。这就是我正在做的 import

我正在努力开发一种方法,从iOS应用程序中发现本地网络上的Logitech Harmony Hub设备。这个概念受到NODE.JS项目的启发,它似乎向
255.255.255.255
地址发送UDP广播,然后获取Logitech的IP地址(这就是我所追求的)。从Mac在我的家庭网络上测试NODE.JS项目时,它成功地找到了Logitech Harmony Hub

我使用的是
CoCoCoaAsyncSocket
,我必须承认,我对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
我担心我对这里的广播有一个概念上的理解问题,我真诚地希望有人能给我指一个资源或帮助我理解为什么我的代码中没有从设备得到任何响应


谢谢

从代码的外观来看,您似乎只实现了解决方案的一半。它的工作方式是:

  • 广播消息被发送到端口5224。此消息包括字符串
    logitech reverse bonjour.\u tcp.local.
    以及Harmony应连接回的端口号-在您的情况下,您已硬编码61991
  • 据推测,Harmony接收到该数据包,识别该消息,然后发起一个连接,返回到在指定端口上发送广播的设备(本例中为61991)

由于您的应用程序未在此端口上侦听,因此您不会得到任何响应。这在node.js项目的文件中实现

感谢您的澄清,@Paulw11。这非常有帮助。为了进一步实现这一点,我是否需要实现某种类型的
socket.connectToHost
函数,以便按照您的指定在主机上侦听?我正在研究如何在我的代码中实现该功能。它不是
connectToHost
,而是一个监听功能-Harmony hub将连接到您的设备hanks@Paulw11。我认为你的答案是正确的,因为你的答案明确说明了UDP广播是如何工作的,不过请不要生气,因为我可能需要提出另一个问题,关于如何使用CocoaASyncSocket实现你的建议,因为我还没有弄清楚如何同时广播和收听响应。