android 支持通过外接4G模块联网

主要解决问题:

1.开机无法自动拨号

2.手动拨号成功后能获取到IP但无法联网

问题场景:

最近由于业务需求需要在多个不同平台上支持外接USB4g模块联网,开始在全志H6平台上进行很顺利,根据模块厂商提供的开发文档进行相关代码集成就可以使用了。后来在全志A40平台上无论怎么调都无法自动拨号,但是通过linux方式用pppd命令可以拨号成功拿到IP和DNS信息,但是由于没有走android系统的网络切换流程,系统网络信息不会更新,导致无法上网。最后只能采取两种方式结合来实现:即先通过linux命令方式进行拨号,然后把得到的IP和DNS信息设置到android系统并刷新整个网络链路。

移动网络拨号和网络信息更新相关流程可参考下面两篇文章:

路由配置信息的获取_connectivityservice流程图-优快云博客

ConnectivityService框架初识-优快云博客

这里主要记录一下如何动态更新android系统的IP和DNS信息使之能正常联网。

先通过Linux指令:pppd call cmnet 进行拨号,得到IP和dns信息保存下来,在ip-up脚本中处理的:

#!/system/bin/sh
/system/bin/setprop "net.interfaces.defaultroute" "ppp0"
/system/bin/setprop "net.ppp0.dns1" "$DNS1"
/system/bin/setprop "net.ppp0.dns2" "$DNS2"
/system/bin/setprop "net.ppp0.local-ip" "$IPLOCAL"
/system/bin/setprop "net.ppp0.remote-ip" "$IPREMOTE"
exit 0

动态更新网络IP和dns是在ConnectivityService.java中进行,因为所有形式网络路由信息获取到后都要进行网络信息注册:registerNetworkAgent,注册成功后相关会自动进行相关信息更新,所以动态调用registerNetworkAgent()就可以了。

先看看它的构造函数,弄清楚调用需要传递哪些参数:

public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
            LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
            int currentScore, NetworkMisc networkMisc) {}

下面在ConnectivityService.java自定义一个函数updateNetworkByProp,创建所需的各个参数传入registerNetworkAgent,然后在需要的时候调用即可。

    private void updateNetworkByProp(){

        Messenger messenger = new Messenger(mTrackerHandler);
        NetworkInfo networkInfo = new NetworkInfo(0, 0,"MOBILE","LTE");
        networkInfo.setDetailedState(NetworkInfo.DetailedState.CO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值