美文网首页
AIO3399J 以太网/WIFI双网卡,网线直连AIO3288

AIO3399J 以太网/WIFI双网卡,网线直连AIO3288

作者: luowenbin | 来源:发表于2020-11-12 14:52 被阅读0次

    目标连接

    image.png

    调试过程

    Aio3399j问题
    连接网线时连接WIFI连接不上:WIFI状态一直显示已保存。
    先连接WIFI在连接网线后,WIFI图标变成感叹号,无法连接网络。
    拔掉网线后WIFI恢复正常。

    首先解决不能同时开启的问题

    系统层更改

    避免被踢

    frameworks/base/core/java/android/net/NetworkFactory.java
    //releaseNetworkFor(n.request);
    //n.requested = false;
    

    降低以太网优先级为30(评分越高优先级越高)

    frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
    private static final int NETWORK_SCORE = 30; //70;
    
    

    允许双网卡同时启动

    services/core/java/com/android/server/ConnectivityService.java
    Aio3399j源码 默认ENABLE_NETWORK_COEXIST=true

    已经开启双网卡,因此可不用更改

        private void teardownUnneededNetwork(NetworkAgentInfo nai) {
            if (nai.numRequestNetworkRequests() != 0) {
                for (int i = 0; i < nai.numNetworkRequests(); i++) {
                    NetworkRequest nr = nai.requestAt(i);
                    // Ignore listening requests.
                    if (nr.isListen()) continue;
                    loge("Dead network still had at least " + nr);
                    break;
                }
            }
            
            if (ENABLE_NETWORK_COEXIST) {
                 log("Skip teardownUnneededNetwork: " + nai.name());
            } else {
                 nai.asyncChannel.disconnect();
            }
        }
    
    

    其他Rk3399可注释对应断开语句

    
    //nai.asyncChannel.disconnect();
    

    IP配置

    更改完成后,以太网和WIFI可以同时存在。并且WIFI能够上网。
    但是是网线直连,不经过路由器,因此需要自行设定静态IP

    AIO3399J:

    使用ifconfig 设置静态IP(失败)
    ifconfig eth0 10.0.200.3
    设置完之后可以查看到IP,但是过一会儿会自动消失。
    原因是AIO3399J的事Android8.1系统,使用了新的方法设定以太网信息。
    需要生成一个/data/misc/ethernet/ipconfig.txt
    ipconfig.txt的格式可分析源码frameworks/base/services/core/java/com/android/server/net/IpConfigStore.java

    image.png

    提取一部分需要的生成算法
    prefixLength 是前缀长度,子网掩码为255.255.255.0 的话前缀长度为 24。

    
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    
    public class Ip {
    
        private static final String TAG = "IpConfigStore";
        private static final boolean DBG = false;
    
    
        /* IP and proxy configuration keys */
        protected static final String ID_KEY = "id";
        protected static final String IP_ASSIGNMENT_KEY = "ipAssignment";
        protected static final String LINK_ADDRESS_KEY = "linkAddress";
        protected static final String GATEWAY_KEY = "gateway";
        protected static final String DNS_KEY = "dns";
        protected static final String PROXY_SETTINGS_KEY = "proxySettings";
        protected static final String PROXY_HOST_KEY = "proxyHost";
        protected static final String PROXY_PORT_KEY = "proxyPort";
        protected static final String PROXY_PAC_FILE = "proxyPac";
        protected static final String EXCLUSION_LIST_KEY = "exclusionList";
        protected static final String PPPOE_ACCOUNT_KEY = "pppoeAccount";
        protected static final String PPPOE_PASSWORD_KEY = "pppoePassword";
        protected static final String EOS = "eos";
    
        protected static final int IPCONFIG_FILE_VERSION = 2;
    
        //"./ipconfig.txt"
        public static void saveNetConfig(File file, String ipAddress, int prefixLength, String gateway, String dns) {
            try (DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) {
    
    
                out.writeInt(IPCONFIG_FILE_VERSION);
    
                {
                    out.writeUTF(IP_ASSIGNMENT_KEY);
                    out.writeUTF("STATIC");//config.ipAssignment.toString() ,DHCP
                }
    
    
                {
                    out.writeUTF(LINK_ADDRESS_KEY);
                    out.writeUTF(ipAddress);//ipAddress.getAddress().getHostAddress()
                    out.writeInt(prefixLength); //ipAddress.getPrefixLength() ,255.255.255.0 为24
                }
    
    
                {
                    out.writeUTF(GATEWAY_KEY);
                    out.writeInt(0);  // Default route.
                    out.writeInt(1);  // Have a gateway.
                    out.writeUTF(gateway);//staticIpConfiguration.gateway.getHostAddress()
    
                }
                {
                    out.writeUTF(DNS_KEY);
                    out.writeUTF(dns); //inetAddr.getHostAddress()
                    out.writeUTF(DNS_KEY);
                    out.writeUTF("8.8.8.8");//添加8.8.8.8为默认网关
    
                }
                {
                    out.writeUTF(PROXY_SETTINGS_KEY);//代理
                    out.writeUTF("NONE");//config.proxySettings.toString()
                }
    
                out.writeUTF(ID_KEY);
                out.writeInt(0);//configKey
    
                out.writeUTF(EOS);
    
                out.flush();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    

    生成后上传到/data/misc/ethernet/目录下

    image.png

    重启后自动设置IP


    image.png
    AIO3288J:

    3288的ifconfig有点问题,使用ifconfig eth0 10.0.200.3是无效的。
    因此使用busybox ifconfig eth0 10.0.200.3

    image.png

    路由调整

    配置好IP后 Ping一下测试网络连通。
    3288 :ping 10.0.200.2
    3399 :ping 10.0.200.3
    都失败了。
    但是指定网卡后可以ping通
    3288:ping -Ieth0 10.0.200.2
    3399:ping -Ieth0 10.0.200.3

    image.png

    说明ping 10.0.200.2默认使用了wlan0网卡,通过修改路由来解决这个问题。
    查看生效的路由表(route)
    busybox route

    image.png
    并没有发现问题。
    查了资料是策略的问题。
    策略和路由比较容易混。
    查看路由的策略(rule)
    ip ru
    ip rule
    ip rule list
    三个指令是一样的作用
    image.png

    最前面的数字是优先级(越小越优先),最后面的名称是路由表名称(或者表id)
    注意表 wlan0 和设备 wlan0 是代表不同的东西 ,android 自带了几个表 如 'main' 'defualt' 'local' 等
    查看了各个路由策略的路由表
    查看指定策略的路由表
    ip route list table wlan0

    image.png

    策略表比较难直接读懂和看出时间数据走向,反复测试后,发现是先使用了wlan0表里面的路由
    ip route list table wlan0 查看,得到信息

    default via 192.168.100.1 dev wlan0  proto static 
    192.168.100.0/24 dev wlan0  proto static  scope link
    

    只有192.168.100.0的路由
    ip route list table eth0 同理)
    因此往 wlan0表里面增加 10.0.200.0的路由 (3288和3399都执行指令)
    ip route add 10.0.200.0/24 dev eth0 proto static scope link table wlan0
    添加完后继续查看,

    default via 192.168.100.1 dev wlan0  proto static 
    10.0.200.0/24 dev eth0  proto static  scope link 
    192.168.100.0/24 dev wlan0  proto static  scope link 
    

    然后进行ping测试


    image.png

    ping通了。
    当时一小段时间过后,又不行了。
    又经过反复测试,确定了问题所在查看路由表wlan0,
    ip route list table wlan0

    default via 192.168.100.1 dev wlan0  proto static 
    192.168.100.0/24 dev wlan0  proto static  scope link
    

    又恢复了,暂时还不知道原因。。
    于是另寻出路:不走wlan0路由表
    不使用wlan0的话需要做两个工作:
    1.构建一个目标表
    表内容为

    10.0.200.0/24 dev eth0  proto static  scope link 
    192.168.100.0/24 dev wlan0  proto static  scope link 
    
    image.png

    这里是可以自己创建自定义表的,但是表main刚好也是这样的。
    因此可以直接使用表main

    2.设置表的优先级比wlan0的高
    使用pref指令选项设置优先级。

    因此最终执行的指令为(3288和3399都执行):
    ip ru add from all lookup main pref 100
    查看所有策略,发现正常添加上了

    image.png

    成功ping通没有掉线


    image.png

    相关文章

      网友评论

          本文标题:AIO3399J 以太网/WIFI双网卡,网线直连AIO3288

          本文链接:https://www.haomeiwen.com/subject/gatpbktx.html