You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native如何获取同一网络下的设备列表

Android 10+ 无ARP依赖实现同局域网设备发现方案

Android 10开始普通应用完全没有/proc/net/arp文件读取权限,原始套接字发送ARP请求的能力也被系统限制,所有依赖ARP的设备发现方案在非Root、非系统签名的普通应用上已经彻底不可用,以下是经过验证的可落地替代方案:

方案1:修复react-native-zeroconf配置(接入成本最低)

绝大多数人接入react-native-zeroconf失败不是库本身有问题,是没踩对Android端的配置要求:

  • 补全缺失的权限配置,AndroidManifest.xml里必须加上以下权限,少任何一个都会导致扫描无结果:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- Android 13及以上必须加附近设备权限 -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />
  • 扫描前必须主动申请MulticastLock,Android默认会过滤所有组播数据包,而zeroconf依赖的mDNS协议走的就是组播,不拿锁根本收不到响应包:
val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val multicastLock = wifiManager.createMulticastLock("react_native_zeroconf")
multicastLock.acquire()
// 扫描结束后记得调用multicastLock.release()释放锁
  • 避开测试环境问题:不要在Android模拟器上测试,模拟器网络桥接默认禁用组播,必须用真机连接和目标设备相同的WiFi测试。
    注意:mDNS/zeroconf协议本身只能发现主动广播了服务的设备,没有开启mDNS/SSDP服务的静默设备不会被扫描到,这是协议特性,不是库的bug

方案2:ICMP+端口扫描实现全量设备发现

如果你的需求是获取同网段所有在线设备,而不只是主动广播服务的设备,可以用这个完全绕开ARP的扫描方案:

  • 第一步通过WifiManager获取当前连接WiFi的网关IP、子网掩码,计算出当前网段的所有可用IP范围
  • 第二步对网段内所有IP并发发送ICMP Echo请求(即ping操作),普通应用有权限执行,超时时间设为100ms左右,254个IP的网段开20~30个并发10秒内就能扫完所有在线IP
  • 第三步对ping通的IP扫描常用服务端口(80、443、22、53、8080、5353、1900等),根据端口返回的banner信息识别设备类型
  • 性能优化:可以直接读取系统开放的/proc/net/tcp、/proc/net/udp连接表,这两个表在Android 10+对普通应用开放,里面存了当前设备和同网段其他IP的连接记录,可以直接拿到一批活跃IP,减少扫描量。

方案3:调用系统原生API获取关联设备信息

如果你的需求不需要获取全网段设备,只需要拿到和当前设备有交互的局域网设备,可以直接用系统提供的能力,不需要额外权限:

  • Android 10及以上可以通过ConnectivityManager注册NetworkCallback,当同网段设备通过投屏、WiFi直连、本地服务发现等方式和当前设备建立连接时,系统会直接返回对应设备的IP、名称、服务类型信息,不需要主动扫描
  • 针对IoT设备可以直接对接系统Nearby API,系统会自动完成mDNS、UPnP、Fast Pair协议的设备发现,不需要自己维护扫描逻辑。

避坑提醒

  • 不要尝试用原始套接字构造ARP包,Android 4.3之后普通应用就没有创建原始套接字的权限,必须Root或者拿到系统签名才能用
  • 不要相信所谓的“绕过ARP权限”第三方SDK,这类SDK本质要么是尝试读取已经被权限封禁的arp文件,要么是要求Root权限,在普通应用上完全无效
  • 局域网扫描只能在WiFi环境下生效,蜂窝网络属于运营商大内网,无法扫描到同网段其他设备。

内容的提问来源于stack exchange,提问作者JP Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:09:20