之前做项目时需要用到SIM7100模块,便快速了解下ppp拨号,实现了功能,但是功能虽然实现了,却依然有许多疑问,这段时间有点时间,打算更加详细的研究下。
编译ppp2.4.5
- 下载:官方地址
- 编译:
#1.解压ppp程序包 tar -xzvf ppp-2.4.5.tar.gz #2.进入并生成Makefile cd ./ppp-2.4.5 ./config #3.指定交差编译工具make make CC=arm-linux-gcc
配置内核
Device Drivers --->Network device support---> <*> PPP (point-to-point protocol) support
ppp安装
以上编译过程将会生成pppd、pppdump、pppstats、chat四个运行程序,将他们复制到开发平台下的/usr/sbin/中。
chat:调制解调器的自动对话脚本,Chat程序定义了一个计算机和调制解调器之间对话交流,其主要目的是用来在本地PPPD和远端PPPD程序之间建立连接(简单说就是与4G模块进行AT命令交互的流程表,最终实现与ISP运营商的连接)。
pppd:点对点协议守护进程,其功能为实现ppp策略性的内容,包括所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。
pppdump:将使用pppd记录选项编写的文件转换为人类可读的格式。
pppstats:显示PPP连线状态。pppstats(point to point protocol status)。
拨号流程简图
脚本配置
在开发平台上建立两个文件夹,并拷贝ppp.2.4.5文件夹中的chap-secrets、pap-secrets脚本至/etc/ppp文件夹。
mkdir /etc/ppp
mkdir /etc/ppp/peers
cp ./chap-secrets ./pap-secrets /etc/ppp
# 顺便创建一下ip-up、ip-down脚本
-
pppd配置文件介绍
pppd的参数略多啊,具体可以自己man一下或者点击这里查看。
这里我介绍下我用的,配置文件名称暂定为“gprs”# /etc/ppp/peers/gprs # This is pppd script for China Mobile, used SIMCOM SIM7100C Module # Usage: root>pppd call gprs # Interface should be used is the interface which connects physics interface of SIM7100C Module # ttyname 串口端口,若非以”/“开头,则会自动补充”/dev/“ /dev/ttyUSB3 # speed 串口波特率 115200 #硬件流控 crtscts # 调制解调器模式 modem # 无需身份验证 noauth # 不要求使用chap授权 refuse-chap # 不要求使用mschap授权 refuse-mschap # 不要求使用mschap-v2授权 refuse-mschap-v2 # 调试模式 pppd将以可读形式记录发送或接收的所有控制数据包的内容 debug # 前台运行 nodetach #hide-password # 向ISP请求2个dns服务器地址。这两个地址将以DNS1与DNS2两个环境变量传送到/etc/ppp/ip-up脚本中,并且将环境变USEPEERDNS量置为1 usepeerdns # 禁用本地ip,由ISP提供 noipdefault # 添加ISP网关至路由表,作为默认路由 defaultroute # 用户名 user "cmnet" 0.0.0.0:0.0.0.0 #ipcp-accept-local #ipcp-accept-remote # 使能一下两个选项可以实现ppp掉线自动重播 # lcp连接失败尝试次数 lcp-echo-failure 6 # lcp echo发送间隔 lcp-echo-interval 10 # 禁用压缩控制协议ccp #noccp # 禁用Van Jacobson格式的tcp/ip报头 #novj #novjccomp # 连接终止后不要退出,而是重新尝试连接,连接次数收到maxfail限制 persist # 连接最大尝试次数,0无限制 #maxfail # 启动ppp协议前,进行硬件拨号 connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
-
chat脚本
chat脚本主要用来通过AT命令完成4G模块的拨号过程,关于其选项含义可以man一下或者点击这里查看,下面先介绍下其语法:
chat最主要语法就是“期望-发送”,直白点说就是,我期望收到[某某AT响应],若收到,则发送[某某AT命令]。chat还有个常用的关键词为ABORT,这个关键词用于判断何时终止脚本,在AT交互过程中,模块发生错误,并且输出一些错误信息时,ABORT可根据设定的词,停止当前脚本。
以下脚本命名为“gprs-connect-chat”
#Chat script for China Mobile, used SIMCOM sim7100 TD module. # 设置响应超时 TIMEOUT 15 # 若接收到“DELAYED”、“BUSY”、“ERROR”、“NO DIALTONE”、“NO CARRIER”,则退出脚本 ABORT "DELAYED" ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" ABORT "NO CARRIER" # 无期望,直接发送AT字符串 '' AT # 以下内容可以根据自己模块提供的AT命令手册查询含义 OK ATS0=0 OK ATE0V1 # 设置APN,移动、联通、电信各不相同,见文末表格 OK AT+CGDCONT=1,"IP","CMNET" # 拨号开启GPRS服务,号码移动、联通、电信各不相同,见文末表格 OK ATD*99***1# #期望收到CONNECT CONNECT
-
ip-up脚本
之前的脚本如果没有问题,正常的话运行 pppd call gprs 就可以拨号成功,并且ifconfig后可以查看到ppp0这个网卡。但是如果你在拨号之前已经启用了以太网eth0,此时指定使用ppp0网卡ping指定ip或域名ping -I ppp0 www.baidu.com 并不能成功,原因有两个,一个是路由表中的默认网关是之前eth0生成的,一个是默认的dns服务器地址有问题。
-
解决默认网关问题
在pppd脚本中使能了defaultroute后,pppd会在拨号成功后向路由表中添加一条默认网关信息,但是因为之前已经有一条默认网关了,于是添加失败,默认网关依然是之前eth设置的,因此在pppd call gprs之前我们应该先route del default来删除默认路由(最好写个脚本来实现删除默认路由–拨号等一系列操作)。
- 解决dns问题
在pppd脚本中使能了usepeerdns后,pppd会在拨号成功后,在/etc/ppp下生成resolv.conf,这是ISP运营商提供的dns,我们应该将拷贝或者连接到/etc目录下,当然这件事就可以交给ip-up来做。
ip-up脚本:
#!/bin/bash
#ip-up
dns_file="/etc/resolv.conf"
rm "$dns_file"
ln /etc/ppp/resolv.conf "$dns_file"
-
ip-down脚本
按照ppp拨号过程中打印信息可以发现,在退出pppd进程时,会调用/etc/ppp/ip-down。因此删除默认网关,恢复dns就交由ip-down脚本做了。
#!/bin/bash
#ip-down
#set -vx
dns_file="/etc/resolv.conf"
rm $dns_file
cat > "$dns_file" <<