android 支持通过外接4G模块联网
创始人
2024-09-25 06:46:57
0

主要解决问题:

1.开机无法自动拨号

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

问题场景:

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

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

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

ConnectivityService框架初识-CSDN博客

这里主要记录一下如何动态更新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.CONNECTED,"connected","ctnet");         networkInfo.setIsAvailable(true);          LinkProperties linkProperties = new LinkProperties();         linkProperties.setInterfaceName("ppp0");         try {             linkProperties.addLinkAddress(new LinkAddress(InetAddress.getByName(SystemProperties.get("net.ppp0.local-ip")),32));             InetAddress dnsRoute = InetAddress.getByName("0.0.0.0");             linkProperties.addRoute(new RouteInfo(new LinkAddress(dnsRoute,0),dnsRoute,"ppp0"));             InetAddress dns1 = InetAddress.getByName(SystemProperties.get("net.ppp0.dns1"));             InetAddress dns2 = InetAddress.getByName(SystemProperties.get("net.ppp0.dns2"));             linkProperties.addDnsServer(dns1);             linkProperties.addDnsServer(dns2);         } catch (UnknownHostException e) {             e.printStackTrace();         }          linkProperties.setMtu(1500);         linkProperties.setTcpBufferSizes("524288,1048576,2097152,262144,524288,1048576");          NetworkCapabilities networkCapabilities = new NetworkCapabilities();        // networkCapabilities.setNetworkSpecifier("");         networkCapabilities.setLinkUpstreamBandwidthKbps(51200);         networkCapabilities.setLinkDownstreamBandwidthKbps(102400);         networkCapabilities.addCapability(NET_CAPABILITY_INTERNET);         networkCapabilities.addCapability(NET_CAPABILITY_NOT_RESTRICTED);         networkCapabilities.addCapability(NET_CAPABILITY_TRUSTED);         networkCapabilities.addCapability(NET_CAPABILITY_NOT_VPN);          NetworkMisc networkMisc = new NetworkMisc();  //调用注册网络信息函数        registerNetworkAgent(messenger,networkInfo,linkProperties,networkCapabilities,100,networkMisc);      }

对应的打印信息为:

registerNetworkAgent NetworkAgentInfo{ ni{[type: MOBILE[LTE], state: CONNECTED/CONNECTED, reason: connected, extra: ctnet, failover: false, available: true, roaming: false, metered: false]}           network{101}  nethandle{433808132830}           lp{{InterfaceName: ppp0 LinkAddresses: [10.5.66.235/32,]  Routes: [0.0.0.0/0 -> 0.0.0.0 ppp0,] DnsAddresses: [202.96.128.86,202.96.134.133,] Domains: null MTU: 1500 TcpBufferSizes: 524288,1048576,2097152,262144,524288,1048576}}           nc{[ Transports: CELLULAR Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps Specifier: <3>]}            Score{50}  everValidated{false}  lastValidated{false}  created{false} lingering{false} explicitlySelected{false} acceptUnvalidated{false} everCaptivePortalDetected{false} lastCaptivePortalDetected{false} }         

各字段含义:

  1. NetworkAgentInfo: 这是一个包含网络代理信息的对象。

  2. ni: 表示网络接口信息(Network Interface Info),其中:

    • type: 网络类型,这里是 MOBILE[LTE],表示是移动网络,具体是LTE。
    • state: 网络连接状态,这里是 CONNECTED/CONNECTED,表示网络已经连接。
    • reason: 连接成功的原因,这里是 connected
    • extra: 额外信息,这里是 ctnet,可能是运营商或网络的标识。
    • failover: 表示是否是备用网络,这里是 false
    • available: 表示网络是否可用,这里是 true
    • roaming: 表示是否处于漫游状态,这里是 false
    • metered: 表示网络是否是计费网络,这里是 false
  3. network: 表示网络的ID,这里是 101

  4. nethandle: 网络句柄,这里是 433808132830

  5. lp: 表示链路属性(Link Properties),其中:

    • InterfaceName: 网络接口名称,这里是 ppp0
    • LinkAddresses: 网络接口的IP地址,这里是 10.5.66.235/32
    • Routes: 路由信息,这里有一个默认路由 0.0.0.0/0 -> 0.0.0.0 ppp0
    • DnsAddresses: DNS服务器地址,这里是 202.96.128.86,202.96.134.133
    • MTU: 最大传输单元,这里是 1500
    • TcpBufferSizes: TCP缓冲区大小。
  6. nc: 表示网络能力(Network Capabilities),其中:

    • Transports: 传输类型,这里是 CELLULAR
    • Capabilities: 网络能力,包括 INTERNETNOT_RESTRICTEDTRUSTEDNOT_VPN
    • LinkUpBandwidth 和 LinkDnBandwidth: 上行和下行带宽,这里分别是 51200Kbps 和 102400Kbps
    • Specifier: 网络的特定标识,这里是 <3>
  7. Score: 网络代理的评分,这里是 50

  8. everValidatedlastValidated: 表示网络是否曾经被验证过,这里都是 false

  9. created, lingering, explicitlySelected, acceptUnvalidated, everCaptivePortalDetected, lastCaptivePortalDetected: 这些字段描述了网络代理的一些状态和行为,这里大多数都是 false

更新成功后能得到如下打印信息:

07-29 13:41:07.897  2298  4657 D ConnectivityService: registerNetworkAgent NetworkAgentInfo{ ni{[type: MOBILE[LTE], state: CONNECTED/CONNECTED, reason: connected, extra: ctnet, failover: false, available: true, roaming: false, metered: false]}  network{101}  nethandle{433808132830}  lp{{InterfaceName: ppp0 LinkAddresses: [10.5.66.235/32,]  Routes: [0.0.0.0/0 -> 0.0.0.0 ppp0,] DnsAddresses: [202.96.128.86,202.96.134.133,] Domains: null MTU: 1500 TcpBufferSizes: 524288,1048576,2097152,262144,524288,1048576}}  nc{[ Transports: CELLULAR Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps Specifier: <3>]}  Score{50}  everValidated{false}  lastValidated{false}  created{false} lingering{false} explicitlySelected{false} acceptUnvalidated{false} everCaptivePortalDetected{false} lastCaptivePortalDetected{false} } 07-29 13:41:07.898  2298  3890 D ConnectivityService: NetworkAgentInfo [MOBILE (LTE) - 101] EVENT_NETWORK_INFO_CHANGED, going from null to CONNECTED 07-29 13:41:07.899  2298  3890 D ConnectivityService: Adding iface ppp0 to network 101 07-29 13:41:07.951  2298  3890 D ConnectivityService: Setting DNS servers for network 101 to [/202.96.128.86, /202.96.134.133] 07-29 13:41:07.973  2298  3890 D ConnectivityService: Switching to new default network: NetworkAgentInfo{ ni{[type: MOBILE[LTE], state: CONNECTED/CONNECTED, reason: connected, extra: ctnet, failover: false, available: true, roaming: false, metered: false]}  network{101}  nethandle{433808132830}  lp{{InterfaceName: ppp0 LinkAddresses: [10.5.66.235/32,]  Routes: [0.0.0.0/0 -> 0.0.0.0 ppp0,] DnsAddresses: [202.96.128.86,202.96.134.133,] Domains: null MTU: 1500 TcpBufferSizes: 524288,1048576,2097152,262144,524288,1048576}}  nc{[ Transports: CELLULAR Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps Specifier: <3>]}  Score{50}  everValidated{false}  lastValidated{false}  created{true} lingering{false} explicitlySelected{false} acceptUnvalidated{false} everCaptivePortalDetected{false} lastCaptivePortalDetected{false} } 07-29 13:41:08.021  1890  2532 V IdletimerController: runCmd(/system/bin/ip6tables -w -t raw -A idletimer_raw_PREROUTING -i ppp0 -j IDLETIMER --timeout 10 --label 0 --send_nl_msg 1) res_ipv4=0, res_ipv6=0 07-29 13:41:08.059  1890  2532 V IdletimerController: runCmd(/system/bin/ip6tables -w -t mangle -A idletimer_mangle_POSTROUTING -o ppp0 -j IDLETIMER --timeout 10 --label 0 --send_nl_msg 1) res_ipv4=0, res_ipv6=0 07-29 13:41:08.066  1953  2064 D alsa_pcm: pcm_open_req, capture card: 3, device: 0, req_rate: 44100 07-29 13:41:08.066  2298  3890 D ConnectivityService: Sending CONNECTED broadcast for type 0 NetworkAgentInfo [MOBILE (LTE) - 101] isDefaultNetwork=true 07-29 13:41:08.066  1953  2064 E audio_hw_primary: XXX pcm_left Unable to open PCM device (cannot open device '/dev/snd/pcmC3D0c': Device or resource busy) 07-29 13:41:08.066  1953  2064 E audio_hw_primary: XXX init_capture_pcm again 07-29 13:41:08.070  4038  4038 I DeviceStatusMonitor: DeviceStatusMonitor$1.onReceive():51 onReceive() : Action = android.net.conn.CONNECTIVITY_CHANGE 07-29 13:41:08.071  2298  3890 D ConnectivityService: NetworkAgentInfo [MOBILE (LTE) - 101] validation passed

相关内容

热门资讯

写ios系统和安卓系统的人,揭... 你有没有想过,那些默默无闻的程序员们,他们是如何创造出我们每天离不开的iOS系统和安卓系统呢?想象他...
安卓系统设计尺寸规范,适配与优... 亲爱的设计师们,你是否在为安卓系统的设计尺寸规范而头疼?别担心,今天我要带你一起探索这个神秘的领域,...
旧主机改安卓系统,安卓系统改造... 亲爱的读者们,你是否有过这样的经历:家里的旧主机闲置在角落,看着它那略显过时的外观,心里不禁感叹:“...
安卓系统里有趣的,尽在掌握 探索安卓乐园:那些让你笑出声的趣味游戏 开篇:手机里的欢乐小天地想象你手握一部安卓手机,屏幕上跳动...
法兰规格查询系统安卓,安卓版功... 你有没有想过,在繁忙的工程现场,如何快速找到合适的法兰规格呢?别急,今天就来给你揭秘一个神器——法兰...
目前安卓系统最高配置,极致性能... 你有没有发现,现在的手机越来越厉害了,就像是科幻电影里的高科技产品一样。今天,咱们就来聊聊这个话题:...
安卓修改系统返回键,个性化设置... 你有没有发现,手机里的那个小小的返回键,有时候就像是个顽皮的小家伙,让你摸不着头脑?别急,今天就来教...
安卓订餐系统教程视频,从设计到... 你是不是也和我一样,每天忙碌的生活中,最期待的就是那一顿美味的午餐或晚餐呢?现在,有了安卓订餐系统,...
安卓系统限制外部软件,探索外部... 亲爱的手机控们,你是否曾遇到过这样的烦恼:明明打开了“未知来源”,却还是无法安装那些心仪的外部软件?...
麒麟系统怎么运行安卓,麒麟系统... 你有没有想过,在咱们国产的麒麟系统上,也能轻松运行安卓应用?没错,就是那些你平时手机上用的微信、QQ...
苹果安卓系统的平板,性能、设计... 你有没有想过,为什么你的朋友有的捧着苹果平板,有的则对安卓平板情有独钟呢?今天,就让我带你来一场平板...
安卓系统如何显示电量,安卓系统... 手机电量这事儿,是不是让你头疼过?每次看到那个小小的电池图标,心里就七上八下的,生怕它突然没电了。别...
安卓系统能做ppt么,全面指南 你有没有想过,用安卓手机也能轻松制作PPT呢?没错,就是那个我们日常刷剧、聊天、拍照的安卓手机,现在...
安卓系统搜索通配符,高效文件搜... 手机里的文件多得像天上的星星,想要快速找到那个特别重要的文件,你是不是也头疼不已呢?别急,今天就来给...
安卓手机系统谁最强,谁是最强王... 安卓手机系统谁最强?揭秘各大系统间的较量!在这个科技飞速发展的时代,手机已经成为了我们生活中不可或缺...
小米微单 安卓系统,功能与体验... 小米微单,安卓系统下的摄影新宠摄影爱好者们,你们有没有想过,一台相机不仅仅是一个拍照的工具,它还能成...
华为手机降安卓系统,恢复流畅体... 最近手机圈可是热闹非凡呢!华为手机的大动作,简直让人眼睛一亮。没错,就是那个我们熟悉的华为,它竟然要...
安卓系统如何转数据,轻松实现跨... 换新手机的时候,是不是发现旧手机里的宝贝数据都得搬家呢?别急,今天就来给你支个招,让你轻松把安卓系统...
安卓动作识别系统,技术原理与应... 哇,你知道吗?现在智能手机的厉害程度简直让人惊叹!它们不仅能打电话、发短信,还能通过动作来识别你的意...
安卓华为文件系统,引领安卓性能... 亲爱的手机控们,你是否曾在翻看安卓华为手机时,发现那些神秘的文件夹和文件,心里直犯嘀咕:“这玩意儿是...