You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin环境下局域网设备扫描相关开发包咨询

Kotlin环境下局域网设备扫描相关开发包咨询

嘿,刚好我之前做过类似的移动热点设备扫描需求,给你整理几个在Kotlin环境下能用的方案和相关工具包,都是实际项目里验证过的:

一、直接基于Android系统API实现(无需额外依赖包)

如果是Android平台的Kotlin应用,其实不用引入第三方包,靠系统自带的API就能完成扫描,可控性还更强:

1. 子网IP扫描+反向DNS获取设备名称

通过遍历热点子网内的所有IP,用InetAddressisReachable()判断设备是否在线,再通过hostName获取设备名称:

import java.net.InetAddress
import kotlin.concurrent.thread

fun scanLocalSubnet(subnetPrefix: String) {
    // 热点子网通常是192.168.43.x或192.168.1.x,这里遍历1-254段IP
    for (ipSegment in 1..254) {
        thread { // 多线程扫描提升速度
            val targetIp = "$subnetPrefix.$ipSegment"
            try {
                val inetAddress = InetAddress.getByName(targetIp)
                if (inetAddress.isReachable(1000)) { // 超时1秒,可根据需求调整
                    val deviceName = inetAddress.hostName.takeIf { it.isNotBlank() } ?: "未知设备"
                    println("找到在线设备:$deviceName ($targetIp)")
                }
            } catch (e: Exception) {
                // 忽略单个IP扫描失败的异常
            }
        }
    }
}

注意:需要在Manifest中申请ACCESS_WIFI_STATEACCESS_NETWORK_STATEINTERNET权限,Android 10+还要注意后台扫描限制,建议在前台服务中执行扫描操作。

2. 读取ARP缓存获取设备信息

Android系统会维护ARP缓存表,记录已连接设备的IP、MAC和主机名,直接读取系统文件就能拿到更准确的信息:

fun readArpCache(): List<Pair<String, String>> {
    val deviceList = mutableListOf<Pair<String, String>>()
    try {
        val arpContent = "/proc/net/arp".readText()
        val lines = arpContent.split("\n").drop(1) // 跳过表头行

        for (line in lines) {
            val parts = line.split(Regex("\\s+")).filter { it.isNotEmpty() }
            if (parts.size >= 4) {
                val deviceIp = parts[0]
                val deviceName = if (parts[3] != "(incomplete)") parts[3] else "未知设备"
                deviceList.add(deviceIp to deviceName)
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return deviceList
}

二、第三方工具包简化开发

如果不想自己写太多底层逻辑,这些第三方库可以直接在Kotlin项目中使用:

1. AndroidNetworkTools

这个库封装了子网扫描、ARP缓存读取、端口检测等常用网络工具,在Kotlin里调用非常简洁。首先在项目的build.gradle中添加依赖:

dependencies {
    implementation 'com.github.stealthcopter:android-network-tools:0.6.1'
}

然后用Kotlin调用扫描:

import com.stealthcopter.networktools.SubnetDevices

fun scanWithNetworkTools() {
    SubnetDevices.fromLocalAddress().findDevices(
        onDeviceFound = { device ->
            val deviceInfo = "设备名称:${device.hostName} | IP:${device.ip} | MAC:${device.macAddress}"
            println(deviceInfo)
        },
        onFinished = { deviceCount ->
            println("扫描完成,共找到$deviceCount 台在线设备")
        }
    )
}

这个库已经帮你处理了线程管理、权限适配等细节,适合快速开发。

三、热点场景的特殊优化

针对移动热点的场景,还可以读取系统的DHCP租约文件,直接获取所有已连接到热点的设备信息(无需扫描):

fun readDhcpLeases(): List<Triple<String, String, String>> {
    val leaseList = mutableListOf<Triple<String, String, String>>()
    try {
        // 不同厂商可能路径略有差异,常见路径是/data/misc/dhcp/dnsmasq.leases
        val leaseContent = "/data/misc/dhcp/dnsmasq.leases".readText()
        val lines = leaseContent.split("\n")

        for (line in lines) {
            val parts = line.split(Regex("\\s+")).filter { it.isNotEmpty() }
            if (parts.size >= 4) {
                val macAddr = parts[1]
                val deviceIp = parts[2]
                val deviceHostname = parts[3]
                leaseList.add(Triple(deviceIp, macAddr, deviceHostname))
            }
        }
    } catch (e: Exception) {
        // 部分设备可能需要ROOT权限或额外文件读取权限,需处理权限异常
        e.printStackTrace()
    }
    return leaseList
}

最后提几个注意事项

  • 权限申请:除了基础的网络权限,Android 13+可能还需要NEARBY_WIFI_DEVICES权限,记得在Manifest中声明并动态申请。
  • 扫描效率:多线程扫描时要控制并发数,避免占用过多系统资源导致APP卡顿。
  • 设备名称兼容性:部分设备可能不会返回主机名,记得设置默认值(比如"未知设备")。
  • 前台提示:扫描过程可能需要几秒到十几秒,建议在UI上显示加载动画或进度条,提升用户体验。

火山引擎 最新活动