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

Avo*_*oid 5 ip networking iptables

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

我有Android设备通过USB网络共享连接到Linux设备.

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

前端和后端之间有一个套接字连接,具有已定义的IP:PORT.

机器人网关是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地址,但我需要在app启动时在前端应用程序中自动执行此操作.

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

或者,如果无法阻止Android设备能够在Linux设备上将另一个实例与IP表连接.


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

lax*_*089 0

以下是描述如何侦听网络共享状态更改的解决方案:

首先您需要熟悉BroadcastReceiver。您可以找到很多教程,详细描述了其工作原理(尝试谷歌搜索如何监听 Android 中的连接变化)。

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

IntentFilter filter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED");
Run Code Online (Sandbox Code Playgroud)

然后将过滤器注册到您的 BroadcastReceiver:

myApplicationContext.registerReceiver(this, filter);

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

错误数组/可用数组/活动数组

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

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

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

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