23. 4G¶
本章配套视频介绍:

《37-4G和5G模块的使用》
https://www.bilibili.com/video/BV12c411M7Gt/
23.1. 4g模块支持列表¶
23.2. 重要说明¶
LubanCat-RK3576系列板卡支持usb接口连接以及mini-pcie接口连接, 虽然他们是两种不一样的接口,但是两种连接方式的原理都是通过usb来通讯。
usb接口连接和mini-pcie接口连接的区别
usb接口连接,需要把sim卡插在usb-4G模块上,使用的sim卡尺寸为 标准sim
mini-pcie接口连接,需要把sim卡插在板卡上,使用的sim卡尺寸为 nano sim
本章会介绍以下4G模块的使用:
EC20
EC200N-CN(理论上适用于EC100N-CN,EC200S 系列,EC200N-CN,EC200M-CN,EC600M-CN,EC600N-CN,EC800M-CN,EC800N-CN,EG912N-EN,EG915N 系列)
23.3. EC20¶
野火EC20 4G模块是由EC20 Pcie接口模组加一个USB转接板构成,可方便插接到带有USB接口的Linux主板上。 EC20型号众多,我们选用的型号是EC20CEFRG,512内存,全网通,支持GPS/语音二次开发。支持分集天线
EC20是移远的一款4G模组,有Mini PCle和LCC两种封装,与处理器通信的协议为USB。 即你们在市面上看到的那些通过板载的PCle接口与EC20连接的板卡, 他们通信时也是通过USB通信,并不是一些初学用户说的通过PCle通信, PCle只是一种封装而已,最终通信都是通过USB。
23.3.1. 模块安装¶
23.3.2. 图形界面¶
由于图形化界面设置只能用于Ubuntu系统,而Debian系统没有图形化配置,所以着重讲解命令行方式,命令行两种系统都能使用。
如果需要Ubuntu系统图形界面可以参考: Ubuntu下图形界面使用4g模块
23.3.3. 命令行¶
LubanCat-RK3576系列板卡出厂固件已经支持4G模块的,所以在收到板卡后可以直接使用, 使用方式也非常简单,首先插入4G的电话卡到SIM卡座上,这张电话卡必须是可以上网的, 然后接上IPX天线(4G模块在发货的时候就已经接好天线的了),最终连接到板卡上, 按以下操作就可以
等待大约6S,可以看到4G模块的蓝色LED灯在闪烁,然后可以在终端输入dmesg命令, 能看到以下内容,就代表模块启动成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | dmesg
···
[ 7045.607736] usbcore: registered new interface driver usbserial_generic
[ 7045.614387] usbserial: USB Serial support registered for generic
[ 7045.687710] usbcore: registered new interface driver option
[ 7045.697962] usbserial: USB Serial support registered for GSM modem (1-port)
[ 7045.706058] option 1-1.1:1.0: GSM modem (1-port) converter detected
[ 7045.719742] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB0
[ 7045.732624] option 1-1.1:1.1: GSM modem (1-port) converter detected
[ 7045.745153] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[ 7045.758280] option 1-1.1:1.2: GSM modem (1-port) converter detected
[ 7045.771023] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[ 7045.779959] option 1-1.1:1.3: GSM modem (1-port) converter detected
[ 7045.795461] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB3
|
23.3.3.1. 安装必要的依赖¶
1 2 3 4 5 | #更新软件
sudo apt update
#获取依赖软件
sudo apt install make gcc git busybox udhcpc
|
23.3.3.2. 获取、编译quectel-CM源码¶
可以获取quectel-CM源码自行编译或者使用野火编译好的。
1 2 3 4 5 6 | #获取quectel-CM源码
git clone https://github.com/kmilo17pet/quectel-cm.git
#进入源码目录
cd quectel-cm/
#编译源码
make
|

编译过程中会有很多warning,最后得到quectel-CM

提示
除了以上自行编译源码,也可以使用野火编译好的,可执行以下操作,下载野火编译好的quectel-CM至/usr/bin/目录下。
1 2 3 4 | #wget下载编译好的quectel-CM至/usr/bin/目录下
sudo wget -O /usr/bin/quectel-CM https://cloud.embedfire.com/software/packages/quectel-CM
#添加执行权限
sudo chmod 777 /usr/bin/quectel-CM
|
23.3.3.3. 拨号¶
拨号命令如下,其中APN根据手机卡运营商而定
1 2 3 4 5 6 7 | #-s参数指定数据连接的APN
sudo ./quectel-CM -s APN &
#APN:
移动:"cmnet"
联通:"3gnet"
电信:"ctnet"
|
测试用的是联通卡所以使用的命令如下
1 2 | #指定联通的APN
sudo ./quectel-CM -s 3gnet &
|

23.3.3.4. 网络测试¶

23.3.3.5. 4G自启动¶
为了以后方便使用,把quectel-CM复制到/usr/bin/下
1 | sudo cp quectel-CM /usr/bin/ -f
|

添加自启动脚本
1 | sudo vi /opt/auto_4G.sh
|
添加如下内容,3gnet是APN根据自己手机卡运营商决定
1 2 3 4 | #注意不要加&,否则可能自启动失败
#!/bin/bash
sudo quectel-CM -s 3gnet
|

添加执行权限
1 | sudo chmod 0755 /opt/auto_4G.sh
|
创建配置文件,在/etc/systemd/system/目录下创建一个auto_4G.service配置文件,内容如下
1 2 3 4 5 6 7 8 9 10 | [Unit]
Description = auto_4G daemon
[Service]
ExecStart = /opt/auto_4G.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
|

使能auto_4G.service服务
1 2 | sudo systemctl enable auto_4G
sudo systemctl start auto_4G
|
重启开发板,并测试

23.3.4. 拨号脚本拨号¶
除了上述使用quectel-CM进行拨号外,也可以使用拨号脚本进行拨号
本方法仅适用于Debian系统,不适用于Ubuntu系统
23.3.4.1. 安装必要的依赖¶
1 2 3 4 5 | #更新软件
sudo apt update
#获取依赖软件
sudo apt install ipppd
|
23.3.4.2. 加载三个必要文件¶
ec20_options
ec20_ppp_dialer
ppp-on.sh
ppp-on.sh就是拨号脚本,直接运行它可以进行拨号, ec20_options是拨号的配置文件, 而ec20_ppp_dialer则是拨号的一些指令。
三个文件的内容如下:
ec20_options文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /dev/ttyUSB2
115200
crtscts
modem
persist
lock
noauth
noipdefault
debug
nodetach
user Anyname
password Anypassword
ipcp-accept-local
ipcp-accept-remote
#replacedefaultroute
defaultroute
usepeerdns
noccp
nobsdcomp
novj
#Dump
|
ec20_ppp_dialer文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 | ABORT "NO CARRIER"
ABORT "ERROR"
TIMEOUT 120
"" ATE
SAY "ATE"
ECHO ON
OK ATH
OK ATP
OK AT+CGDCONT=1,\"IP\",\"CMNET\"
#OK AT+ZSNT=0,0,0
OK ATD*98*1#
CONNECT
|
ppp-on.sh文件内容如下:
1 2 3 4 5 6 | #!/bin/sh
#clear
#ppp-on.sh
OPTION_FILE="ec20_options"
DIALER_SCRIPT="ec20_ppp_dialer"
pppd file $OPTION_FILE connect '/usr/sbin/chat -v -f ec20_ppp_dialer' &
|
23.3.4.3. 运行4G模块¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #给予运行权限
sudo chmod +x ppp-on.sh
#root运行脚本
sudo ./ppp-on.sh
#运行结果
ATE
OK
ATH
OK
ATP
OK
AT+CGDCONT=1,"IP","CMNET"
OK
ATD*98*1#
CONNECT
Script /usr/sbin/chat -v -f ec20_ppp_dialer finished (pid 3212), status = 0x0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB2
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0xb20ad31b> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x3331db1f> <pcomp> <accomp>]
sent [LCP ConfAck id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x3331db1f> <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0xb20ad31b> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0xb20ad31b]
rcvd [LCP DiscReq id=0x1 magic=0x3331db1f]
rcvd [CHAP Challenge id=0x1 <c572f22c913258ae462be0b73b58937c>, name = "UMTS_CHAP_SRVR"]
sent [CHAP Response id=0x1 <f5676d5cae1f8da564d629fb335728ab>, name = "Anyname"]
rcvd [LCP EchoRep id=0x0 magic=0x3331db1f b2 0a d3 1b]
rcvd [CHAP Success id=0x1 ""]
CHAP authentication succeeded
CHAP authentication succeeded
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x1 <addr 10.86.xxx.xxx> <ms-dns1 120.196.165.7> <ms-dns2 221.179.38.7>]
sent [IPCP ConfReq id=0x2 <addr 10.86.xxx.xxx> <ms-dns1 120.196.165.7> <ms-dns2 221.179.38.7>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfAck id=0x2 <addr 10.86.xxx.xxx> <ms-dns1 120.196.165.7> <ms-dns2 221.179.38.7>]
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing default route to eth0 [192.168.103.254]
local IP address 10.86.xxx.xxx
remote IP address 10.64.64.64
primary DNS address 120.196.165.7
secondary DNS address 221.179.38.7
Script /etc/ppp/ip-up started (pid 3221)
Script /etc/ppp/ip-up finished (pid 3221), status = 0x0
|
当你看到拨号返回的内容后有IP地址时,就证明拨号成功。
1 2 | rcvd [IPCP ConfNak id=0x1 <addr 10.86.xxx.xxx> <ms-dns1 120.196.165.7> <ms-dns2 221.179.38.7>]
sent [IPCP ConfReq id=0x2 <addr 10.86.xxx.xxx> <ms-dns1 120.196.165.7> <ms-dns2 221.179.38.7>]
|
23.3.4.4. 验证4G网卡¶
1 2 | #查看ip
ifconfig
|

然后我们可以验证一下ping功能,是否可以访问互联网(此处以ping baidu.com为示例):
1 2 3 4 5 6 | root@lubancat:~# ping baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=48 time=82.2 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=48 time=131 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=48 time=113 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=4 ttl=48 time=117 ms
|
如果你无法ping通网络,出现以下情况
1 2 | root@lubancat:~# ping mi.com
ping: unknown host
|
可能你是接了网线的(假设使用了eth0接口),而默认路由表却不是4G模块, 如果想使用网卡上网, 则需要更新路由表,解决办法如下:
1 2 | route del -net 0.0.0.0 eth0
route add -net 0.0.0.0 ppp0
|
23.3.5. 可能出现的问题¶
经过实测,目前的脚本是可以连接到移动、联通、电信的,如果出现一些其他的问题,可以参考以下内容:
APN设置:
1 2 3 | 移动:at+cgdcont=1,"ip","cmnet"
联通:at+cgdcont=1,"ip","3gnet"
电信:at+cgdcont=1,"ip","ctnet"
|
拨号:
1 2 | 移动:*99***1#或*98*1#
联通:*99#电信:#777
|
23.4. 移远系列4G模块(已验证:EC20/EC200N-CN)¶
本节内容适合 EC100N-CN/ EC200S 系列/ EC200N-CN/ EC200M-CN/ EC600M-CN/ EC600N-CN/ EC800M-CN/ EC800N-CN/ EG912N-EN/ EG915N 系列/ EC200A 系列/ UC200A-GL/ EG912Y 系列// EC100Y 系列 EC600E-CN/ EC800E-CN/
注意
如遇到上述模块无法实现下面的功能,可以联系技术支持,将不适配的移除。
目前已验证的模块有:EC200N-CN

23.4.1. 命令行¶
简单流程:
连接模块,插入sim卡
等待模块成功加载
检查sim卡是否正常工作
配置模块网卡模式
拨号上网
23.4.1.1. 连接模块,插入sim卡¶
参照上文的EC20的安装以及sim卡的插入
23.4.1.2. 等待模块成功加载¶
使用下列命令查看模块是否加载上
1 2 3 4 5 | ls /dev/ttyUSB*
#如果为下面的情况即为成功加载
root@lubancat:~# ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2
|
23.4.1.3. 检查sim卡是否正常工作¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &
#检查sim卡的状态
echo -e "AT+CPIN?\r\n" > /dev/ttyUSB2
#如果返回值为如下即为获取sim卡成功
+CPIN: READY
OK
#如果返回值为如下即为获取sim卡失败
+CME ERROR: 10
+CME ERROR: 13
|
注解
如果遇到无法读卡的问题,可能是卡的触电没有紧密与模块的卡座亲密接触,也可能是模块不支持该品类的卡,最佳的解决方法是联系模块的提供商,让他们给你的问题解决
23.4.1.4. 配置模块网卡模式¶
注解
如果之前成功配置过网卡的模式,网卡是会把成功配置的网卡模式保存,就不需要额外再配置网卡模式了(使用网络可以跳过此步)
移远模块共有4种模式,但不是每种模块都支持4种模式,需根据实际模块确定。
0:rmnet模式:通过QMI工具发的QMI命令,获取公网IP。这种模式可以配合usb_ecm驱动或高通GobiNet驱动使用。
1:ecm模式:通过标准的CDC-ECM发起data call,是发送标准的ECM命令,获取局域网ip。这种模式配合cdc_ether驱动使用
2:mbim模式:Mobile Broadband Interface Model,正宗的移动宽带接口模型,专门用于3G/4G/5G模块的,只在win8以上的windows上使用。一般只在WINDOWS下使用。
3:rndis模式:基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡获取局域网ip。这种方式最简单,模块插上手机卡之后,模块会自动拨号上网。
命令 |
功能 |
---|---|
AT+QCFG=”usbnet” |
查询网卡模式 |
AT+QCFG="usbnet",1 |
设置网卡为ECM模式 |
AT+QCFG="usbnet",3 |
设置网卡为RNDIS模式 |
23.4.1.4.1. 获取当前网卡模式¶
由于模块是使用AT指令操作的。所以可以使用minicom来进行操作,这里为了简化操作,没使用minicom,而是直接在命令行上操作
端口位置:/dev/ttyUSB2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #查询当前模式
#在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &
#查询当前网卡的模式
echo -e "AT+QCFG=\"usbnet\"\r\n" > /dev/ttyUSB2
#例子:
root@lubancat:~# cat /dev/ttyUSB2 &
[1] 1155
root@lubancat:~# echo -e "AT+QCFG=\"usbnet\"\r\n" > /dev/ttyUSB2
root@lubancat:~#
+QCFG: "usbnet",3
#解析
可以看到返回了3,这个是网卡在RNDIS模式
|
+QCFG: "usbnet",3
: RNDIS模式+QCFG: "usbnet",1
: ECM模式
23.4.1.4.2. 配置模块网卡模式为ECM¶
1 2 3 4 5 6 7 8 9 10 | #在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &
#配置为ECM模式(返回:OK 代表配置成功)
echo -e "AT+QCFG=\"usbnet\",1\r\n" > /dev/ttyUSB2
#重启模块(重启模块才能生效)
echo -e "AT+CFUN=1,1\r\n" > /dev/ttyUSB2
#重启后可以查看配置是否成功生成
|
例子

23.4.1.4.3. 配置模块网卡模式为RNDIS¶
1 2 3 4 5 6 7 8 9 10 | #在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &
#配置为ECM模式(返回:OK 代表配置成功)
echo -e "AT+QCFG=\"usbnet\",3\r\n" > /dev/ttyUSB2
#重启模块(重启模块才能生效)
echo -e "AT+CFUN=1,1\r\n" > /dev/ttyUSB2
#重启后可以查看配置是否成功生成
|
例子
详细过程和ECM模式类似,更改其中项就行了
23.4.1.5. 拨号上网¶
如果你完成了前面的配置,把网卡成功配置成ECM模式或者RNDIS模式,即可拨号上网
23.4.1.5.1. 拨号前准备¶
在拨号上网前,需要查看一下网卡是否成功生成网络节点
1 2 3 | #列出当前网络的信息
ifconfig
|
如下图

如果网卡能成功获取ip,像上图的usb1一样即可往后进行拨号操作
如果网卡没能成功获取到ip,像上图的usb0一样,需要重新复位模块或着重启机器
1 2 | #复位模块命令
echo -e "AT+CFUN=1,1\r\n" > /dev/ttyUSB2
|
注解
复位成功后一般就能显示ip了,如果不行,请查看网卡模式的配置模式是否正确,模块是否能正常工作
23.4.1.5.2. 拨号上网¶
在开展这一步前,你需要注意
网卡是否成功获取ip
是否插入sim卡
命令 |
功能 |
---|---|
AT+qnetdevctl=1,1,1 |
立即拨号 |
AT+qnetdevctl=3,1,1 |
自动拨号(开机自动拨号) |
AT+qnetdevctl=0,1,1 |
断开拨号 |
AT+QICSGP=1,”apn”,”username”,”password”,2 |
专网卡拨号 |
拨号上网操作流程
1 2 3 4 5 6 7 8 | #在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &
#立即拨号(返回:OK 代表配置成功)
echo -e "AT+qnetdevctl=1,1,1\r\n" > /dev/ttyUSB2
#自动获取网络
dhclient
|
例子:

问题分析:
如果在拨号的时候返回了ERROR:你的卡可能是专网卡,需要更换拨号命令
1 2 | #需要根据自己的实际情况去填写
AT+QICSGP=1,"apn","username","password",2
|
如果自动获取网络后也没法连上网络,需要检查一下sim卡是否能正常使用
网卡拨号说明
