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

Android应用如何编程获取热点连接POS设备的IP地址

获取Android热点连接的POS设备IP地址的替代方案

方案一:利用WifiManager官方API(Android 10+推荐)

Android 10及以上版本限制了直接读取/proc/net/arp的权限,但可以通过WifiManager的getConnectedDevices方法获取热点连接的设备列表,前提是申请必要的权限。

所需权限

在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

注意:Android 10+必须申请ACCESS_FINE_LOCATION权限,否则无法获取热点连接设备信息,即使你的应用不需要定位功能。

代码实现

// 获取WifiManager实例
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

// 获取热点(AP模式)下连接的所有设备
List<WifiInfo> connectedDevices = wifiManager.getConnectedDevices(WifiManager.TYPE_AP);

// 遍历设备列表,提取IP地址
for (WifiInfo device : connectedDevices) {
    int rawIp = device.getIpAddress();
    // 将整数IP转换为字符串格式
    String ipAddress = String.format("%d.%d.%d.%d",
            (rawIp & 0xFF),
            (rawIp >> 8 & 0xFF),
            (rawIp >> 16 & 0xFF),
            (rawIp >> 24 & 0xFF));
    
    // 可根据MAC地址筛选POS设备(如果已知POS的MAC)
    String deviceMac = device.getMacAddress();
    if ("你的POS设备MAC地址".equals(deviceMac)) {
        // 找到目标POS设备的IP
        Log.d("POS_IP", ipAddress);
        break;
    }
}

方案二:局域网主动扫描(无特殊权限 fallback 方案)

如果无法申请定位权限,可以通过扫描热点子网内的所有IP来发现在线设备,这种方法仅需INTERNET权限,但效率较低,适合后台执行。

代码实现

// 第一步:获取手机热点的本地IP,推导子网
private String getHotspotSubnet() {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int rawLocalIp = wifiInfo.getIpAddress();
    if (rawLocalIp == 0) return null;
    
    String localIp = String.format("%d.%d.%d.%d",
            (rawLocalIp & 0xFF),
            (rawLocalIp >> 8 & 0xFF),
            (rawLocalIp >> 16 & 0xFF),
            (rawLocalIp >> 24 & 0xFF));
    
    // 提取子网前缀(比如192.168.43.0/24的前缀是192.168.43.)
    return localIp.substring(0, localIp.lastIndexOf(".") + 1);
}

// 第二步:扫描子网内所有IP
private void scanHotspotDevices() {
    String subnet = getHotspotSubnet();
    if (subnet == null) return;
    
    // 使用线程池提高扫描速度
    ExecutorService executor = Executors.newFixedThreadPool(20);
    for (int i = 1; i <= 254; i++) {
        String targetIp = subnet + i;
        executor.execute(() -> {
            try {
                InetAddress address = InetAddress.getByName(targetIp);
                // 1秒超时判断设备是否在线
                if (address.isReachable(1000)) {
                    // 设备在线,可进一步验证是否为POS(比如扫描特定端口)
                    runOnUiThread(() -> {
                        Log.d("OnlineDevice", targetIp);
                    });
                }
            } catch (IOException e) {
                // 忽略连接失败的IP
            }
        });
    }
    executor.shutdown();
}

你可以根据POS设备开放的特定端口(比如常见的80、443或POS专属端口),替换isReachable为端口连接测试,提高准确性。

方案三:Root设备读取DHCP租约文件(不推荐生产环境)

如果你的设备已经Root,可以读取系统DHCP服务的租约文件,里面记录了所有通过热点获取IP的设备信息,但这种方法依赖Root权限,不适合面向普通用户的应用。

代码实现

try {
    BufferedReader reader = new BufferedReader(new FileReader("/data/misc/dhcp/dhcpd.leases"));
    String line;
    while ((line = reader.readLine()) != null) {
        // 租约文件格式示例:192.168.43.101 00:11:22:33:44:55 01:02:03:04:05:06 *
        if (line.trim().isEmpty() || line.startsWith("#")) continue;
        
        String[] parts = line.split("\\s+");
        if (parts.length >= 2) {
            String ip = parts[0];
            String mac = parts[1];
            Log.d("DHCP_LEASE", String.format("IP: %s, MAC: %s", ip, mac));
        }
    }
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者walid azgear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:49