27. 在Debian使用4G模块¶
平台:野火imx6ull开发板
系统:Debian
需要使用野火4G模块
27.1. 野火4G模块¶
野火EC20 4G模块是由EC20 Pcie接口模组加一个USB转接板构成,可方便插接到带有USB接口的Linux主板上。 EC20型号众多,我们选用的型号是CEHCLG,全网通,7模,纯数据、单天线版本。

EC20_4G_module001.png¶
EC20是移远的一款4G模组,有Mini PCle和LCC两种封装,与处理器通信的协议为USB。 即你们在市面上看到的那些通过板载的PCle接口与EC20连接的开发板, 他们通信时也是通过USB通信,并不是一些初学用户说的通过PCle通信, PCle只是一种封装而已,最终通信都是通过USB。

EC20_4G_module002.png¶

EC20_4G_module003.png¶
27.2. 野火开发板使用4G模块¶
野火开发板出厂固件已经支持4G模块的,所以在收到开发板后可以直接使用, 使用方式也非常简单,首先插入4G的电话卡到SIM卡座上,这张电话卡必须是可以上网的, 然后接上IPX天线(4G模块在发货的时候就已经接好天线的了),最终连接到开发板上, Pro或者mini开发板都可以使用野火4G模块。

EC20_4G_module004.png¶

EC20_4G_module005.png¶
等待大约6S,可以看到4G模块的蓝色LED灯在闪烁,然后可以在终端输入dmesg命令, 能看到以下内容,就代表模块启动成功:
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
27.4. 安装必要的依赖¶
首先安装ppp拨号相关的依赖,安装过程中出现任何输入的内容,直接按 回车 即可:
1 | sudo apt install ipppd
|
安装野火提供的4g模块拨号脚本,在安装完成后在 /home/debian
目录下出现 peripheral
文件夹:
1 | sudo apt install peripheral
|
27.5. 拨号上网¶
模块想要上网则需要拨号,进入 ~/peripheral/ec20-4g
目录下,可以看到该目录存在以下文件(部分):
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' &
|
那么我们直接运行ppp-on.sh即可,注意:需要sudo权限运行。
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 51 52 | sudo ./ppp-on.sh
Removed stale lock on ttyUSB2 (pid 4125)
➜ ec20-4g ATE
+CMTI: "ME",2
+CMTI: "ME",3
+CMTI: "ME",4
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 5776), status = 0x0
Serial connection established.
using channel 9
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB2
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x64c762f8> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xa326b19> <pcomp> <accomp>]
sent [LCP ConfAck id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xa326b19> <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x64c762f8> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0x64c762f8]
rcvd [LCP DiscReq id=0x1 magic=0xa326b19]
rcvd [CHAP Challenge id=0x1 <163eafbf8714ed417edfd556ca784e60>, name = "UMTS_CHAP_SRVR"]
sent [CHAP Response id=0x1 <d2f3e94b688d9898ea55893da7cfd10e>, name = "Anyname"]
rcvd [LCP EchoRep id=0x0 magic=0xa326b19 64 c7 62 f8]
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.17.241.161> <ms-dns1 202.96.134.33> <ms-dns2 202.96.128.166>]
sent [IPCP ConfReq id=0x2 <addr 10.17.241.161> <ms-dns1 202.96.134.33> <ms-dns2 202.96.128.166>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfAck id=0x2 <addr 10.17.241.161> <ms-dns1 202.96.134.33> <ms-dns2 202.96.128.166>]
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing default route to eth1 [192.168.0.1]
local IP address 10.17.241.161
remote IP address 10.64.64.64
primary DNS address 202.96.134.33
secondary DNS address 202.96.128.166
Script /etc/ppp/ip-up started (pid 5783)
Script /etc/ppp/ip-up finished (pid 5783), status = 0x0
|
当你看到拨号返回的内容后有IP地址时,就证明拨号成功。
1 2 | rcvd [IPCP ConfNak id=0x1 <addr 10.17.241.161> <ms-dns1 202.96.134.33> <ms-dns2 202.96.128.166>]
sent [IPCP ConfReq id=0x2 <addr 10.17.241.161> <ms-dns1 202.96.134.33> <ms-dns2 202.96.128.166>]
|
27.6. 验证4G网卡¶
一旦拨号成功,可以使用 ifconfig
命令验证4G网卡是否存在,如果成功此时会多出来一个ppp0的网卡,
并且已经获取到IP地址了。可以很明显看到,我们目前有了一个4g模块的网卡ppp0,存在IP地址,
那么说明我们可以使用ppp0进行网络通信:
1 2 3 4 5 6 7 8 9 | ifconfig
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.17.241.161 netmask 255.255.255.255 destination 10.64.64.64
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 4 bytes 52 (52.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 58 (58.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
然后我们可以验证一下ping功能,是否可以访问互联网(此处以ping baidu.com为示例):
1 2 3 4 5 6 | ping baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: seq=0 ttl=48 time=60.056 ms
64 bytes from 39.156.69.79: seq=1 ttl=48 time=62.634 ms
64 bytes from 39.156.69.79: seq=2 ttl=48 time=50.397 ms
|
可能你是接了网线的(假设使用了eth1接口),而默认路由表却不是4G模块,如果想使用网卡上网, 则需要更新路由表,解决办法如下:
1 2 | route del -net 0.0.0.0 eth1
route add -net 0.0.0.0 ppp0
|
以上方法是删除eth1的网关信息,如果需要同时使用4G模块和eth1则可以用下面方法,需要重新添加4G的网关,如下:
1 2 | #从ifconfig输出信息可以看到destination 10.64.64.64
route add default gw 10.64.64.64
|
27.7. 可能出现的问题¶
经过实测,目前的脚本是可以连接到移动、联通、电信的,如果出现一些其他的问题,可以参考以下内容:
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
|
27.8. 4G自启动¶
ec20模块可以用自启动服务调用拨号脚本实现开机自动拨号,也可以配置ec20模块的网卡模式,使用ec20模块自带的拨号功能实现即插即用、自动拨号。
27.8.1. 自启动服务实现开机自动拨号¶
27.8.1.2. 添加自启动脚本¶
在/opt/目录下创建一个自启动脚本auto_4G.sh,在auto_4G.sh中根据自己实际路径添加以下内容
1 2 3 4 | #在/opt/auto_4G.sh中根据自己实际路径添加以下内容.
#!/bin/bash
echo "temppwd" | sudo /home/debian/peripheral/ec20-4g/ppp-on.sh
|
27.8.1.3. 添加执行权限¶
1 | sudo chmod 777 /opt/auto_4G.sh
|
27.8.1.4. 创建配置文件¶
在/etc/systemd/system/目录下创建一个auto_4G.service配置文件,内容如下
1 2 3 4 5 6 7 8 9 10 11 | [Unit]
Description=auto_4g
After=local-fs.target
Before=serial-getty@.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh /opt/auto_4G.sh
ExecStop=/sbin/modprobe -r g_multi
[Install]
WantedBy=multi-user.target
|
27.8.1.5. 使能auto_4G.service服务¶
1 2 | sudo systemctl enable auto_4G
sudo systemctl start auto_4G
|
然后重启开发板,并测试即可。
27.8.2. 配置模块网卡模式实现自动拨号¶
ec20模块支持3种网卡模式,分别是RMNET、ECM和RNDIS模式,网卡默认处于RMNET模式,需要使用拨号脚本获取公网IP,ECM和RNDIS是两种不同的USB网络共享协议。
ECM(Ethernet Networking Control Model)使用标准的Ethernet II帧格式,在ECM模式下,4G网卡会被识别为一个网络接口,可以直接通过DHCP获取IP地址。
RNDIS(Remote Network Driver Interface Specification)使用Microsoft Remote NDIS(RNDIS)协议封装数据包,而在RNDIS模式下,4G网卡会被识别为一个USB设备,需要安装相应的驱动程序才能使用。
27.8.2.1. 获取当前网卡模式¶
由于模块是使用AT指令操作的。所以可以使用minicom来进行操作,这里为了简化操作,没使用minicom,而是直接在命令行上操作。
ec20模块AT命令接口:/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@npi:~# cat /dev/ttyUSB2 &
[1] 1155
root@npi:~# echo -e "AT+QCFG=\"usbnet\"\r\n" > /dev/ttyUSB2
root@npi:~#
+QCFG: "usbnet",0
#解析
可以看到返回了0,这个是网卡在RMNET模式
|
+QCFG: "usbnet",0
: RMNET模式+QCFG: "usbnet",1
: ECM模式+QCFG: "usbnet",3
: RNDIS模式
命令 |
功能 |
---|---|
AT+QCFG=”usbnet” |
查询网卡模式 |
AT+QCFG="usbnet",0 |
设置网卡为RMNET模式 |
AT+QCFG="usbnet",1 |
设置网卡为ECM模式 |
AT+QCFG="usbnet",3 |
设置网卡为RNDIS模式 |
27.8.2.2. 配置模块网卡模式为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
#重启后可以查看配置是否成功生成
|

可以从上图看到ec20模块识别成了RNDIS设备,输入ifconfig 查看当前网卡,如下图所示:

可以从上图发现,熟悉的ppp0网卡没有出现,多了一个usb1的网卡,这个网卡就是ec20在RNDIS模式下对应的网卡,并且自动分配到了IP,如果此时sim卡正常插入,并且能够正常上网,那么此时即可直接使用4G网络,无需再拨号,实现即插即用。
27.8.2.3. 配置模块网卡模式为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
#重启后可以查看配置是否成功生成
|
ECM模式和RNDIS模式如出一辙,不再多赘述。
27.9. 使用GPS功能(需要4G模块支持GPS功能)¶
野火在售的4G模块有两个版本,一个是带GPS功能的,一个是不带GPS功能的,具体型号与说明如下:
EC20CEHCLG:不带GPS功能的。
EC20CEFILG:带GPS功能的。

EC20_4G_module008.png¶
注意,以下的操作必须是带GPS功能版本的4G模块才能使用,请悉知。更重要的是模块需要使用GPS天线,并且天线需要放置在户外,才能正常接收到卫星信号
本文主要讲解EC20模块的GPS功能的基本使用方法,更多详细的指令操作细节、参数、示例 可参考官网提供的手册:Quectel_EC20_GNSS_AT_Commands_Manual, 可以从野火官方git仓库下载: https://github.com/Embedfire/ebf_gsm_ec20 。
EC20挂载系统成功后,在Windows环境下会有四个/dev/ttyUSBx设备文件, 也就是我们一开始看到的识别成功4G模块的设备信息,其中ttyUSB2用于AT指令收发, ttyUSB1用于GPS NMEA的接收。
主要的指令有以下:
指令 |
功能 |
---|---|
AT+QGPSCFG |
用于进行GPS功能的配置 |
AT+QGPS |
启动GPS会话 |
AT+QGPSEND |
结束GPS会话 |
以上只列举了简单启用EC20模块GPS功能并获取到NMEA数据所需的AT指令说明, 其他功能诸如节能模式、其他定位系统模式、频次控制等操作可通过官网GNSS AT指令手册了解。
实现验证:
从
/dev/ttyUSB1
读取GPS数据,并将其存储到自定义的文件中ec20_gps_data.txt
, 下面这一行命令就是在后台读取/dev/ttyUSB1
设备的数据并存储到ec20_gps_data.txt
文件中,&
表示后台运行。
1 | cat /dev/ttyUSB1 > ~/ec20_gps_data.txt &
|
启动GPS会话
1 | echo -e "AT+QGPS=1\r\n" > /dev/ttyUSB2
|
在启动的时候,可能不会立即收到所有卫星的信号,可以等待一段时间, 注意,必须使用GPS天线并且放置在户外,户内可能搜不到信号。
查看GPS信息,直接cat这个
ec20_gps_data.txt
文件即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | cat ~/ec20_gps_data.txt
$GPGSV,5,1,18,03,18,246,29,04,41,313,34,08,29,195,34,09,07,320,23*75
$GPGSV,5,2,18,11,02,194,21,14,28,149,30,21,04,071,30,23,,,23*48
$GPGSV,5,3,18,27,57,170,49,31,34,077,23,32,05,149,29,16,60,336,*7A
$GPGSV,5,4,18,18,,,,22,14,222,,26,41,025,,38,,,34*75
$GPGSV,5,5,18,41,,,34,50,,,48*7B
$GPGGA,011113.00,2253.723057,N,11350.704943,E,1,07,0.6,46.6,M,-2.0,M,,*4C
$GPVTG,296.2,T,298.5,M,0.0,N,0.0,K,A*2A
$GPRMC,011113.00,A,2253.723057,N,11350.704943,E,0.0,296.2,040520,2.4,W,A*27
$GPGSA,A,2,03,04,08,14,22,27,32,,,,,,0.9,0.6,0.7*35
|
当数据正常以后,可以关闭GPS会话
1 | echo -e "AT+QGPSEND\r\n" > /dev/ttyUSB2
|
结束从ttyUSB1读取数据的后台进程
1 | ps -aux | grep ttyUSB1 | awk '{print $2}' | sudo xargs kill -9
|
使用野火多功能调试助手查看GPS数据信息,首先将数据复制到Windows平台下, 放入一个txt文件,比如我就放在桌面的log.txt文件中,然后打开野火多功能调试助手, 选择GPS定位功能->解码GPS日志文件->选择你的GPS数据文件,注意,这个GPS数据不要太多, 因为定位信息的数据本来就是差不多的,只需要几组即可,否则软件可能卡死。

EC20_4G_module009.png¶
得到的位置信息如下(地图可以放大缩小):

EC20_4G_module010.png¶
27.10. 获取GPS数据的同时使用4G上网¶
由于所有的数据指令都是通过 ttyUSB2
去控制的,如果你先进行4G拨号上网后,
这个 ttyUSB2
就已经被占用了,无法通过命令去设置启用GPS功能,
那么必须按以下步骤才能获取GPS数据的同时使用4G上网。
启动GPS会话。
进行ppp拨号上网。
关闭ppp拨号上网。
关闭GPS会话。
测试:
启动GPS会话。
echo -e "AT+QGPS=1\r\n" > /dev/ttyUSB2
查看GPS信息是否正常。
cat /dev/ttyUSB1
进入
~/peripheral/ec20-4g
目录下,进行ppp拨号上网。
sudo ./ppp-on.sh
查看IP信息是否正常,并且
ping
一下baidu.com
, 如果都能成功表示此时可以通过4G模块上网了。
ping baidu.com -I ppp0
关闭ppp拨号上网,可以在关闭后再看看IP信息,下面这句命令返回什么信息都不用管。
ps -aux | grep ppp | awk '{print $2}' | sudo xargs kill -9
关闭GPS会话。
echo -e "AT+QGPSEND\r\n" > /dev/ttyUSB2
按着以上的步骤操作即可在获取GPS数据的同时使用4G上网。