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

标签 ios swift udp cocoaasyncsocket logitech

我正在尝试开发一种方法,通过 iOS 应用程序在我的本地网络上发现 Logitech Harmony Hub 设备。这个概念的灵感来自 this 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)

}

}

当我编译这个时,我得到的唯一响应是我刚刚发出的消息;

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._tcp.local. 加上 Harmony 应该连接回的端口号 - 在您的情况下您硬编码 61991。
  • 大概是 Harmony 收到了这个数据包,识别了这个消息,然后启动一个连接回到在指定端口(在本例中为 61991)上发送广播的设备。

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

关于ios - iOS 上的 UDP 广播/设备发现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351806/

相关文章:

ios - 以编程方式添加 subview 后自动调整单元格大小

ios - Swift 保留周期

java - 在 ObjectInputStream 上调用 readObject() 时获取 java.io.EOFException

linux - 我如何确定哪个进程在 Linux 上进行 UDP 通信?

ios - 带约束的嵌套 Collection View 的意外行为 (Swift 4)

ios - 防止在 iOS 上的动画期间从左上角弹出 View

ios - 如何使用AVKit播放HTTP流视频

iOS UITableView 正在绘制奇怪的单元格

ios - 如何在 swift5 和 Alamofire 5 beta 版本中获取和保存响应?

udp - 在 Vagrant 和 VirtualBox Env​​ 中使用 `socat` 进行多播