private fun getARPIps(): List<Pair<String, String>> {
val result = mutableListOf<Pair<String, String>>()
try {
// val args = listOf("ip", "neigh")
// val cmd = ProcessBuilder(args)
// val process: Process = cmd.start()
val process = Runtime.getRuntime().exec("ip neigh")
val reader = BufferedReader(InputStreamReader(process.inputStream))
reader.forEachLine {
if (!it.contains("FAILED")) {
val split = it.split("\\s+".toRegex())
if (split.size > 4 && split[0].matches(Regex("([0-9]{1,3}\\.){3}[0-9]{1,3}"))) {
result.add(Pair(split[0], split[4]))
}
}
}
val errReader = BufferedReader(InputStreamReader(process.errorStream))
errReader.forEachLine {
Log.e(TAG, it)
// post the error message to server
}
reader.close()
errReader.close()
process.destroy()
} catch (e: Exception){
e.printStackTrace()
// post the error message to server
}
return result
}
5条答案
按热度按时间vom3gejh1#
不幸的是,没有公共的API来给予有关这方面的信息.但是你可以读/proc/net/阿普文件,看到连接到你的接入点的客户端。
/proc/net/阿普文件有6个字段:IP地址、硬件类型、标志、硬件地址、掩码和设备
问题是当客户端断开连接时,因为它不会从文件中消失。解决方案可能是对每个客户端执行 ping 并等待响应,但对我来说这不是一个好的解决方案,因为有些客户端不响应 ping。如果你喜欢这个解决方案,请在GitHub上查看这个项目--> https://github.com/nickrussler/Android-Wifi-Hotspot-Manager-Class/tree/master/src/com/whitebyte
我所做的是:读取/proc/net/阿普并检查 FLAGS 字段,当值为0x 2时,工作站已连接,0x 0已断开连接,但要刷新此字段,我需要不时清除ARP缓存,我用以下命令做到了这一点:ip neigh flush all
s8vozzvw2#
这种方法适用于我,但这是检测只有版本4.0及以上;它是无法找到与热点连接的版本2.2或2.3的设备.
字符串
mkh04yzy3#
Android 10限制了访问/proc/net目录的权限,所以上面的一些解决方案已经不可行了,但是'ip'命令仍然可用
字符串
alen0pnh4#
字符串
//--------------------------------------------------------
型
dphi5xsq5#
您可以使用BroadcastReciever“android.net.wifi.WIFI_HOTSPOT_CLIENTS_CHANGED”来检测客户端连接。在您的AndroidManifest中:
字符串
在你的活动中
型