iOS 上的 UDP Broadcast/Device 发现?
UDP Broadcast/Device Discovery on iOS?
我正在尝试开发一种方法,通过 iOS 应用程序在我的本地网络上发现 Logitech Harmony Hub 设备。这个概念受到this NODE.JS项目的启发,它似乎向255.255.255.255
地址发送UDP广播,然后获取罗技的IP地址(这就是我所追求的) .当从我的 Mac 测试我家庭网络上的 NODE.JS 项目时,它成功找到了 Logitech Harmony Hub。
我正在使用 CocoaASyncSocket
,并且必须承认,我对 UDP broadcast/discovery 工作原理的理解在这里可能有偏差。这就是我正在做的事情;
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)上发送广播的设备。
由于您的应用未侦听此端口,因此您不会收到任何响应。这是在node.js项目
的responseCollector.js文件中实现的
我正在尝试开发一种方法,通过 iOS 应用程序在我的本地网络上发现 Logitech Harmony Hub 设备。这个概念受到this NODE.JS项目的启发,它似乎向255.255.255.255
地址发送UDP广播,然后获取罗技的IP地址(这就是我所追求的) .当从我的 Mac 测试我家庭网络上的 NODE.JS 项目时,它成功找到了 Logitech Harmony Hub。
我正在使用 CocoaASyncSocket
,并且必须承认,我对 UDP broadcast/discovery 工作原理的理解在这里可能有偏差。这就是我正在做的事情;
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)上发送广播的设备。
由于您的应用未侦听此端口,因此您不会收到任何响应。这是在node.js项目
的responseCollector.js文件中实现的