0

所以我这里有一个情况。场景是我有一个连接到路由器的物联网设备,而我的 iPhone 连接到同一个路由器。为了从我的 iOS 应用程序中获取硬件设备的本地 IP 和端口,我将 UDP 消息发送到 192.168.1.<1-255>:9553。9553 是硬件设备的端口。

在我点击正确的 IP(比如 192.168.1.124:9553)后,硬件设备会按预期返回正确的端口(例如 192.168.1.124:42056)。

但问题来自iOS+GCDAsyncUdpSocket,它有时工作,有时不工作。

它在两者之间停止工作。无论我重新启动应用程序多少次,它都无法正常工作。

让它再次工作的唯一方法是打开/关闭 iPhone 的 WiFi。

我不认为这是 GCDAsyncUdpSocket 的问题,但 iOS 正在限制 IP 的扫描。我该如何摆脱它。我正在使用 iOS 14.5,是的,我知道多播权利,但这不是多播广播,即使没有此权利,它有时也可以工作。

我用来创建套接字的代码:

private func createSocket(){
        do {
            socketIPScan = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
            
            try socketIPScan.enableBroadcast(true)
            try socketIPScan.bind(toPort: 0)
            try socketIPScan.beginReceiving()
//            DispatchQueue.main.asyncAfter(deadline: .now() + 1.3) {
//                self.socketIPScan.close()
//            }
        } catch let error as NSError {

        }
    }

我如何发送 UDP 消息:

if let wifiAddress = LPUtil.getWiFiAddress() {
            var arr = wifiAddress.components(separatedBy: ".")
            if arr.count == 4
            {
                let dispatchGroup = DispatchGroup()
                let hubId = "ffffffffffffffff"
                for i in 1 ..< 255
                {
                    dispatchGroup.enter()
                    
                    let ipScanPacket = LPIpScanPacket(hubId : hubId)
                    arr[3] = "\(i)"
                    let HOST = arr.joined(separator: ".")
                    let pkt = ipScanPacket.toLPPacket()
                    socketIPScan.send(pkt, toHost: HOST, port: 9005 , withTimeout: LPConstants.UDP_PING_PONG_TIMEOUT , tag: self.getTag())
                    dispatchGroup.leave()
                    
                    
                }
                dispatchGroup.notify(queue: .main) {
                    
                }
            }
        }

我该如何解决这个问题?已经咨询了几乎所有关于此的 SO 问题。

4

0 回答 0