由於一個嵌入式平台上項目開發的需要,在arm平台上實施ppp撥接。說起這個Linux平台的ppp撥接,也許很多人覺很簡單,網上的成功的例子很多!不錯,你說的對,但是我還要給點我的看法,就是這個簡單的ppp撥號折騰了我的時間之長,我都不好意思講。但是,現在看來這個過程學到了好多的東西,得到很多分析能力的鍛煉。現在成功移植到arm開發板上。特寫日誌於此,分享我的這段時間以來的總結:
Linux平台的ppp撥接,(註明:這裡只談命令列撥號,用Linux就要習慣和熟練使用命令列) 在網上常見的有三種方式:
1.使用智能的ppp撥號軟體wvdial:
2.使用3個指令碼的方式:即ppp-on,ppp-on-dialer,ppp-off
以及網上很多成功的案例
註:以上兩種方式各有自己的優缺點,第一種方式智能穩定,他不需要chat程式,使用整合的wvdial工具包直接連接ISP,安全穩定,可以斷線自動重撥。第二方式,使用chat程式,但是很多的參數需要自己去配置,雖然比較靈活,但是如果遇到了撥號錯誤以後,你若不清ppp協議撥號實現的具體機制和每個參數的含義,你就會很吃力,也許運氣好的時候,你啟動並執行環境正好和本地的移動isp配置吻合,恭喜你能上網了,但是你遺憾的是沒有學到東西,想瞭解 ppp機制的朋友,可以試試第2種方式,在瞭解大體瞭解ppp協議的前提下,觀察思考/var/log/messages中的資訊。
3.使用命令pppd call somescript的方式:
我使用就是該方式,下面列出ppp撥號相關設定檔並作適當的解釋;
注意:我使用的gprs模組是HUAWEI GTM900A/B兩種,不同的模組的內部設定有差異,所以設定檔中的某些參數配置有差異,另外還有自身的pc機或者arm開發板的環境以及所處的地點的訊號,移動ISP都有關,在出現問題的時候要考慮這些潛在的可能因素。錯誤排查的過程是個枯燥難受的過程,但是反過來去看,這個過程之後會收穫很多。
預設情況在/etc/ppp/目錄下建立檔案gprs-connect-chat,內容如下(每個參數解釋在ppp-howto中有詳細解釋。它是在ppp 底層會話的時候給chat進程的參數每行是一個“期望/發送”的組合序列。當出現一些經典的錯誤如: "LCP: timeout sending Config-Requests" ,"serial line is not 8 bit clean...",“serial line is looped back”等,去參看方式2提到的兩個文檔,或者google。注意,為什麼不能確切地給出解決的方式,原因是列印出來的同一個錯誤資訊,我稱之為現象,同一現象可能是由很多種原因造成的,需要自己實地排查。)
#/etc/ppp/gprs-connect-chat
TIMEOUT 15
ABORT '/nBUSY/r'
ABORT '/nNO ANSWER/r'
ABORT '/nRINGING/r/n/r/nRINGING/r'
#'' AT
#'OK-+++/c-OK' ATH0
TIMEOUT 40
'' /rAT
OK ATS0=0 #這些都是標準的at命令,建議查看隨模組的at命令手冊
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET" #設定isp接入網關為中國移動的cmnet,如果你想 獲得更多訪問資源的話
OK ATDT*99***1# #中國移動gprs的接駁號碼嗎
CONNECT ''+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
建立檔案/etc/ppp/peers/gprs,它的作用是給pppd進程提供配置參數(詳見man 8 pppd的輸出內容,如果出現問題這個將是非常重要的參考頁),內容如下:#/etc/ppp/peers/gprs
# Usage: root>pppd call gprs
/dev/s3c2410_serial1 #改成自己的連接埠名
115200 #改成自己串口傳輸速率
nocrtscts
#可能你的串口是需要crtscts,硬體流控的,這是由你的串口決定的,一般嵌入式系統的串口沒有帶硬體流控,也不需要就加nocrtscts
modem #這個參數使得pppd進程將等待模組發回的CD (Carrier Detect)訊號,與local真好相反
#noauth
debug #把調試資訊輸出到/var/log/messages,在調試成功後去掉它,以減少垃圾的產生。
nodetach
#hide-password
usepeerdns #以下的3個參數一般不可少
noipdefault
defaultroute
user smsong #設定接入的使用者名稱,在chap-secrets或者pap-secets中使用
0.0.0.0:0.0.0.0 #本地和遠端的ip都設為0使得接入的isp分配本地的ip地址
ipcp-accept-local #要求peer也就是isp給自己非配動態IP地址
#ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 3
noccp #不需要壓縮控制協議,有可能對端不需要,根據自己的isp的情況
#novj
#novjccomp
persist #保證在串連斷開的情況下不退出,並嘗試重新開啟串連
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#pppd調用chat會話進程接入對端isp,啟動對端的pppd,然後本地pppd與對端的pppd一起進行協
#商網路參數和chap/pap認證,成功後,再進行ncp層的ip的分配。+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#/etc/ppp/chap-secets
# Secrets for authentication using CHAP
# client server secret IP addresses
####### RedHat-config-network will overwrite this part!!! (begin) ################# redhat-config-network will overwrite this part!!! (end) ############smsong * 123456 *
有點地區的GPRS可能使用pap方式認證接入使用者,所以在同一級目錄下,建立pap-secets檔案,內容與chap-secets類似有4項的內容第2和第4項一般不限制就用*(星號)代表。反正要你在/etc/ppp/下放著這兩個檔案就好。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++在建立了ppp0串連以後可以使用ctrl+c或者下面的指令碼程式ppp-off斷開ppp串連#/etc/ppp/ppp-off
#!/bin/sh
######################################################################
#
# Determine the device to be terminated.
#
if [ "$1" = "" ]; then
DEVICE=ppp0
else
DEVICE=$1
fi######################################################################