123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- //
- // 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<ifaddrs>? = 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")
- }
-
- }
|