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

