UDP Broadcast/Device Discovery на iOS?

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

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

Спасибо!


person ZbadhabitZ    schedule 11.02.2016    source источник


Ответы (1)


Судя по коду, вы реализовали только половину решения. Как это работает:

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

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

person Paulw11    schedule 12.02.2016
comment
Спасибо за разъяснения, @Paulw11. Это было чрезвычайно полезно. Для дальнейшего выполнения этого мне нужно реализовать какую-то функцию socket.connectToHost для прослушивания на хосте, как вы указали? Я изучаю, как реализовать эту функцию в моем коде. - person ZbadhabitZ; 12.02.2016
comment
Это будет не connectToHost, а функция прослушивания — концентратор Harmony подключится к вашему устройству. - person Paulw11; 12.02.2016
comment
Спасибо @Paulw11. Я отмечаю ваш ответ как правильный, поскольку ваш ответ определенно разъясняет, как работает широковещательная передача UDP, хотя, пожалуйста, не обижайтесь, поскольку мне может потребоваться открыть еще один вопрос о том, как на самом деле реализовать ваше предложение с помощью CocoaASyncSocket, поскольку мне еще предстоит выяснить как одновременно транслировать и слушать ответ. - person ZbadhabitZ; 12.02.2016