Linux(23) Linux 4G模块不能获取IP排查思路

简介: Linux(23) Linux 4G模块不能获取IP排查思路

这是EC200 4G模块上网的手动确认步骤,适用于Linux环境。

步骤说明

步骤 1:确认上网状态

正常上网后,可以通过下列命令查看路由表和接口状态:

# 正常路由表和接口状态的打印信息
root@ido:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.13.113.186   0.0.0.0         UG    0      0        0 usb0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 usb0
 
root@ido:/# ifconfig usb0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.13.113.69  netmask 255.0.0.0  broadcast 10.255.255.255
        inet6 fe80::dd52:91ad:24d4:ca45  prefixlen 64  scopeid 0x20<link>
        inet6 240e:47c:3c00:20c7:317d:f653:f76d:3f21  prefixlen 64  scopeid 0x0<global>
        inet6 240e:47c:3c00:20c7:6c8b:b416:99ac:a939  prefixlen 64  scopeid 0x0<global>
        ether ae:0c:29:a3:9b:6d  txqueuelen 1000  (Ethernet)
        RX packets 144  bytes 13303 (13.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 134  bytes 14041 (14.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在这个阶段,我们可以看到路由表和 usb0 接口的IP信息。如果路由表为空或者 usb0 接口没有获取到IP,说明目前无法正常上网。

步骤 2:检查模块状态

/dev/ttyUSB2 设备上执行 AT 命令来检查模块的状态。

cat /dev/ttyUSB2 &
# AT+CPIN?`: 这个命令用于查询SIM卡的状态,例如是否已插入SIM卡,SIM卡是否已解锁等
echo -e "AT+CPIN?\r\n" >/dev/ttyUSB2 
# AT+CSQ`: 这个命令用于查询信号质量,返回的是信号强度和信号质量等级。
echo -e "AT+CSQ\r\n" >/dev/ttyUSB2

这些AT命令会返回模块是否已插入SIM卡、模块是否已启动以及当前的信号质量 我记得好像是0~33吧 , 如果是99,99肯定是不正常的。

步骤 3:查询PDP上下文

使用 at+CGDCONT? 命令查询PDP上下文(Packet Data Protocol Context)的状态。

# at+CGDCONT?`: 此命令用于查询PDP上下文的状态,返回的参数包括PDP类型、APN设置等
root@ido:/# echo -e "at+CGDCONT?\r\n" > /dev/ttyUSB2
root@ido:/#
# 这两条是`at+CGDCONT?`命令的返回值,展示的是PDP上下文的状态。它们显示了每个PDP上下文的参数,如CID,PDP类型,APN等。在这里,"ctlte"和"IMS"分别是两个不同的PDP上下文的APN设置。
+CGDCONT: 1,"IPV4V6","ctlte","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,0,0,0
+CGDCONT: 8,"IPV4V6","IMS","0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0",0,0,0,0,1,1

这个步骤返回的信息会显示已配置的PDP上下文的状态,例如是否已经设置,以及网络类型等。

步骤 4:查询网络设备控制状态

# at+QNETDEVCTL?`: 如之前所述,这个命令用于查询网络设备的状态,返回的状态参数包括设备是否启用,以及数据、语音、SMS服务是否可用。
  root@ido:/# echo -e "at+QNETDEVCTL?\r\n" > /dev/ttyUSB2
+QNETDEVCTL: 1,1,1,1
 
# 如果是下面这种情况--压根拿不到IP , dhcp也没用. (后面解决了 再写)
root@ido:/etc/NetworkManager/conf.d#
+QNETDEVCTL: 0,0,0,0
 
OK

QNETDEVCTL 命令返回的信息表示网络设备的状态,例如设备是否启用,数据业务是否可用等。

+QNETDEVCTL: 1,1,1,1 这是at+QNETDEVCTL?命令的返回值,显示的是网络设备的四个状态参数。在这种情况下,所有的参数都是1,代表每个状态都是开启的,具体包括:

  • 第一个1代表网络设备的启用状态(1为启用,0为禁用);
  • 第二个1代表数据业务的可用状态(1为可用,0为不可用);
  • 第三个1代表语音业务的可用状态(1为可用,0为不可用);
  • 第四个1代表SMS服务的可用状态(1为可用,0为不可用)。

步骤 5:请求网络地址

执行 udhcpc 命令向网络请求地址:

root@ido:/# udhcpc -i usb0
udhcpc: started, v1.30.1
udhcpc: sending discover
udhcpc: sending select for 10.13.113.69
udhcpc: lease of 10.13.113.69 obtained, lease time 86400
# 正常情况下6次左右 , 如果超过10次基本拨不通

这个步骤会向DHCP服务器请求一个IP地址,并配置到 usb0 接口上。

其他 :检查和控制网络

使用下面的命令来检查和控制网络状态。

# AT+QENG="servingcell"`: 此命令用于查询当前服务的小区信息,包括小区ID,信号质量等信息
echo -e "AT+QENG=\"servingcell\"\r\n" > /dev/ttyUSB2
# AT+CFUN=0?` 和 `AT+CFUN=1?`: 这两个命令是用来查询和设置无线模块功能状态的。CFUN=0表示关闭无线模块功能,CFUN=1表示开启无线模块功能。`AT+CFUN=0?` 和 `AT+CFUN=1?`这两条命令是用来查询模块是否处于关闭或开启状态。
echo -e "AT+CFUN=0?\r\n" > /dev/ttyUSB2 
echo -e "AT+CFUN=1?\r\n" > /dev/ttyUSB2

这些AT命令可以用来查看服务小区信息,以及关闭和打开无线模块功能。


通过以上步骤,可以手动验证和排查EC200 4G模块的上网问题。



20230904补充
花了几个小时调的自动化脚本,各种乱七八糟的问题

#!/usr/bin/expect
 
# 1. 检查ttyUSB0、ttyUSB1、ttyUSB2这3个路径是否存在
set timeout 30
foreach port {ttyUSB2 ttyUSB1 ttyUSB0} {
    if {[file exists "/dev/$port"]} {
        set active_port $port
        break
    }
}
 
if {![info exists active_port]} {
    puts "没有找到ttyUSB0、ttyUSB1、ttyUSB2中的任何一个"
    exit 1
}
 
# 启动cat命令并获取其PID
exec cat /dev/ttyUSB2 &
# 等待一会儿确保cat进程已启动
sleep 1  
set cat_pid [exec pgrep -n cat]
puts "使用端口: $active_port,cat进程PID: $cat_pid"
 
# 2. 执行ifconfig usb0 up
exec ifconfig usb0 up
puts "已执行: ifconfig usb0 up"
 
# 3. 发送AT+CPIN?命令
exec echo -e "AT+CPIN?\r\n" > /dev/$active_port
sleep 1 
 
# 4. 发送AT+CSQ命令
exec echo -e "AT+CSQ\r\n" > /dev/$active_port
sleep 1
 
# 5. 发送at+QNETDEVCTL=1,1,1命令
exec echo -e "at+QNETDEVCTL?\r\n" > /dev/$active_port
sleep 1 
exec echo -e "at+QNETDEVCTL=1,1,1,\r\n" > /dev/$active_port
sleep 1
exec echo -e "at+QNETDEVCTL?\r\n" > /dev/$active_port
 
# 6. 拨号udhcpc -i usb0
spawn udhcpc -i usb0
expect {
    "obtained" {
        puts "已拨号: udhcpc -i usb0"
    }
    "udhcpc: read error: Network is down, reopening socket" {
        puts "检测到网络错误,正在尝试重新启动usb0接口..."
        exec ifconfig usb0 down
        sleep 1
        exec ifconfig usb0 up
        sleep 1
        puts "已重新启动usb0接口,正在重新拨号..."
        send "udhcpc -i usb0\r"
    }
    timeout {
        puts "udhcpc命令超时"
    }
}
 
# 7. 检查默认路由
set route_check [exec route -n]
if {![regexp "default" $route_check]} {
    puts "默认路由不存在,正在添加..."
    exec route add default gw 10.0.0.1
    puts "已添加默认路由"
} else {
    puts "默认路由已存在"
}
 
# 杀死cat进程
exec kill $cat_pid
puts "已杀死cat进程,PID: $cat_pid"
 
 


相关文章
|
12天前
|
Web App开发 资源调度 网络协议
Linux系统之部署IP工具箱MyIP
【10月更文挑战第5天】使用Docker部署Radicale日历和联系人应用Linux系统之部署IP工具箱MyIP
43 1
Linux系统之部署IP工具箱MyIP
|
1月前
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
32 1
|
1月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
2月前
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
158 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
2月前
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
|
2月前
|
关系型数据库 Linux PostgreSQL
【Azure 应用服务】Azure Function App Linux环境下的Python Function,安装 psycopg2 模块错误
【Azure 应用服务】Azure Function App Linux环境下的Python Function,安装 psycopg2 模块错误
|
2月前
|
运维 监控 Linux
Linux系统读写硬盘慢,如何排查?四步教你定位问题!
【8月更文挑战第24天】在Linux系统运维中,硬盘读写速度慢是一个常见且影响重大的问题。它不仅会导致服务器性能下降,还会影响用户体验。本文将详细介绍四个步骤,帮助你快速定位并解决Linux系统硬盘读写慢的问题。
440 0
|
2月前
|
网络协议 Linux
在Linux中,如何改IP、主机名、DNS?
在Linux中,如何改IP、主机名、DNS?
|
2月前
|
网络协议 Ubuntu Linux
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
|
2月前
|
监控 网络协议 Linux
在Linux中,如何查看当前系统每个 IP 的连接数?
在Linux中,如何查看当前系统每个 IP 的连接数?