Android 设备如何以编程方式推断它所连接的 Linux 设备的 IP 地址?

Posted

技术标签:

【中文标题】Android 设备如何以编程方式推断它所连接的 Linux 设备的 IP 地址?【英文标题】:How can the Android device programatically infer the IP address of the Linux device it's tethered to? 【发布时间】:2017-06-28 13:45:50 【问题描述】:

嗨!在很多论坛上问过这个问题,没有人能回答我,所以请帮忙!

我已通过 USB 网络共享将 android 设备连接到 Linux 设备。

在 Android 设备上我有前端(html、js、css)浏览器应用程序,在 Linux 设备上我有后端(node.js)。

在前端和后端之间有一个定义 IP:PORT 的套接字连接。

Androids 网关是 Linux 设备。 Linux 设备已连接到本地网络。

当 Android 设备连接到 Linux 设备时,Linux 设备使用静态 IP 地址初始化名为 usb0 的新网络接口。

套接字基于在每个前端+后端设备实例上都相同的网络 IP。

我有超过 5 个相同的前端+后端设备实例连接到本地网络。

有没有办法在不设置静态的情况下以某种方式找到后端设备 IP 地址?

我的问题从同时启动所有设备开始。有时实例 1 中的 Android 设备从其他实例连接到 Linux 设备,我想通过不使用 Android 连接到 usb0 而是连接到 Linux 设备的 eth0 DHCP 来防止这种情况。我永远无法知道 Linux 设备上将使用哪个 IP 地址,但前端应用程序需要一个 IP:PORT 才能连接。

定义了PORT,所以连接的字符串是IP + ":3000"

我知道我可以使用 arp 或类似方式查看网络上的所有 IP 地址,但我需要在应用启动时在前端应用中自动执行此操作。

我想找到 android 设备连接到的第一个设备 IP 地址。这始终是一个前端对 Linux 设备。

或者,如果无法阻止 Android 设备能够使用 Linux 设备上的 IP 表连接另一个实例。


P.S 我知道 Android 也是 Linux,但想回答的人会知道我在说什么。

【问题讨论】:

使用哪种编程风格?安卓Java?还是您想从 C/C++ 代码中执行此操作? 我想您要问的是: 对吗?如果是这样,你想用 Java 还是 C 来做? 我正在使用 Java 在应用启动时建立系绳(修改后的 cordova 插件)。应用程序是 hibrid 并在 javascript 中保存套接字地址。所以我需要以某种方式告诉应用程序连接到特定的 IP 【参考方案1】:

这是一个描述如何监听网络共享状态变化的解决方案:

首先您需要熟悉广播接收器。您可以找到大量详细描述其工作原理的教程(尝试在 Google 上搜索如何监听 Android 中的连接变化)。

为了获得 Tethering 状态更新,您需要在您的 BroadcastReceiver 类中使用 Android 的隐藏过滤器操作(请参阅 ConnectivityManager):

IntentFilter filter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED");

然后将过滤器注册到您的广播接收器:

myApplicationContext.registerReceiver(this, filter);

在您的 onReceive(final Context context, final Intent intent) 方法中,Intent.extras 信息包含 3 个数组,其中填充了相应的系留网络接口:

erroredArray / availableArray / activeArray

这有点棘手,但您可以获取网络共享状态信息。

另外,你可以对Android代码的一个隐藏函数做一些反思:

在连接管理器中搜索getTetherableIfaces()

这是一个链接:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

【讨论】:

getTetherableIfaces() 返回我的 android 设备上的可用接口,通常是 rndis0,但我寻找的是 linux 设备的 eth0 即使我找到它,我也需要将它导出到用 JS 编写的前端应用程序。如果有人知道如何控制 linux 的 IP 表以阻止与 linux 设备 usb0 的任何外部连接,但仅限于与 linux 设备绑定的特定 android 设备,我也建议这样做

以上是关于Android 设备如何以编程方式推断它所连接的 Linux 设备的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式通过 Wifi 获取连接在同一网络上的其他设备的 IP 地址?

有没有办法通过 iOS/swift 中的蓝牙以编程方式连接 android 和 IOS 设备?

在 android 4.0 上以编程方式设置 *** 连接

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

如何以编程方式判断蓝牙设备是不是已连接?

如何以编程方式在 Android 设备中获取设备 (AOSP) 内部版本号?