IHUdpRequest.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // IHUdpRequest.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/8/20.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import SwiftyJSON
  10. class IHUdpRequest : NSObject {
  11. lazy var clientSocket: GCDAsyncUdpSocket? = {
  12. var mainQueue = DispatchQueue.main
  13. var clientSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.global())
  14. return clientSocket
  15. }()
  16. var modelList = [gatewayInfor]()
  17. var complete : (([gatewayInfor]) ->())?
  18. }
  19. extension IHUdpRequest{
  20. func sendCommandGetGateway(){
  21. do{
  22. //不连接,直接发命令
  23. try clientSocket?.enableBroadcast(true)
  24. //let wifiIp = getLocalIPAddressForCurrentWiFi()
  25. //第二次就不用了,直接使用这个
  26. try clientSocket?.bind(toPort: 37030)
  27. //第一次要绑定interface,后面就不用了
  28. //try clientSocket?.bind(toPort: 37030, interface: wifiIp)
  29. try clientSocket?.beginReceiving()
  30. try clientSocket?.joinMulticastGroup("239.255.255.250")
  31. // try clientSocket?.connect(toHost: "255.255.255.255", onPort: 37030)
  32. let command = "scanning".data(using: .utf8)
  33. // clientSocket?.send(command!, withTimeout: 12, tag: 10)
  34. clientSocket?.send(command!, toHost: "255.255.255.255", port: 37030, withTimeout: -1, tag: 0)
  35. }catch{
  36. log.debug("绑定失败\(error)")
  37. }
  38. }
  39. // 获取当前wifi的IP地址
  40. func getLocalIPAddressForCurrentWiFi() -> String? {
  41. var address: String?
  42. // get list of all interfaces on the local machine
  43. var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil
  44. guard getifaddrs(&ifaddr) == 0 else {
  45. return nil
  46. }
  47. guard let firstAddr = ifaddr else {
  48. return nil
  49. }
  50. for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
  51. let interface = ifptr.pointee
  52. // Check for IPV4 or IPV6 interface
  53. let addrFamily = interface.ifa_addr.pointee.sa_family
  54. if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
  55. // Check interface name
  56. let name = String(cString: interface.ifa_name)
  57. if name == "en0" {
  58. // Convert interface address to a human readable string
  59. var addr = interface.ifa_addr.pointee
  60. var hostName = [CChar](repeating: 0, count: Int(NI_MAXHOST))
  61. getnameinfo(&addr, socklen_t(interface.ifa_addr.pointee.sa_len), &hostName, socklen_t(hostName.count), nil, socklen_t(0), NI_NUMERICHOST)
  62. address = String(cString: hostName)
  63. }
  64. }
  65. }
  66. freeifaddrs(ifaddr)
  67. return address
  68. }
  69. }
  70. extension IHUdpRequest:GCDAsyncUdpSocketDelegate{
  71. func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) {
  72. log.debug("didNotConnect")
  73. }
  74. func udpSocket(_ sock: GCDAsyncUdpSocket, didConnectToAddress address: Data) {
  75. log.debug("didConnectToAddress:\(String(data: address, encoding: String.Encoding.utf8))")
  76. }
  77. func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
  78. let result = data.string(encoding: .utf8)
  79. if let result = result{
  80. if result != "scanning" {
  81. log.debug("网关返回的信息:\(result)")
  82. do {
  83. let json = try JSON(data: data)
  84. var model = gatewayInfor()
  85. //"{\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}")
  86. model.SN = json["SN"].stringValue
  87. model.SW = json["SW"].stringValue
  88. model.HW = json["HW"].stringValue
  89. model.ip = json["ip"].stringValue
  90. model.port = json["port"].string
  91. modelList.append(model)
  92. complete!(modelList)
  93. } catch {
  94. }
  95. }
  96. }
  97. log.debug("didReceive")
  98. }
  99. func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {
  100. log.debug("didSendDataWithTag")
  101. }
  102. func udpSocketDidClose(_ sock: GCDAsyncUdpSocket, withError error: Error?) {
  103. log.debug("withError")
  104. }
  105. func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) {
  106. log.debug("didNotSendDataWithTag")
  107. }
  108. }