《EC20 — 利用PPP实现4G模块联网》
初步實(shí)現(xiàn)使用pppd連接GPRS上網(wǎng)
https://blog.csdn.net/kunkliu/article/details/81066788
linux下GPRS ppp撥號(hào)默認(rèn)路由問題(存在eth0)
https://blog.csdn.net/weixin_33778544/article/details/88760094
關(guān)于Linux使用pppd撥號(hào),自動(dòng)斷網(wǎng),重新?lián)芴?hào)功能
https://blog.csdn.net/u010871058/article/details/72912042
http://www.360doc.com/content/16/0713/12/9484405_575171012.shtml
1.源碼下載及編譯
下載地址:PPP源碼
下載的是2.4.5的源碼。
tar zxvf ppp-2.4.5.tar.gz cd ppp-2.4.5 ./configure make CC=arm-hisiv400-linux-gcc
2.內(nèi)核配置
Device Drivers--->
Network device support->
<*>ppp(point-to-point protocol) support
3.ppp安裝
以上編譯過程將會(huì)生成pppd、pppdump、pppstats、chat四個(gè)運(yùn)行程序,將他們復(fù)制到開發(fā)平臺(tái)下的/usr/sbin/中。
chat:調(diào)制解調(diào)器的自動(dòng)對(duì)話腳本,Chat程序定義了一個(gè)計(jì)算機(jī)和調(diào)制解調(diào)器之間對(duì)話交流,其主要目的是用來在本地PPPD和遠(yuǎn)端PPPD程序之間建立連接(簡單說就是與4G模塊進(jìn)行AT命令交互的流程表,最終實(shí)現(xiàn)與ISP運(yùn)營商的連接)。
pppd:點(diǎn)對(duì)點(diǎn)協(xié)議守護(hù)進(jìn)程,其功能為實(shí)現(xiàn)ppp策略性的內(nèi)容,包括所有鑒權(quán)、壓縮/解壓和加密/解密等擴(kuò)展功能的控制協(xié)議。
pppdump:將使用pppd記錄選項(xiàng)編寫的文件轉(zhuǎn)換為人類可讀的格式。
pppstats:顯示PPP連線狀態(tài)。pppstats(point to point protocol status)。
4.撥號(hào)流程簡圖
5.腳本配置
在開發(fā)平臺(tái)上建立兩個(gè)文件夾,并拷貝ppp.2.4.5文件夾中etc.ppp中的chap-secrets、pap-secrets腳本至/etc/ppp文件夾。
mkdir /etc/ppp mkdir /etc/ppp/peers cp ./chap-secrets ./pap-secrets /etc/ppp
pppd配置文件介紹
pppd的參數(shù)略多啊,具體可以自己man一下或者點(diǎn)擊這里查看
這里我介紹下我用的,配置文件名稱暫定為“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 串口端口,若非以”/“開頭,則會(huì)自動(dòng)補(bǔ)充”/dev/“ /dev/ttyUSB3 # speed 串口波特率 115200 #硬件流控 crtscts # 調(diào)制解調(diào)器模式 modem # 無需身份驗(yàn)證 noauth # 不要求使用chap授權(quán) refuse-chap # 不要求使用mschap授權(quán) refuse-mschap # 不要求使用mschap-v2授權(quán) refuse-mschap-v2 # 調(diào)試模式 pppd將以可讀形式記錄發(fā)送或接收的所有控制數(shù)據(jù)包的內(nèi)容 debug # 前臺(tái)運(yùn)行 nodetach #hide-password # 向ISP請(qǐng)求2個(gè)dns服務(wù)器地址。這兩個(gè)地址將以DNS1與DNS2兩個(gè)環(huán)境變量傳送到/etc/ppp/ip-up腳本中,并且將環(huán)境變USEPEERDNS量置為1 usepeerdns # 禁用本地ip,由ISP提供 noipdefault # 添加ISP網(wǎng)關(guān)至路由表,作為默認(rèn)路由 defaultroute # 用戶名 user "cmnet" 0.0.0.0:0.0.0.0 #ipcp-accept-local #ipcp-accept-remote # 使能一下兩個(gè)選項(xiàng)可以實(shí)現(xiàn)ppp掉線自動(dòng)重播 # lcp連接失敗嘗試次數(shù) lcp-echo-failure 6 # lcp echo發(fā)送間隔 lcp-echo-interval 10 # 禁用壓縮控制協(xié)議ccp #noccp # 禁用Van Jacobson格式的tcp/ip報(bào)頭 #novj #novjccomp # 連接終止后不要退出,而是重新嘗試連接,連接次數(shù)收到maxfail限制 persist # 連接最大嘗試次數(shù),0無限制 #maxfail # 啟動(dòng)ppp協(xié)議前,進(jìn)行硬件撥號(hào) connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
chat腳本
chat腳本主要用來通過AT命令完成4G模塊的撥號(hào)過程,關(guān)于其選項(xiàng)含義可以man一下或者點(diǎn)擊這里查看,下面先介紹下其語法:
chat最主要語法就是“期望-發(fā)送”,直白點(diǎn)說就是,我期望收到[某某AT響應(yīng)],若收到,則發(fā)送[某某AT命令]。
chat還有個(gè)常用的關(guān)鍵詞為ABORT,這個(gè)關(guān)鍵詞用于判斷何時(shí)終止腳本,在AT交互過程中,模塊發(fā)生錯(cuò)誤,并且輸出一些錯(cuò)誤信息時(shí),ABORT可根據(jù)設(shè)定的詞,停止當(dāng)前腳本。
以下腳本命名為“gprs-connect-chat”
#Chat script for China Mobile, used SIMCOM sim7100 TD module. # 設(shè)置響應(yīng)超時(shí) TIMEOUT 15 # 若接收到“DELAYED”、“BUSY”、“ERROR”、“NO DIALTONE”、“NO CARRIER”,則退出腳本 ABORT "DELAYED" ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" ABORT "NO CARRIER" # 無期望,直接發(fā)送AT字符串 '' AT # 以下內(nèi)容可以根據(jù)自己模塊提供的AT命令手冊(cè)查詢含義 OK ATS0=0 OK ATE0V1 # 設(shè)置APN,移動(dòng)、聯(lián)通、電信各不相同,見文末表格 OK AT+CGDCONT=1,"IP","CMNET" # 撥號(hào)開啟GPRS服務(wù),號(hào)碼移動(dòng)、聯(lián)通、電信各不相同,見文末表格 OK ATD*99***1# #期望收到CONNECT CONNECT
ip-up腳本
之前的腳本如果沒有問題,正常的話運(yùn)行 pppd call gprs 就可以撥號(hào)成功,并且ifconfig后可以查看到ppp0這個(gè)網(wǎng)卡。但是如果你在撥號(hào)之前已經(jīng)啟用了以太網(wǎng)eth0,此時(shí)指定使用ppp0網(wǎng)卡ping指定ip或域名ping -I ppp0 www.baidu.com 并不能成功,原因有兩個(gè),一個(gè)是路由表中的默認(rèn)網(wǎng)關(guān)是之前eth0生成的,一個(gè)是默認(rèn)的dns服務(wù)器地址有問題。
解決默認(rèn)網(wǎng)關(guān)問題
在pppd腳本中使能了defaultroute后,pppd會(huì)在撥號(hào)成功后向路由表中添加一條默認(rèn)網(wǎng)關(guān)信息,但是因?yàn)橹耙呀?jīng)有一條默認(rèn)網(wǎng)關(guān)了,于是添加失敗,默認(rèn)網(wǎng)關(guān)依然是之前eth設(shè)置的,因此在pppd call gprs之前我們應(yīng)該先route del default來刪除默認(rèn)路由(最好寫個(gè)腳本來實(shí)現(xiàn)刪除默認(rèn)路由–撥號(hào)等一系列操作)。
或者將ppp0設(shè)置為默認(rèn)路由。
先刪除原來路由,route del default
再將ppp0設(shè)置為默認(rèn)路由,route add default dev ppp0
(如果不這樣做,在我操作中ping 8.8.8.8是ping不通的,要指定網(wǎng)卡才能ping通,ping -I ppp0 8.8.8.8)
解決dns問題
在pppd腳本中使能了usepeerdns后,pppd會(huì)在撥號(hào)成功后,在/etc/ppp下生成resolv.conf,這是ISP運(yùn)營商提供的dns,我們應(yīng)該將拷貝或者連接到/etc目錄下,當(dāng)然這件事就可以交給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撥號(hào)過程中打印信息可以發(fā)現(xiàn),在退出pppd進(jìn)程時(shí),會(huì)調(diào)用/etc/ppp/ip-down。因此刪除默認(rèn)網(wǎng)關(guān),恢復(fù)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"
6.調(diào)試信息
運(yùn)行pppd call gprs后成功撥號(hào)的調(diào)試打印信息:
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
以下為設(shè)置了斷線重?fù)埽╨cp-echo-failure、lcp-echo-interval)后的打印信息:
No response to 6 echo-requests # 6次echo未收到ISP回應(yīng),自動(dòng)重?fù)堋?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) # 調(diào)用了 /etc/ppp/ip-down 但是我腳本的未運(yùn)行 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
總結(jié)
以上是生活随笔為你收集整理的《EC20 — 利用PPP实现4G模块联网》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc02
- 下一篇: dubbo源码阅读-配置(三)之注解配置