22. 在Debian使用4G模块

  • 平台:野火IMX8M MINI开发板

  • 系统:Debian

  • 需要使用野火4G模块

22.1. EC20 4G模块

野火EC20 4G模块是由EC20 Pcie接口模组加一个USB转接板构成,可方便插接到带有USB接口的Linux主板上。 EC20型号众多,我们选用的型号是CEHCLG,全网通,7模,纯数据、单天线版本。

EC20_4G_module001.png

EC20_4G_module001.png

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

EC20_4G_module002.png

EC20_4G_module002.png

EC20_4G_module003.png

EC20_4G_module003.png

22.2. 野火开发板使用4G模块

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

另外一种则是将EC20模块单独拆下来,将4G卡插到板子的卡槽上。为了方便编写文档,笔者这边使用 这种方式,选用模块为EC20CEFILG,如下图所示

EC20_4G_module003.png

同时将/boot/uEnv.txt中的pcie的插件给打开

dtoverlay=/usr/lib/linux-image-5.4.47-carp-imx8mmini/freescale/overlays/imx8mm-fire-pcie.dtbo

等待大约15S,等待linux系统启动完毕,然后可以在终端输入dmesg命令, 能看到以下内容,就代表模块启动成功:

dmesg

···
[   11.871764] usb 1-1.3: new high-speed USB device number 3 using ci_hdrc
[   12.103743] option 1-1.3:1.0: GSM modem (1-port) converter detected
[   12.110651] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[   12.128304] option 1-1.3:1.1: GSM modem (1-port) converter detected
[   12.135612] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[   12.157887] option 1-1.3:1.2: GSM modem (1-port) converter detected
[   12.166846] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2
[   12.180161] option 1-1.3:1.3: GSM modem (1-port) converter detected
[   12.191698] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB3
[   12.201208] option 1-1.3:1.4: GSM modem (1-port) converter detected
[   12.209176] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB4

22.3. 更新

为了确保我们的软件包版本是最新版本,让我们使用apt命令更新本地apt包索引和升级系统:

1
 sudo apt update

22.4. 安装必要的依赖

首先安装ppp拨号相关的依赖,安装过程中出现任何输入的内容,直接按 回车 即可:

1
 sudo apt install ipppd

安装野火提供的4g模块拨号脚本,(目前该脚本尚未提交到源中,等待更新,可在百度网盘找到) 在安装完成后在 /home/debian 目录下出现 peripheral 文件夹:

1
 sudo apt install peripheral

22.5. 拨号上网

模块想要上网则需要拨号,进入 ~/peripheral/ec20-4g 目录下,可以看到该目录存在以下文件(部分):

  • ec20_options

  • ec20_ppp_dialer

  • ppp-on.sh

ppp-on.sh就是拨号脚本,直接运行它可以进行拨号,ec20_options是拨号的配置文件, 而ec20_ppp_dialer则是拨号的一些指令。

ec20_options文件内容如下

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文件内容如下

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文件内容如下

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
 sudo ./ppp-on.sh


 ATEt@lubancat:~/peripheral/ec20-4g# 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 2859), status = 0x0
 Serial connection established.
 using channel 1
 Using interface ppp0
 Connect: ppp0 <--> /dev/ttyUSB2
 sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x4bf1d9b> <pcomp> <accomp>]
 rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xbc645ee1> <pcomp> <accomp>]
 sent [LCP ConfAck id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0xbc645ee1> <pcomp> <accomp>]
 rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x4bf1d9b> <pcomp> <accomp>]
 sent [LCP EchoReq id=0x0 magic=0x4bf1d9b]
 rcvd [LCP DiscReq id=0x1 magic=0xbc645ee1]
 rcvd [CHAP Challenge id=0x1 <11b9f974888f772951aafaa05068187a>, name = "UMTS_CHAP_SRVR"]
 sent [CHAP Response id=0x1 <3040339ba2851b4e2ef348df6ae28ee6>, name = "Anyname"]
 rcvd [LCP EchoRep id=0x0 magic=0xbc645ee1 04 bf 1d 9b]
 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.22.246.8> <ms-dns1 120.80.80.80> <ms-dns2 221.5.88.88>]
 sent [IPCP ConfReq id=0x2 <addr 10.22.246.8> <ms-dns1 120.80.80.80> <ms-dns2 221.5.88.88>]
 rcvd [IPCP ConfReq id=0x1]
 sent [IPCP ConfAck id=0x1]
 rcvd [IPCP ConfAck id=0x2 <addr 10.22.246.8> <ms-dns1 120.80.80.80> <ms-dns2 221.5.88.88>]
 Could not determine remote IP address: defaulting to 10.64.64.64
 local  IP address 10.22.246.8
 remote IP address 10.64.64.64
 primary   DNS address 120.80.80.80
 secondary DNS address 221.5.88.88
 Script /etc/ppp/ip-up started (pid 2865)
 Script /etc/ppp/ip-up finished (pid 2865), status = 0x0

当你看到拨号返回的内容后有IP地址时,就证明拨号成功。

1
2
 rcvd [IPCP ConfNak id=0x1 <addr 10.22.246.8> <ms-dns1 120.80.80.80> <ms-dns2 221.5.88.88>]
 sent [IPCP ConfReq id=0x2 <addr 10.22.246.8> <ms-dns1 120.80.80.80> <ms-dns2 221.5.88.88>]

22.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.22.246.8  netmask 255.255.255.255  destination 10.64.64.64
     ppp  txqueuelen 3  (Point-to-Point Protocol)
     RX packets 24  bytes 2005 (1.9 KiB)
     RX errors 0  dropped 0  overruns 0  frame 0
     TX packets 30  bytes 1986 (1.9 KiB)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

然后我们可以验证一下ping功能,是否可以访问互联网(此处以ping baidu.com为示例):

1
2
3
4
5
6
7
8
ping baidu.com

PING www.a.shifen.com (157.148.69.80) 56(84) bytes of data.
64 bytes from 157.148.69.80 (157.148.69.80): icmp_seq=1 ttl=52 time=51.2 ms
64 bytes from 157.148.69.80 (157.148.69.80): icmp_seq=2 ttl=52 time=115 ms
64 bytes from 157.148.69.80 (157.148.69.80): icmp_seq=3 ttl=52 time=431 ms
64 bytes from 157.148.69.80 (157.148.69.80): icmp_seq=4 ttl=52 time=264 ms
64 bytes from 157.148.69.80 (157.148.69.80): icmp_seq=5 ttl=52 time=99.7 ms

可能你是接了网线的(假设使用了eth1接口),而默认路由表却不是4G模块,如果想使用网卡上网, 则需要更新路由表,解决办法如下:

1
2
 route del -net 0.0.0.0 eth1
 route add -net 0.0.0.0 ppp0

22.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

22.8. 4G自启动

ec20模块可以用自启动服务调用拨号脚本实现开机自动拨号,也可以配置ec20模块的网卡模式,使用ec20模块自带的拨号功能实现即插即用、自动拨号。

22.8.1. 自启动服务实现开机自动拨号

22.8.1.1. 修改拨号脚本

需要修改ppp-on.sh脚本的参数为自己的绝对路径,否则自启动时无法找到文件,参考如下:

4g_auto.ppg

22.8.1.2. 添加自启动脚本

在/opt/目录下创建一个自启动脚本auto_4G.sh,在auto_4G.sh中根据自己实际路径添加以下内容

1
2
3
4
5
6
#在/opt/auto_4G.sh中根据自己实际路径添加以下内容.

#!/bin/bash
#休眠15秒,是为了等待/dev/ttyUSB2节点生成
sleep 15
echo "temppwd" | sudo /home/debian/peripheral/ec20-4g/ppp-on.sh

22.8.1.3. 添加执行权限

1
sudo chmod 777 /opt/auto_4G.sh

22.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

22.8.1.5. 使能auto_4G.service服务

1
2
sudo systemctl enable auto_4G
sudo systemctl start auto_4G

然后重启开发板,并测试即可。

22.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设备,需要安装相应的驱动程序才能使用。

22.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命令列表

命令

功能

AT+QCFG=”usbnet”

查询网卡模式

AT+QCFG="usbnet",0

设置网卡为RMNET模式

AT+QCFG="usbnet",1

设置网卡为ECM模式

AT+QCFG="usbnet",3

设置网卡为RNDIS模式

22.8.2.2. 配置模块网卡模式为RNDIS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#从RMNET模式切换为RNDIS
#在后台显示/dev/ttyUSB2返回的信息(如果想退出后台显示,使用后面的命令:pkill cat)
cat /dev/ttyUSB2 &

#配置为RNDIS模式(返回:OK 代表配置成功)
echo -e "AT+QCFG=\"usbnet\",3\r\n" >  /dev/ttyUSB2

#重启模块(重启模块才能生效)
echo -e "AT+CFUN=1,1\r\n" >  /dev/ttyUSB2

#重启后可以查看配置是否成功生成
EC20_4G_RNDIS.png

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

EC20_4G_RNDIS_usb1.png

可以从上图发现,熟悉的ppp0网卡没有出现,多了一个usb1的网卡,这个网卡就是ec20在RNDIS模式下对应的网卡,并且自动分配到了IP,如果此时sim卡正常插入,并且能够正常上网,那么此时即可直接使用4G网络,无需再拨号,实现即插即用。

22.8.2.3. 配置模块网卡模式为ECM

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#从RMNET模式切换为ECM
#在后台显示/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模式如出一辙,不再多赘述。

22.9. 使用GPS功能(需要4G模块支持GPS功能)

野火在售的4G模块有两个版本,一个是带GPS功能的,一个是不带GPS功能的,具体型号与说明如下:

  • EC20CEHCLG:不带GPS功能的。

  • EC20CEFILG:带GPS功能的。

EC20_4G_module008.png

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指令手册了解。

实现验证:

  1. /dev/ttyUSB1 读取GPS数据,并将其存储到自定义的文件中 ec20_gps_data.txt , 下面这一行命令就是在后台读取 /dev/ttyUSB1 设备的数据并存储到 ec20_gps_data.txt 文件中, & 表示后台运行。

1
 cat /dev/ttyUSB1 > ~/ec20_gps_data.txt &
  1. 启动GPS会话

1
 echo -e "AT+QGPS=1\r\n" > /dev/ttyUSB2

在启动的时候,可能不会立即收到所有卫星的信号,可以等待一段时间, 注意,必须使用GPS天线并且放置在户外,户内可能搜不到信号。

  1. 查看GPS信息,直接cat这个 ec20_gps_data.txt 文件即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 cat ~/ec20_gps_data.txt


 $GPGSV,2,1,08,02,45,157,38,04,28,202,33,07,37,322,36,09,33,246,38*70

 $GPGSV,2,2,08,21,51,140,36,27,30,033,39,16,19,066,,41,,,34*47

 $GPGGA,092644.00,2253.722053,N,11350.700016,E,1,06,1.0,50.4,M,-2.0,M,,*49


 $GPRMC,092644.00,A,2253.722053,N,11350.700016,E,0.0,0.0,191223,2.4,W,A*27

 $GPGSA,A,2,02,04,07,09,21,27,,,,,,,1.4,1.0,0.9*30

 $GPGSV,2,1,08,02,45,157,37,04,28,202,33,07,37,322,35,09,33,246,38*7C
  1. 当数据正常以后,可以关闭GPS会话

1
 echo -e "AT+QGPSEND\r\n" > /dev/ttyUSB2
  1. 结束从ttyUSB1读取数据的后台进程

1
 ps -aux | grep ttyUSB1 | awk '{print $2}' | sudo xargs kill -9
  1. 使用野火多功能调试助手查看GPS数据信息,首先将数据复制到Windows平台下, 放入一个txt文件,比如我就放在桌面的log.txt文件中,然后打开野火多功能调试助手, 选择GPS定位功能->解码GPS日志文件->选择你的GPS数据文件,注意,这个GPS数据不要太多, 因为定位信息的数据本来就是差不多的,只需要几组即可,否则软件可能卡死。

EC20_4G_module009.png

EC20_4G_module009.png

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

EC20_4G_module010.png

EC20_4G_module010.png

EC20_4G_module011.png

22.10. 获取GPS数据的同时使用4G上网

由于所有的数据指令都是通过 ttyUSB2 去控制的,如果你先进行4G拨号上网后, 这个 ttyUSB2 就已经被占用了,无法通过命令去设置启用GPS功能, 那么必须按以下步骤才能获取GPS数据的同时使用4G上网。以RMNET模式为例

  1. 启动GPS会话。

  2. 进行ppp拨号上网。

  3. 关闭ppp拨号上网。

  4. 关闭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上网。