这是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"