https://blog.csdn.net/qq361294382/article/details/52136126node
https://blog.csdn.net/qq361294382/article/details/52136126linux
以前作項目時須要用到SIM7100模塊,便快速瞭解下ppp撥號,實現了功能,可是功能雖然實現了,卻依然有許多疑問,這段時間有點時間,打算更加詳細的研究下。bash
編譯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
1
2
3
4
5
6
7
配置內核app
Device Drivers --->Network device support---> <*> PPP (point-to-point protocol) support
1async
ppp安裝tcp
以上編譯過程將會生成pppd、pppdump、pppstats、chat四個運行程序,將他們複製到開發平臺下的/usr/sbin/中。ide
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腳本
1
2
3
4
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'
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
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
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"
1
2
3
4
5
6
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" <<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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
調試信息
運行pppd call gprs後成功撥號的調試打印信息:
timeout set to 15 seconds
abort on (DELAYED)
abort on (BUSY)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (NO CARRIER)
timeout set to 15 seconds
send (^MAT^M)
expect (OK)
^M
OK
-- got it
send (ATS0=0^M)
expect (OK)
^M
^M
OK
-- got it
send (ATE0V1^M)
expect (OK)
^M
^M
OK
-- got it
send (AT+CGDCONT=1,"IP","CMNET"^M)
expect (OK)
^M
^M
OK
-- got it
send (ATD*99***1#^M)
expect (CONNECT)
^M
^M
CONNECT
-- got it
Script /usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 21001), status = 0x0
Serial connection established.
using channel 19
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [LCP ConfReq id=0x4 <asyncmap 0x0> <magic 0xc2c88df0> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x60 <asyncmap 0x0> <auth chap MD5> <magic 0x5742a3f6> <pcomp> <accomp>]
No auth is possible
sent [LCP ConfRej id=0x60 <auth chap MD5>]
rcvd [LCP ConfAck id=0x4 <asyncmap 0x0> <magic 0xc2c88df0> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x61 <asyncmap 0x0> <magic 0x5742a3f6> <pcomp> <accomp>]
sent [LCP ConfAck id=0x61 <asyncmap 0x0> <magic 0x5742a3f6> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0xc2c88df0]
sent [CCP ConfReq id=0x2 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [IPCP ConfReq id=0x4 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [LCP DiscReq id=0x62 magic=0x5742a3f6]
rcvd [LCP EchoRep id=0x0 magic=0x5742a3f6 c2 c8 8d f0]
rcvd [LCP ProtRej id=0x63 80 fd 01 02 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfReq id=0x2e]
sent [IPCP ConfNak id=0x2e <addr 0.0.0.0>]
rcvd [IPCP ConfRej id=0x4 <compress VJ 0f 01>]
sent [IPCP ConfReq id=0x5 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [IPCP ConfReq id=0x2f]
sent [IPCP ConfAck id=0x2f]
rcvd [IPCP ConfNak id=0x5 <addr 10.149.99.154> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
sent [IPCP ConfReq id=0x6 <addr 10.149.99.154> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
rcvd [IPCP ConfAck id=0x6 <addr 10.149.99.154> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 10.149.99.154
remote IP address 10.64.64.64
primary DNS address 211.136.17.107
secondary DNS address 211.136.20.203
Script /etc/ppp/ip-up started (pid 21008)
Script /etc/ppp/ip-up finished (pid 21008), status = 0x0
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
如下爲設置了斷線重撥(lcp-echo-failure、lcp-echo-interval)後的打印信息:
No response to 6 echo-requests # 6次echo未收到ISP迴應,自動重撥。
Serial link appears to be disconnected.
Connect time 719.4 minutes.
Sent 0 bytes, received 0 bytes.
Script /etc/ppp/ip-down started (pid 29547) # 調用了 /etc/ppp/ip-down 可是我腳本的未運行
sent [LCP TermReq id=0x5 "Peer not responding"]
Script /etc/ppp/ip-down finished (pid 29547), status = 0x0
sent [LCP TermReq id=0x6 "Peer not responding"]
Connection terminated.
Modem hangup
timeout set to 15 seconds
abort on (DELAYED)
abort on (BUSY)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (NO CARRIER)
timeout set to 15 seconds
send (^MAT^M)
expect (OK)
^M
OK
-- got it
send (ATS0=0^M)
expect (OK)
^M
^M
OK
-- got it
send (ATE0V1^M)
expect (OK)
^M
^M
OK
-- got it
send (AT+CGDCONT=1,"IP","CMNET"^M)
expect (OK)
^M
^M
OK
-- got it
send (ATD*99***1#^M)
expect (CONNECT)
^M
^M
CONNECT
-- got it
Script /usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 29664), status = 0x0
Serial connection established.
using channel 20
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [LCP ConfReq id=0x7 <asyncmap 0x0> <magic 0xf8a6761> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x64 <asyncmap 0x0> <auth chap MD5> <magic 0x59d5de84> <pcomp> <accomp>]
No auth is possible
sent [LCP ConfRej id=0x64 <auth chap MD5>]
rcvd [LCP ConfAck id=0x7 <asyncmap 0x0> <magic 0xf8a6761> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x65 <asyncmap 0x0> <magic 0x59d5de84> <pcomp> <accomp>]
sent [LCP ConfAck id=0x65 <asyncmap 0x0> <magic 0x59d5de84> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0xf8a6761]
sent [CCP ConfReq id=0x3 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [IPCP ConfReq id=0x7 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [LCP DiscReq id=0x66 magic=0x59d5de84]
rcvd [LCP EchoRep id=0x0 magic=0x59d5de84 0f 8a 67 61]
rcvd [LCP ProtRej id=0x67 80 fd 01 03 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfReq id=0x30]
sent [IPCP ConfNak id=0x30 <addr 0.0.0.0>]
rcvd [IPCP ConfRej id=0x7 <compress VJ 0f 01>]
sent [IPCP ConfReq id=0x8 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [IPCP ConfReq id=0x31]
sent [IPCP ConfAck id=0x31]
rcvd [IPCP ConfNak id=0x8 <addr 10.42.72.220> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
sent [IPCP ConfReq id=0x9 <addr 10.42.72.220> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
rcvd [IPCP ConfAck id=0x9 <addr 10.42.72.220> <ms-dns1 211.136.17.107> <ms-dns2 211.136.20.203>]
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 10.42.72.220
remote IP address 10.64.64.64
primary DNS address 211.136.17.107
secondary DNS address 211.136.20.203
Script /etc/ppp/ip-up started (pid 29675)
Script /etc/ppp/ip-up finished (pid 29675), status = 0x0
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
三大運營商撥號設置
運營商(ISP) APN 撥號號碼 帳號 密碼中國聯通WCDMA 3GNET *99# 空 空中國電信CDMA 空 #777 ctnet@mycdma.cn vnet.mobi中國移動TD-SCDMA CMNET 981# 空 空中國移動GPRS/EGDE CMNET 99**1# 空 空