import SystemConfiguration.CaptiveNetwork import NetworkExtension
import UIKit
class UDPSocketManager: NSObject, GCDAsyncUdpSocketDelegate {
static var shared = UDPSocketManager() var udpSocket: GCDAsyncUdpSocket? var udpError: String? var port = 26600 var isStarting: Bool = false override init() { super.init() } func start() { if isStarting { return } self.udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main) do { try udpSocket?.bind(toPort: UInt16(port), interface: udpError) try udpSocket?.enableBroadcast(true) try udpSocket?.beginReceiving() self.isStarting = true } catch { print("catch:\(String(describing: error))") self.isStarting = false } } func close() { self.isStarting = false udpSocket?.close() } func sendUdp(aaa: String, ssid: String, pw: String, address: Data) { let str = "ssid:\(ssid)pw:\(pw)" let asciiArr = str.asciiHexValues let instructStr = BasicProtocol.gatewayInstructionGeneration(frameNumStrArr: BasicProtocol.gatewayFrameNumStrArr, respFlagStrArr: ["80"], cmdIdStrArr: ["08", "01"], dataStrArr: asciiArr) HUD.showSuccess("收到数据:\(aaa)\n 发送数据:\(instructStr)", delay: 5) // self.udpSocket.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toHost: "192.168.4.1", port: UInt16(self.port), withTimeout: -1, tag: 0) self.udpSocket?.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toAddress: address, withTimeout: -1, tag: 0) } func sendUdp(str: String, address: Data) { let asciiArr = str.asciiValues let instructStr = BasicProtocol.gatewayInstructionGeneration(frameNumStrArr: BasicProtocol.gatewayFrameNumStrArr, respFlagStrArr: ["80"], cmdIdStrArr: ["08", "01"], dataStrArr: asciiArr) HUD.showSuccess("发送数据:\(instructStr)", delay: 5) self.udpSocket?.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toAddress: address, withTimeout: -1, tag: 0) } func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) { // 接受数据 let strData = data.map({ String(format: "%02x", $0) }).joined(separator: " ") HUD.showSuccess("收到数据:\(strData)", delay: 5) NotificationCenter.default.post(name: NSNotification.Name("UDPSocketNewMessage"), object: ["strData": strData, "address": address]) } func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) { // 发送数据成功 }
}
![]() | 1 Trinity888 OP 客户端 UDP 广播包:每 30s 发过来一次,以上是 APP 端接收。 现状是:IOS 端接收不稳定,并且接收到数据时间很长。有时候能接收到 1 条,回执后,就再收不到客户端 UDP 广播包,第二条数据了。 |