news 2026/7/11 19:41:20

安卓工控4G网络实时监听:网络状态、信号强度、联网类型精准监听方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
安卓工控4G网络实时监听:网络状态、信号强度、联网类型精准监听方案

安卓工控4G网络实时监听:网络状态、信号强度、联网类型精准监听方案

大家好,我是黒漂技术佬。从今天开始咱们进入第二篇章:4G网络稳定性专题。

做无人售货柜的兄弟们,谁没被网络坑过?系统状态栏显示4G满格,结果MQTT断了、数据发不出去、后台显示离线——这就是传说中的"假联网"。

今天咱们就把网络监听这件事彻底搞明白,从系统状态到真实连通性,从信号强度到基站切换,一网打尽。

一、为什么系统的网络状态不可信?

先给新手朋友科普一下,为什么不能直接用系统API判断网络。

系统API告诉你的 vs 真实情况

系统API返回实际可能情况
NETWORK_STATE_CONNECTED连上了4G基站,但基站出口断了
信号满格信号强但带宽为0,基站拥塞
类型是LTE实际降速到2G了,只是显示4G
网络可用DNS挂了,啥都解析不了

核心问题:系统只判断"有没有连上网卡/基站",不判断"能不能真正访问互联网"。

这就好比你家路由器开着,但宽带欠费了——WiFi满格,就是上不了网。

二、网络状态监听三层模型

我总结了一套"三层网络监听模型",从外到内逐层确认:

第一层:接口层 —— 4G模块在不在?有没有数据连接? ↓ 第二层:网络层 —— 能不能Ping通?DNS能不能解析? ↓ 第三层:业务层 —— MQTT连不连得上?业务接口通不通?

第一层:接口状态监听(系统广播)

监听系统的网络变化广播,知道网卡的连接状态:

publicclassNetworkStateReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){ConnectivityManagercm=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfoinfo=cm.getActiveNetworkInfo();if(info!=null&&info.isConnected()){// 网络接口连接了,但不一定能上网inttype=info.getType();// TYPE_MOBILE / TYPE_WIFIStringsubtype=info.getSubtypeName();// LTE / HSDPA / EDGE...notifyInterfaceConnected(type,subtype);}else{// 网络接口断开了notifyInterfaceDisconnected();}}}

Android 7.0+ 推荐用 NetworkCallback:

ConnectivityManagercm=getSystemService(ConnectivityManager.class);cm.registerDefaultNetworkCallback(newConnectivityManager.NetworkCallback(){@OverridepublicvoidonAvailable(Networknetwork){// 网络可用}@OverridepublicvoidonLost(Networknetwork){// 网络丢失}@OverridepublicvoidonCapabilitiesChanged(Networknetwork,NetworkCapabilitiescaps){// 网络能力变化,比如从4G掉到2GbooleanisInternet=caps.hasCapability(NET_CAPABILITY_INTERNET);booleanis4G=caps.hasTransport(TRANSPORT_CELLULAR);}});

第二层:真实连通性检测(探针检测)

接口连上了不代表能上网,得自己探一下:

publicclassNetworkProbe{// 用多个探测点,避免单点故障privatestaticfinalString[]PROBE_URLS={"http://www.baidu.com","http://connect.rom.miui.com/generate_204","http://your-server.com/health"};/** * 检测真实网络连通性 * 注意:必须在子线程执行 */publicstaticbooleanprobeRealConnectivity(){for(Stringurl:PROBE_URLS){try{HttpURLConnectionconn=(HttpURLConnection)newURL(url).openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(3000);conn.setReadTimeout(3000);conn.connect();intcode=conn.getResponseCode();if(code==200||code==204){returntrue;}}catch(Exceptione){// 这个探测点失败,试下一个}}returnfalse;}}

探测策略:

  • 网络变化时立刻探一次
  • 正常情况下每5分钟探一次
  • 疑似弱网时提高探测频率
  • 多个探测点轮询,避免探测服务器挂了误判

第三层:业务连通性检测

网络通了不代表你的业务能用,比如MQTT服务器挂了:

publicclassBusinessConnectivityChecker{/** * 综合判断业务是否可用 */publicintgetBusinessNetworkLevel(){if(!NetworkManager.isInterfaceConnected()){returnNET_LEVEL_DISCONNECTED;// 0 - 完全断开}if(!NetworkProbe.probeRealConnectivity()){returnNET_LEVEL_FAKE_CONNECTED;// 1 - 假联网}if(!MqttManager.getInstance().isConnected()){returnNET_LEVEL_NET_OK_BIZ_FAIL;// 2 - 网通但业务不通}returnNET_LEVEL_FULL_WORKING;// 3 - 完全正常}}

三、4G信号强度实时采集

光知道通不通还不够,信号强弱直接影响稳定性。

获取信号强度

publicclassSignalStrengthMonitor{privateTelephonyManagertelephonyManager;privatePhoneStateListenerphoneStateListener;publicvoidstartMonitor(){telephonyManager=(TelephonyManager)App.getContext().getSystemService(Context.TELEPHONY_SERVICE);phoneStateListener=newPhoneStateListener(){@OverridepublicvoidonSignalStrengthsChanged(SignalStrengthsignalStrength){super.onSignalStrengthsChanged(signalStrength);// 获取LTE信号强度intlevel=signalStrength.getLevel();// 0-4 级intdbm=getLteDbm(signalStrength);// 真实dBm值onSignalChanged(level,dbm);}};telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);}/** * 从SignalStrength中解析LTE的dBm * 不同厂商ROM实现不一样,需要适配 */privateintgetLteDbm(SignalStrengthsignalStrength){try{// 反射获取LTE信号Methodmethod=signalStrength.getClass().getMethod("getLteDbm");return(int)method.invoke(signalStrength);}catch(Exceptione){// 降级处理return-120+signalStrength.getLevel()*20;}}}

信号强度等级参考

dBm范围等级说明
-50 ~ -70极好满格,非常稳定
-70 ~ -85良好正常使用没问题
-85 ~ -100一般弱网边缘,可能丢包
-100 ~ -110较差经常断连,需要优化
< -110极差几乎不可用

经验值:售货柜设备信号低于-100dBm,就要考虑装信号放大器或者换位置了。

四、基站切换与网络抖动识别

4G网络还有个坑——基站切换。设备移动或者基站负载变化时,会从一个基站切到另一个,中间有短暂断网。

基站切换监听

publicclassCellSwitchMonitor{privateintlastCellId=-1;publicvoidcheckCellSwitch(){TelephonyManagertm=(TelephonyManager)App.getContext().getSystemService(Context.TELEPHONY_SERVICE);try{CellInfocellInfo=tm.getAllCellInfo().get(0);intcurrentCellId=getCellId(cellInfo);if(lastCellId!=-1&&lastCellId!=currentCellId){// 基站切换了!onCellSwitched(lastCellId,currentCellId);}lastCellId=currentCellId;}catch(Exceptione){// 部分设备拿不到基站信息}}}

网络抖动防抖

基站切换会导致短暂断网,这时候不要立刻触发重连逻辑,加个防抖:

publicclassNetworkDebouncer{privatestaticfinallongDEBOUNCE_DELAY=3000;// 3秒防抖privateHandlerhandler=newHandler();privateRunnabledisconnectRunnable;/** * 网络断开时调用 */publicvoidonNetworkDisconnected(){// 延迟3秒再确认是真断了,防止基站切换误判if(disconnectRunnable!=null){handler.removeCallbacks(disconnectRunnable);}disconnectRunnable=()->{// 3秒后还没恢复,才认为是真的断了notifyRealDisconnected();};handler.postDelayed(disconnectRunnable,DEBOUNCE_DELAY);}/** * 网络恢复时调用 */publicvoidonNetworkConnected(){if(disconnectRunnable!=null){handler.removeCallbacks(disconnectRunnable);disconnectRunnable=null;}notifyConnected();}}

五、网络状态日志与上报

网络问题排查全靠日志,一定要记详细:

本地网络日志

publicclassNetworkLogger{// 记录网络状态变化publicvoidlogNetworkChange(intoldState,intnewState,Stringreason){Stringlog=String.format("[%s] NET_CHANGE: %d -> %d, reason=%s, signal=%ddbm",TimeUtils.formatNow(),oldState,newState,reason,SignalMonitor.getCurrentDbm());// 写入本地日志文件FileLogger.write("network.log",log);}// 定期记录网络质量publicvoidlogNetworkQuality(){Stringlog=String.format("[%s] NET_QUALITY: level=%d, dbm=%d, type=%s, ping=%dms",TimeUtils.formatNow(),NetworkManager.getNetworkLevel(),SignalMonitor.getCurrentDbm(),NetworkManager.getNetworkType(),NetworkProbe.getLastPingTime());FileLogger.write("network_quality.log",log);}}

关键指标上报后台

把核心网络指标定期上报,方便后台统计分析:

  • 在线时长 / 离线次数
  • 平均信号强度
  • 基站切换次数
  • 网络抖动频率
  • 流量使用情况

六、踩坑经验

坑1:不同厂商ROM信号强度API不一致

  • 现象:同一套代码,A品牌能拿到dBm,B品牌返回0
  • 原因:各家改了SignalStrength的内部实现
  • 解决:多试几种反射方式,拿不到就降级用getLevel()

坑2:WiFi和4G同时存在时的优先级

  • 现象:设备插了网线又有4G,系统优先用WiFi,但WiFi断了不会自动切4G
  • 解决:自己做网络切换策略,检测主网络不通时主动请求切换数据网络

坑3:Android 12+ 权限收紧

  • 现象:拿不到基站信息、信号强度不准
  • 原因:高版本需要ACCESS_FINE_LOCATION权限
  • 解决:申请定位权限,工控设备一般都能拿到

七、总结

4G网络监听的核心:不要相信系统API,要自己探、多层确认

  • 第一层看接口:4G模块连没连上
  • 第二层看连通:能不能真的上网(探针检测)
  • 第三层看业务:MQTT、接口通不通
  • 再加上信号强度、基站切换、防抖处理

把这套做好,"假联网"的问题就能精准识别,不会再出现"系统显示在线但设备失联"的尴尬情况。


我是黒漂技术佬,专注无人零售物联网实战。下一篇咱们聊《弱网断网自动重试机制》,网络断了怎么优雅地重连,既不浪费流量又能快速恢复。

有售货柜网络相关的坑,欢迎私信交流,大家一起避坑~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 19:39:34

MAX77654与STM32F410RB的低功耗电源管理方案

1. 项目背景与核心器件选型在嵌入式系统开发中&#xff0c;电源管理一直是决定产品可靠性和续航能力的关键因素。我们这次要实现的方案&#xff0c;采用了MAX77654电源管理IC与STM32F410RB微控制器的组合&#xff0c;这个搭配在低功耗物联网设备、便携式医疗仪器等领域有着广泛…

作者头像 李华
网站建设 2026/7/11 19:37:48

PyCharm 2024.1 统一版配置实战:3步完成Python 3.12.1解释器与虚拟环境绑定

PyCharm 2024.1 统一版配置实战&#xff1a;3步完成Python 3.12.1解释器与虚拟环境绑定对于Python开发者而言&#xff0c;PyCharm 2024.1统一版的发布标志着开发体验的重大升级——社区版与专业版的合并意味着所有用户都能享受更完整的功能集。本文将聚焦于环境配置这一核心环节…

作者头像 李华
网站建设 2026/7/11 19:37:28

10款主流写小说软件深度测评,新手ai写小说防坑指南(2026最新)

说句实话&#xff0c;现在的网文环境太卷了。以前我们写小说&#xff0c;纯靠一杯浓茶熬大夜&#xff0c;卡文的时候对着电脑揪头发&#xff0c;连做梦都在想下一个情节怎么圆。但现在时代变了&#xff0c;ai写小说已经成了很多头部作者心照不宣的秘密武器。 不过&#xff0c;…

作者头像 李华