UDP Broadcast / обнаружение устройств на iOS?



Я пытаюсь разработать средство обнаружения устройств Logitech Harmony Hub в моей локальной сети с помощью приложения iOS. Концепция вдохновлена этим узлом.Проект JS, который, кажется, отправляет широковещательную передачу UDP на адрес 255.255.255.255, а затем получает IP-адрес Logitech (это все, что мне нужно). При тестировании узла.Проект JS в моей домашней сети с моего Mac, он успешно находит 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


Я боюсь, что у меня есть концептуальная проблема понимания с трансляцией здесь, и искренне надеюсь, что кто-то может указать мне на ресурс или помочь понять, почему я не получаю никакого ответа от устройства в моем коде.

Спасибо!

612   1  

1 ответ:

Судя по внешнему виду кода, Вы реализовали только половину решения. Это работает следующим образом:

  • широковещательное сообщение отправляется на порт 5224. Это сообщение включает строку logitech-reverse-bonjour._tcp.local. плюс номер порта, к которому должна подключиться гармония - в вашем случае вы жестко закодировали 61991.
  • предположительно гармония получает этот пакет, распознает сообщение и затем инициирует соединение обратно к устройству, которое отправило широковещательную передачу на назначенный порт. (61991 в данном случае).

Поскольку ваше приложение не прослушивает этот порт, вы не получите никакого ответа. Это реализовано в responseCollector.JS файл в узле.JS project

Comments

    Ничего не найдено.