最近需要在Swift项目中获取路由器的网关地址,在网上找了半天的代码也没发现太多有价值的东西,而且大多都是OC代码,很少有Swift的相关代码,只找到了一个通过Swift代码获取设备IP的代码,最后实在没办法只能曲线救国了。
在路由器默认登录地址方面,主流品牌默认地址都是一样的,但也有不少国际品牌或者不太出名的路由器品牌默认地址不一样,以下一起来看:
绝大多数主流品牌路由器默认管理登录地址为:http://192.168.1.1 /或者 http://192.168.0.1/
其它品牌路由器默认登录地址汇总如下:
实达2110EH ROUTER路由器默认管理地址: http://192.168.10.1/
D-LINK路由器默认管理地址: http://192.168.0.1
阿尔法路由器默认管理地址: http://192.168.18.1
全向QL1680路由器默认管理地址: http://10.0.0.2
sunrise DSL-802E_R3A路由器默认管理地址: http://10.0.0.2/
GVC DSL-802E/R3A路由器默认管理地址: http://10.0.0.2/
艾玛 701g路由器默认管理地址: http://192.168.101.1或者http://192.168.0.1/
实达2110EH ROUTER路由器默认管理地址: http://192.168.10.1/
我这里有两个品牌的路由器,网关分别是:
TP-Link http://192.168.1.1/
小米 http://192.168.31.1/
华为 http://192.168.3.1/
根据以上的总结,这个网关大体都差不多的,我们可以通过获取设备的IP地址来修改为网关的地址,不过这种方法纯属无奈之举,目前的水平达不到,只能先这样用着了。
下面上代码:
--- Swift 2.3 ---
// ----- 获取 IP 地址 前提是你需要在桥接头文件里加上 #include <ifaddrs.h>
func getIPAddress() -> String {
var address = ""
// Get list of all interfaces on the local machine:
var ifaddr : UnsafeMutablePointer<ifaddrs> = nil
if getifaddrs(&ifaddr) == 0 {
// For each interface ...
for (var ptr = ifaddr; ptr != nil; ptr = ptr.memory.ifa_next) {
let interface = ptr.memory
// Check for IPv4 or IPv6 interface:
let addrFamily = interface.ifa_addr.memory.sa_family
if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
// Check interface name:
if let name = String.fromCString(interface.ifa_name) where name == "en0" {
// Convert interface address to a human readable string:
var addr = interface.ifa_addr.memory
var hostname = [CChar](count: Int(NI_MAXHOST),repeatedValue: 0)
getnameinfo(&addr,socklen_t(interface.ifa_addr.memory.sa_len),&hostname,socklen_t(hostname.count),nil,socklen_t(0),NI_NUMERICHOST)
address = String.fromCString(hostname)!
}
}
}
freeifaddrs(ifaddr)
}
var ad = ["0","0","0"]
ad = address.componentsSeparatedByString(".") // 把获取到的手机IP拆分开放到数组ad中
ad[3] = "1" // 将最后一位强制修改为1
address = ad[0] + "." + ad[1] + "." + ad[2] + "." + ad[3] // 再把修改后的ad数组组合成String
print(address) // 看看修改结果
return address // 返回值
}
思路就是把获取到的设备IP地址的最后一位手动修改为”1”,前面三位不需要修改,比如我的手机ip地址是 192.168.31.212,所以网关地址就是192.168.31.1。
这是一种比较无奈的方法,但是关键时刻也不能不说是一种思路。这种方法能适应大多数的路由器,分寸大家自己掌握,我的项目是允许的,先用着,以后再优化。
最近苹果更新了Swift3.0,这里更新一下代码。
--- Swift 3 ---
// ----- 获取 IP 地址 前提是你需要在桥接头文件里加上 #include <ifaddrs.h>
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
}
大家可以根据这个代码自己再修改为合适自己的代码使用。