Kotlin开发Android WiFi设备APP:按IP识别设备类型并显示对应图标
实现WiFi设备类型图标匹配方案
核心思路
要给每个IP对应的设备显示专属图标,核心是先识别设备类型,再绑定对应图标,具体分以下几步落地:
1. 收集设备识别依据
你已经能获取IP列表,接下来需要补充设备的额外信息来判断类型:
- MAC地址提取:通过读取Android系统的
/proc/net/arp文件,或者用NetworkInterfaceAPI获取IP对应的MAC地址。MAC地址的前6位(冒号分隔的前3段)是厂商OUI码,不同品牌的设备OUI码固定,比如苹果设备常见OUI为00:1A:79、00:0C:29,路由器常见OUI为C8:3A:35等。 - 主机名解析(可选):对IP做DNS反向解析,若主机名包含
android、iphone、router这类关键词,可直接判断设备类型。 - 端口扫描(可选):后台异步扫描常见服务端口,比如手机常用的5555(ADB)、电脑常用的22(SSH),辅助判断设备类型(注意扫描会耗时,需控制频率)。
2. 编写设备类型判断逻辑
基于收集到的信息,编写类型匹配规则:
// 定义设备类型枚举 enum class DeviceType { MOBILE, PC, ROUTER, UNKNOWN } fun judgeDeviceType(mac: String?, hostname: String?): DeviceType { // 优先通过MAC的OUI码判断 mac?.let { val oui = it.substring(0, 8).uppercase() // 可扩展更多厂商OUI码 val mobileOuis = setOf("00:1A:79", "00:0C:29", "90:E2:BA") val routerOuis = setOf("C8:3A:35", "00:18:E7") val pcOuis = setOf("00:1D:09", "00:24:9B") return when (oui) { in mobileOuis -> DeviceType.MOBILE in routerOuis -> DeviceType.ROUTER in pcOuis -> DeviceType.PC else -> DeviceType.UNKNOWN } } // 其次通过主机名关键词判断 hostname?.let { return when { it.contains("android", ignoreCase = true) || it.contains("iphone", ignoreCase = true) -> DeviceType.MOBILE it.contains("pc", ignoreCase = true) || it.contains("laptop", ignoreCase = true) -> DeviceType.PC it.contains("router", ignoreCase = true) || it.contains("gateway", ignoreCase = true) -> DeviceType.ROUTER else -> DeviceType.UNKNOWN } } return DeviceType.UNKNOWN }
3. 列表中绑定图标
在RecyclerView的Adapter中,根据设备类型匹配对应图标资源:
override fun onBindViewHolder(holder: DeviceViewHolder, position: Int) { val device = deviceList[position] holder.ipTextView.text = device.ipAddress // 根据设备类型设置图标 val iconResId = when (device.type) { DeviceType.MOBILE -> R.drawable.ic_device_mobile DeviceType.PC -> R.drawable.ic_device_pc DeviceType.ROUTER -> R.drawable.ic_device_router DeviceType.UNKNOWN -> R.drawable.ic_device_unknown } holder.deviceIconImageView.setImageResource(iconResId) }
4. 优化建议
- OUI数据库本地化:把常用厂商的OUI码整理成本地JSON或资源文件,避免网络请求,提升识别速度。
- 异步处理:MAC查询、端口扫描等操作放在Coroutines后台线程执行,避免阻塞UI。
- 结果缓存:将已识别的IP-设备类型对应关系缓存到SharedPreferences,下次启动APP直接复用,减少重复识别操作。
内容的提问来源于stack exchange,提问作者mohamed hossam
相关产品推荐
相关产品推荐

