使用网络的 SSDP UPnP 发现

问题描述

我正在尝试通过发送 SSDP 发现数据包来搜索网络中的 UPnP 设备。我可以发送它们,但我没有收到设备的响应,我不知道我错过了什么。也许这里有人可以帮助我。目标是不使用任何外部库(pods、spm 等)。

这是我所拥有的:

import UIKit
import Network

extension NWEndpoint.Port {
    static let ssdp: NWEndpoint.Port = 1_900
}

extension NWEndpoint.Host {
    static let ssdp: NWEndpoint.Host = "239.255.255.250"
}

class ViewController: UIViewController {
    private let parameters: NWParameters = {
        let parameters: NWParameters = .udp
        parameters.allowLocalEndpointReuse = true
        parameters.allowFastOpen = true

        return parameters
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .systemBackground

        do {
            try setupConnection()

        } catch {
            print(error.localizedDescription)
        }
    }

    private func setupConnection() throws {
        let endpoints: [NWEndpoint] = [
            .hostPort(host: .ssdp,port: .ssdp)
        ]

        let multicast = try NWMulticastGroup(for: endpoints)
        let group = NWConnectionGroup(with: multicast,using: parameters)

        group.setReceiveHandler(maximumMessageSize: 16384,rejectOversizedMessages: true) { (message,content,isComplete) in
            print("Received message from \(String(describing: message.remoteEndpoint))")
        }

        group.stateUpdateHandler = { [weak viewController = self] (state) in
            guard let viewController = viewController else {
                return
            }

            switch state {
            case .setup:
                print("Setup")

            case .waiting(let error):
                let message = String(format: "Waiting: %@",error.localizedDescription)
                print(message)

            case .ready:
                print("Ready")
                viewController.send(to: group)

            case .Failed(let error):
                let message = String(format: "Failed: %@",error.localizedDescription)
                print(message)

            case .cancelled:
                print("Cancelled")

            @unkNown default:
                print("UnkNown group state")
            }
        }

        group.start(queue: .main)
    }

    private func send(to group: NWConnectionGroup) {
        let message = "M-SEARCH * HTTP/1.1\r\nST: ssdp:all\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 1\r\n\r\n"
        let payload = message.data(using: .utf8)

        group.send(content: payload) { error in
            let message: String

            if let error = error {
                message = String(format: "Send completed with error %@",error.localizedDescription)

            } else {
                message = String(format: "Send completed")
            }

            print(message)
        }
    }
}

感谢任何帮助!同时谢谢你。

编辑:这也不起作用

import UIKit
import Network

extension NWEndpoint.Port {
    static let ssdp: NWEndpoint.Port = 1_900
}

extension NWEndpoint.Host {
    static let ssdp: NWEndpoint.Host = "239.255.255.250"
}

class ViewController: UIViewController {
    private let connectionQueue = dispatchQueue(label: "Connection")
    private let listenerQueue = dispatchQueue(label: "Listener")

    private let parameters: NWParameters = {
        let parameters: NWParameters = .udp
        parameters.allowLocalEndpointReuse = true

        return parameters
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .systemBackground

        do {
            try setupConnection()

        } catch {
            print(error.localizedDescription)
        }
    }

    private func setupConnection() throws {
        let listener = try NWListener(using: parameters)
        listener.stateUpdateHandler = { state in
            print("l-state",state)
        }

        listener.newConnectionHandler = { (connection) in
            print("connection",connection)
        }

        listener.start(queue: listenerQueue)

        let connection = NWConnection(host: .ssdp,port: .ssdp,using: parameters)
        connection.stateUpdateHandler = { [weak viewController = self] state in
            print("c-state",state)

            guard let viewController = viewController else {
                return
            }

            switch state {
            case .ready:
                viewController.send(to: connection)

            default: return
            }
        }

        connection.start(queue: connectionQueue)
    }

    private func send(to connection: NWConnection) {
        let message = "M-SEARCH * HTTP/1.1\r\nSt: ssdp:all\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nMX: 1\r\n\r\n"

        let payload = message.data(using: .utf8)
        connection.send(content: payload,completion: .contentProcessed { error in
            if let error = error {
                print(error.localizedDescription)
            } else {
                print("ok")
            }
        })

        connection.receive(minimumIncompleteLength: 1,maximumLength: 65536) { data,context,isComplete,error in
            print("data",data ?? "")
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...