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

Zba*_*itZ 5 udp ios cocoaasyncsocket logitech swift

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

我正在使用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)

}

}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我得到的唯一回应是我刚发出的消息;

didSendDataWithTag
From ::ffff:192.168.1.101
_logitech-reverse-bonjour._tcp.local.
61991
From 192.168.1.101
_logitech-reverse-bonjour._tcp.local.
61991
Run Code Online (Sandbox Code Playgroud)

我担心我在这里对广播有一个概念上的理解问题,我真诚地希望有人能够指出我的资源或帮助理解为什么我没有从我的代码中的设备得到任何响应.

谢谢!

Pau*_*w11 3

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

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

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