// // IHUdpRequest.swift // Inhealth // // Created by weclouds on 2020/8/20. // Copyright © 2020 weclouds. All rights reserved. // import UIKit import SwiftyJSON class IHUdpRequest : NSObject { lazy var clientSocket: GCDAsyncUdpSocket? = { var mainQueue = DispatchQueue.main var clientSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.global()) return clientSocket }() var modelList = [gatewayInfor]() var complete : (([gatewayInfor]) ->())? } extension IHUdpRequest{ func sendCommandGetGateway(){ do{ //不连接,直接发命令 try clientSocket?.enableBroadcast(true) //let wifiIp = getLocalIPAddressForCurrentWiFi() //第二次就不用了,直接使用这个 try clientSocket?.bind(toPort: 37030) //第一次要绑定interface,后面就不用了 //try clientSocket?.bind(toPort: 37030, interface: wifiIp) try clientSocket?.beginReceiving() try clientSocket?.joinMulticastGroup("239.255.255.250") // try clientSocket?.connect(toHost: "255.255.255.255", onPort: 37030) let command = "scanning".data(using: .utf8) // clientSocket?.send(command!, withTimeout: 12, tag: 10) clientSocket?.send(command!, toHost: "255.255.255.255", port: 37030, withTimeout: -1, tag: 0) }catch{ log.debug("绑定失败\(error)") } } // 获取当前wifi的IP地址 func getLocalIPAddressForCurrentWiFi() -> String? { var address: String? // get list of all interfaces on the local machine var ifaddr: UnsafeMutablePointer? = nil guard getifaddrs(&ifaddr) == 0 else { return nil } guard let firstAddr = ifaddr else { return nil } for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) { let interface = ifptr.pointee // Check for IPV4 or IPV6 interface let addrFamily = interface.ifa_addr.pointee.sa_family if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) { // Check interface name let name = String(cString: interface.ifa_name) if name == "en0" { // Convert interface address to a human readable string var addr = interface.ifa_addr.pointee var hostName = [CChar](repeating: 0, count: Int(NI_MAXHOST)) getnameinfo(&addr, socklen_t(interface.ifa_addr.pointee.sa_len), &hostName, socklen_t(hostName.count), nil, socklen_t(0), NI_NUMERICHOST) address = String(cString: hostName) } } } freeifaddrs(ifaddr) return address } } extension IHUdpRequest:GCDAsyncUdpSocketDelegate{ func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) { log.debug("didNotConnect") } func udpSocket(_ sock: GCDAsyncUdpSocket, didConnectToAddress address: Data) { log.debug("didConnectToAddress:\(String(data: address, encoding: String.Encoding.utf8))") } func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) { let result = data.string(encoding: .utf8) if let result = result{ if result != "scanning" { log.debug("网关返回的信息:\(result)") do { let json = try JSON(data: data) var model = gatewayInfor() //"{\n\t\"SN\":\"EE202008070001\",\n\t\"SW\":\"1.0.2.30\",\n\t\"HW\":\"0003AA01\",\n\t\"ip\":\"10.0.0.9\",\n\t\"port\":\"37032\"\n\t}") model.SN = json["SN"].stringValue model.SW = json["SW"].stringValue model.HW = json["HW"].stringValue model.ip = json["ip"].stringValue model.port = json["port"].string modelList.append(model) complete!(modelList) } catch { } } } log.debug("didReceive") } func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) { log.debug("didSendDataWithTag") } func udpSocketDidClose(_ sock: GCDAsyncUdpSocket, withError error: Error?) { log.debug("withError") } func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) { log.debug("didNotSendDataWithTag") } }