一种车机通过NetworkInfo无法获取网络连接状态的解决方案

注:好记性不如烂笔头,记录自己项目解决问题的方案, 每个项目的实际情况不一样,但方案思路可参考


在传统平台上,tbox⽹卡与tbox设备link状态强相关,当tbox设备link up时,⽹卡挂载且分配ip;当tbox link down时,会移除⽹卡的所有配置。 在8155平台上,由于以太⽹设备必须通过QNX系统识别,所以tbox⽹卡与仪表通讯⽹卡必须共⽤,⽽仪表通 信⽹卡开机默认启动且不能被移除,所以应⽤通过接⼝获取到以太⽹络始终可⽤。

解决思路: 通过修改Ethernet框架层代码动态根据tbox link状态通知应⽤以太⽹卡状态变化但不实际更改⽹卡配置。

上代码:

第一笔改动
 

代码位置:framework/base/services/core/java/com/android/server/ConnectivityService.java

    /**
     * 定义一个 SystemProperties的key
     * Tbox attach state. Details in TboxService
     */
    private static final String PROP_TBOX_ATTACH_STATE = "persist.xxx.yyyy";

    //修改 getActiveNetworkInfo方法

    @Override
    public NetworkInfo getActiveNetworkInfo() {
        enforceAccessPermission();
        final int uid = Binder.getCallingUid();
        final NetworkState state = getUnfilteredActiveNetworkState(uid);
        filterNetworkStateForUid(state, uid, false);
        maybeLogBlockedNetworkInfo(state.networkInfo, uid);
        if(state != null && state.networkInfo != null) {
            if((ConnectivityManager.getNetworkTypeName(ConnectivityManager.TYPE_ETHERNET)).equalsIgnoreCase(state.networkInfo.getTypeName())) {
                if(SystemProperties.getInt(PROP_TBOX_ATTACH_STATE, 0) == 0) {
                    state.networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
                    state.networkInfo.setIsAvailable(false);
                }
            }
        }
        return state.networkInfo;
    }
    

第二笔改动

代码位置:framework/base/services/core/java/com/android/server/ConnectivityService.java

//定义设置网络连接状态的方法
    private void setEth0Disconnect(NetworkState state) {
        if(state != null && state.networkInfo != null) {
            if((ConnectivityManager.getNetworkTypeName(ConnectivityManager.TYPE_ETHERNET)).equalsIgnoreCase(state.networkInfo.getTypeName())) {
                if(SystemProperties.getInt(PROP_TBOX_ATTACH_STATE, 0) == 0) {
                    state.networkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
                    state.networkInfo.setIsAvailable(false);
                }
            }
        }
    }


//分别在以下方法中调用
    public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
        NetworkStack.checkNetworkStackPermission(mContext);
        final NetworkState state = getUnfilteredActiveNetworkState(uid);
        filterNetworkStateForUid(state, uid, ignoreBlocked);
        setEth0Disconnect(state);
        return state.networkInfo;
    }


    @Override
    public NetworkInfo getNetworkInfo(int networkType) {
        enforceAccessPermission();
        final int uid = Binder.getCallingUid();
        if (getVpnUnderlyingNetworks(uid) != null) {
            // A VPN is active, so we may need to return one of its underlying networks. This
            // information is not available in LegacyTypeTracker, so we have to get it from
            // getUnfilteredActiveNetworkState.
            final NetworkState state = getUnfilteredActiveNetworkState(uid);
            if (state.networkInfo != null && state.networkInfo.getType() == networkType) {
                filterNetworkStateForUid(state, uid, false);
                setEth0Disconnect(state);
                return state.networkInfo;
            }
        }
        final NetworkState state = getFilteredNetworkState(networkType, uid);
        setEth0Disconnect(state);
        return state.networkInfo;
    }



    @Override
    public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) {
        enforceAccessPermission();
        final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
        if (nai != null) {
            final NetworkState state = nai.getNetworkState();
            filterNetworkStateForUid(state, uid, ignoreBlocked);
            setEth0Disconnect(state);
            return state.networkInfo;
        } else {
            return null;
        }

然后在自己的TBOX服务中,检测TBOX的连接状态, 调用SystemProperties.set()方法设置相应的属性即可, 前提需要在系统权限,系统用户的进程中。

参考:

Android network框架分析之NetworkManagementService和netd交互深入分析(一)_ʚ兔子的先森ɞ的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值