本文主要介紹了嵌入式Linux系統下使用pppd 2.4.4來進行PPP撥號需要使用的腳本是如何配置的,配置項的含義,同時也說明了如何來配置參數,實現ppp撥號上網。
一.問題提出
嵌入式Linux操作系統下,如果要進行PPP連接,就需要配置撥號要使用的連接腳本。這些腳本參數就決定了PPPD的行爲,會對PPP連接產生很大的影響。所以需要對這些腳本的參數以及具體含義有所瞭解。
二.解決思路
和PPP連接關係密切的有兩個腳本是chat和options兩個腳本。其中,chat腳本是用來進行AT呼叫和控制的腳本,而options腳本就影響PPP連接的。
1. CHAT腳本
一個簡單的chat腳本有下面的結構:
"" AT
OK ATDT dialnumber
CONNECT ""
一個chat腳本都是由字符串對來組成的。前面的字符串都是期望獲取的串,緊跟的是發送的字符串。這個腳本每一項的具體含義是這樣的:
1) MODEM期望空字符串。這句話的意思直接理解就是MODEM不管收到什麼字符串,先發出字符串AT;
2) 期望收到“OK”字符串,然後發送字符串“ATDT dialnumber”
3) 如果收到“CONNECT”,就不再發送,認爲數據鏈路已建立連接。
這樣的chat腳本是最簡單的,如果需要進行超時控制,就可以加入如下字段:
TIMEOUT 10
如果要增加對特殊情況的處理,就加入下面字段:
ABORT BUSY
ABORT NO ANSWER
ABORT RINGING
這三行語句的意思是:如果收到字符串“BUSY”、“NO ANSWER”、“RINGING”就退出執行。
所以在考慮到各種特殊情況下,配置一個PPP連接的CHAT腳本就可以像下面這樣:
TIMEOUT 30
ABORT BUSY
ABORT NO ANSWER
ABORT RINGING
"" AT
OK ATDT dialnumber
CONNECT ""
2.OPTIONS腳本
OPTIONS腳本的內容,爲PPP連接指定了連接使用的設備、使用的控制字符傳輸速率、指定了硬件加速、溢出控制等。
例如下面的options腳本:
ttyS0 ---- 指定連接使用的設備,例如:ttyS0、ttyS1等
57600 ---- 設置連接使用的控制字符傳輸速率,可以設置爲57600、115200等
debug ---- 如果需要加入調試信息,就加入參數debug
logfile /var/ ppplog ---- 將連接過程中的信息輸入到某個文件中
mtu 1500
-detach
noipdefault ---- 不使用默認IP就可以加入參數noipdefault
defaultroute
usepeerdns ---- 使用服務器端協商的DNS就可以設置參數usepeerdns
lcp-echo-failure 4 ---- 當連續4次沒有收到發出的LCP回聲請求時,就認爲服務器端已不再響應,就退出執行。這裏的失敗次數可以靈活來決定。
-ccp ---- 不使用壓縮控制協議
-vj ---- 關掉式IP頭壓縮
-chap ---- 不使用chap鑑權
-mschap-v2 ---- 不使用mschap鑑權
user
hide-password
connect "/usr/bin/chat -v -t6 -f /var/ chat" ---- 制定了要使用的chat腳本的位置。加上參數-v 告訴 chat命令將其所有的輸出/入拷貝到系統記錄裏(通常是 /var/log/messages)。-t 6 指定了執行chat該命令的時間爲6s。chat腳本的位置可以位於/etc/目錄下,也可以位於/var下,這個可以更加需要靈活設置。
其他的參數具體含義可以參照參考PPPD2.4.4 中options.c中註釋:
/*
* Option variables and default values.
*/
int debug = 0; /* Debug flag */
int kdebugflag = 0; /* Tell kernel to print debug messages */
int default_device = 1; /* Using /dev/tty or equivalent */
char devnam[MAXPATHLEN]; /* Device name */
bool nodetach = 0; /* Don't detach from controlling tty */
bool updetach = 0; /* Detach once link is up */
int maxconnect = 0; /* Maximum connect time */
char user[MAXNAMELEN]; /* Username for PAP */
char passwd[MAXSECRETLEN]; /* Password for PAP */
bool persist = 0; /* Reopen link after it goes down */
char our_name[MAXNAMELEN]; /* Our name for authentication purposes */
bool demand = 0; /* do dial-on-demand */
char *ipparam = NULL; /* Extra parameter for ip up/down scripts */
int idle_time_limit = 0; /* Disconnect if idle for this many seconds */
int holdoff = 30; /* # seconds to pause before reconnecting */
bool holdoff_specified; /* true if a holdoff value has been given */
int log_to_fd = 1; /* send log messages to this fd too */
bool log_default = 1; /* log_to_fd is default (stdout) */
int maxfail = 10; /* max # of unsuccessful connection attempts */
char linkname[MAXPATHLEN]; /* logical name for link */
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
int req_unit = -1; /* requested interface unit */
bool multilink = 0; /* Enable multilink operation */
char *bundle_name = NULL; /* bundle name for multilink */
bool dump_options; /* print out option values */
bool dryrun; /* print out option values and exit */
char *domain; /* domain name set by domain option */
int child_wait = 5; /* # seconds to wait for children at exit */
3. 鑑權腳本
一般情況下,PPP連接是需要進行身份認證的。籤權方式有兩種,一種是PAP鑑權,另一種是CHAP鑑權。鑑權需要的用戶名和密碼是存放在PAP-secrets和chap-secrets腳本中,以如下方式存放:
Username * password
需要進行鑑權時,通過在options腳本中指定鑑權方式爲PAP或CHAP,PPP模塊就會從PAP-secrets和chap-secrets腳本中讀出用戶名和密碼,附加到PPP的鑑權包中,發送到服務器端進行身份認證。
4. PPP撥號過程與腳本之間的關係
腳本設置成功以後,怎麼和pppd2.4.4一起工作呢?這個需要從pppd程序的主函數入手。
這個過程是這樣的:
Pppd程序啓動以後,就會按照pathname.h中所指定的文家位置去尋找options腳本文件。這個可以按照需要指定文件的位置,確保pppd能夠準確找到該文件。
Pppd找到options文件後,按順序讀入參數行。在這裏,就可以獲取系統要使用的是哪個設備來進行聯網、設備的速率是多少。
Pppd 將配置的參數解析爲程序當中的全局變量標識符,進行pppd連接控制。
三.實踐情況
下面是FT282 上的PPP連接使用的OPTIONS、 CHAT和PAP-SECRETS腳本。
OPTIONS:
connect "/usr/bin/chat -v -t6 -f /var/ppp/td-scdma_chat"
ttyUSB0
115200
debug
logfile /var/log/ppplog
mtu 1500
-detach
noauth
noipdefault
defaultroute
usepeerdns
crtscts
lock
lcp-echo-failure 4
-ccp
-vj
-chap
-mschap-v2
user
hide-password
CHAT:
"" AT
OK ATDT*98*1#
CONNECT ""
PAP-SECRETS:
wap *wap
經過在FT282上進行測試,發現能夠順利進行PPP連接。