基于Linux利用PPP实现4G模块联网
1.编译ppp2.4.5
1.1.ppp程序包下载
下载路径:https://download.samba.org/pub/ppp/
1.2.解压ppp程序包
tar -xzvf ppp-2.4.5.tar.gz
1.3进入并生成Makefile
cd ./ppp-2.4.5
./configure
1.4.指定交差编译工具make
make CC=arm-linux-gcc
2.配置Linux内核(开发板使用的内核)
Device Drivers --->
[*] Network device support --->
<*> PPP (point-to-point protocol) support
<*> PPP BSD-Compress compression
<*> PPP Deflate compression
[*] PPP filtering
<*> PPP MPPE compression (encryption)
[*] PPP multilink support
<*> PPP over Ethernet
<*> PPP on L2TP Access Concentrator
<*> PPP on PPTP Network Server
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
说明:本人使用了串口直接虚拟成网卡,没有通过usb转串口,需要用usb的可以自行打开即可。
3.PPP安装
编译ppp2.4.5过程将目录下pppd chat pppdump pppstats下可执行程序pppd, chat, pppdump, pppstats拷贝到开发板/usr/sbin目录下
chat:调制解调器的自动对话脚本,Chat程序定义了一个计算机和调制解调器之间对话交流,其主要目的是用来在本地PPPD和远端PPPD程序之间建立连接(简单说就是与4G模块进行AT命令交互的流程表,最终实现与ISP运营商的连接)。
pppd:点对点协议守护进程,其功能为实现ppp策略性的内容,包括所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。
pppdump:将使用pppd记录选项编写的文件转换为人类可读的格式。
pppstats:显示PPP连线状态。pppstats(point to point protocol status)。
4.脚本配置
在我们的开发平台(开发板)上建立两个文件夹。
mkdir /etc/ppp
mkdir /etc/ppp/peers
然后建立五个文件,如下:
(1)mkdir /etc/ppp/peers/4g-ppp
# /etc/ppp/peers/4g-ppp
# Usage:root>pppd call 4g-ppp
/dev/ttyS2 115200 # ttyname 串口端口,若非以”/“开头,则会自动补充”/dev/“ 波特率:115200
crtscts # 硬件流控(注意,如果没有流控就不要开,否则会导致chat总是没有回应)
user "test" password "123456"
hide-password
noauth # 无需身份验证
debug # 调试模式 pppd将以可读形式记录发送或接收的所有控制数据包的内容
defaultroute # 添加ISP网关至路由表,作为默认路由
noipdefault # 启用本地ip,由ISP提供
novj # 启用Van Jacobson格式的tcp/ip报头
novjccomp
noccp
ipcp-accept-local
ipcp-accept-remote
local
lock
modem
dump
nodetach # 前台运行
remotename 3gppp
ipparam 3gppp
# 使能一下两个选项可以实现ppp掉线自动重播
lcp-echo-failure 6 # lcp连接失败尝试次数
lcp-echo-interval 10 # lcp echo发送间隔
persist # 连接终止后不要退出,而是重新尝试连接,连接次数收到maxfail限制
ipcp-max-failure 30
# 向ISP请求2个dns服务器地址。这两个地址将以DNS1与DNS2两个环境变量传送到/etc/ppp/ip-up脚本中,
# 并且将环境变USEPEERDNS量置为1
usepeerdns
# 断开连接
disconnect 'chat -s -v -f /etc/ppp/peers/4g-chat-disconnect'
# 启动ppp协议前,进行硬件拨号
connect 'chat -s -v -f /etc/ppp/peers/4g-chat-connect'
(2) mkdir /etc/ppp/peers/4g-chat-connect
# /etc/ppp/peers/4g-chat-connect
ABORT "BUSY"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
TIMEOUT 30
"" AT
OK ATE0
OK ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2
# Insert the APN provided by your network operator, default apn is 3gnet
OK AT+CGDCONT=1,"IP","3gnet",,0,0
OK ATD*99#
CONNECT
(3) mkdir /etc/ppp/peers/4g-chat-disconnect
# /etc/ppp/peers/quectel-chat-disconnect
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
"" +++
"" +++
"" +++
SAY "\nGoodbay\n"
(4) mkdir /etc/ppp/ip-up
说明1:由于rootfs文件系统是只读文件系统,所以这里使用自己建立的ip-up脚本,如果是可读可写的文件系统可直接拷贝ppp-2.4.5/scripts/下的ip-down.local.add、ip-up.local.add,然后把名字改一下,改成ip-up、ip-down。
说明2:这个脚本的作用是为了将4G模块获取到的DNS1和DNS1拷贝到/etc/resolv.conf里面而存在的。也就是说可以根据自己的情况去写这个脚本,只要能将DNS1和DNS1放到/etc/resolv.conf里面即可。
本人使用这种方式,但存在一个问题,就是网线接入的时候,过一会再将网线拔掉,DNS还是使用了网线的。所以这里需要各位自行处理,本人通过其他方式解决此问题。需要的可留言,因为是用在项目中的,所以相对比较复杂。
本人修改的脚本如下:
#!/bin/bash
#ip-up
if [ -f /etc/ppp/resolv.conf ]; then
cp /etc/ppp/resolv.conf /etc/resolv.conf
elif [ -f /var/run/ppp/resolv.conf ]; then
cp /var/run/ppp/resolv.conf /etc/resolv.conf
else
echo nameserver $DNS1 > /etc/resolv.conf
echo nameserver $DNS2 >> /etc/resolv.conf
echo nameserver $DNS1 > /tmp/tmp_resolv.conf
echo nameserver $DNS2 >> /tmp/tmp_resolv.conf
fi
原始脚本如下:
#!/bin/bash
#ip-up
dns_file="/etc/resolv.conf"
rm "$dns_file"
ln /etc/ppp/resolv.conf "$dns_file"
(5) mkdir /etc/ppp/ip-ip-down
#!/bin/bash
#ip-down
#set -vx
dns_file="/etc/resolv.conf"
rm $dns_file
cat > "$dns_file" <<EOF
# auto create by ip-down
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
chmod 755 "$dns_file"
/etc/init.d/networking restart
echo "Set dns for eth0"
5. 进行拨号连接
执行以下命令即可:
pppd call 4g-ppp &
也可以自己写个4g_up.sh脚本运行:
#!/bin/bash
pppd call 4g-ppp &