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