首页 > 解决方案 > 如何从 Android 中的 RNDIS 接口获取默认网关 IP

问题描述

我正在尝试构建一个使用 USB RNDIS 进行网络通信的应用程序。我想获得通过 Android 手机上的 USB RNDIS 设置的默认网关 IP。但是,我编写的代码仅适用于具有 USB Tethering 的手机(手机连接正确等)。在带有 USB RNDIS 的手机上,我得到了 connectivityManager.getAllNetworks()` 返回 null。我在connectivityManager中看到了以下方法:

/**
 * Attempt to both alter the mode of USB and Tethering of USB.  A
 * utility method to deal with some of the complexity of USB - will
 * attempt to switch to Rndis and subsequently tether the resulting
 * interface on {@code true} or turn off tethering and switch off
 * Rndis on {@code false}.
 *
 * <p>This method requires the caller to hold either the
 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
 * or the ability to modify system settings as determined by
 * {@link android.provider.Settings.System#canWrite}.</p>
 *
 * @param enable a boolean - {@code true} to enable tethering
 * @return error a {@code TETHER_ERROR} value indicating success or failure type
 *
 * {@hide}
 */
public int setUsbTethering(boolean enable) {
    try {
        String pkgName = mContext.getOpPackageName();
        Log.i(TAG, "setUsbTethering caller:" + pkgName);
        return mService.setUsbTethering(enable, pkgName);
    } catch (RemoteException e) {
        throw e.rethrowFromSystemServer();
    }
}

但是由于某种原因该方法不可用(不可用)......?

我尝试过的代码如下:

 /**
     * Automatically get the IP from the device that is set as Default Gateway in the RHM. 
     * Summary:
     * ConnectivityManager.getLinkProperties() -> LinkProperties.getRoutes() -> RouteInfo.getGateway()
     */
    private String getIpDefaultGateway() {
        String webSockProtocol = "wss:/";
        String webSockPort     = ":443/";
        String uri             = "";

        ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        if (connectivityManager != null) {
//            connectivityManager.setUsbTethering(true); <------- THIS DOES NOT EXIST and not able to import something etc...
            Network[] networkAll = connectivityManager.getAllNetworks();  \\<---------returns Null on RNDIS, works ok in Tethering.
            for (Network n : networkAll){
                Log.w(TAG, "---------------------------------------------------------------");
                Log.w(TAG, "getIpDefaultGateway: Network" + n.toString());
            }

            //get the network obj corresponding to the currently active default data network.
            Network network = connectivityManager.getActiveNetwork();
            if (network != null) {
                // Get the properties of a network link that represents a connection to a network.
                // It may have multiple addresses and multiple gateways.
                LinkProperties linkProperties;
                linkProperties = connectivityManager.getLinkProperties(network);
                if (linkProperties != null) {
                    // get network configuration information that contains a gateway and InetAddress
                    // indicating the next hop to use. If this is null it indicates a directly-connected route.
                    List<RouteInfo> routeInfo = linkProperties.getRoutes();
                    RouteInfo routeForDefaultGateway;
                    // find the gateway ip
                    for (RouteInfo ri : routeInfo) {
                        if (ri.isDefaultRoute() && ri.getGateway() instanceof Inet4Address) {
                            routeForDefaultGateway = ri;
                            uri = webSockProtocol + routeForDefaultGateway.getGateway() + webSockPort;
                            Log.w(TAG, " getIpDefaultGateway: uri: " + uri, null);
                        }
                    }
                } else {
                    Log.w(TAG, " getIpDefaultGateway: No active links to represent connection to a network.");
                }
            } else {
                Log.e(TAG, " getIpDefaultGateway: null network");
            }
        } else {
            Log.e(TAG, " getIpDefaultGateway: null connectivityManager");
        }
        return uri;
    }

任何帮助将非常感激。

标签: javaandroidipandroid-connectivitymanagerjtracert

解决方案


推荐阅读