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
相关产品推荐
相关产品推荐

