在ARM+LINUX上使用pppd拔號上網(GPRS)流程

kunkliu發表於2020-04-05

轉載地址:http://www.eeworld.com.cn/mcu/article_2016062027121.html

我的程式設計環境是vmware + fedora9, ARM目標板為ATMEL 9G45,LINUX核心2.6.30, GPRS模組為TELIT公司的GC864-DUAL-V2,使用3線制串列埠連線(TXD RXD GND)


1.修改2.6.30核心選項,
 make menuconfig
Device drivers -> Networking device support -> PPP(point to point protocol) support
 我選了以下模組(以M方式即module方式)
PPP support for async serial ports
PPP support for sync tty ports
PPP Deflate compression
PPP BSD-Compress compression
SLIP(serial line) support
之後編譯:make && make install && make modules && make modules_install
得到了幾個ko形式的核心庫檔案,拷貝它們到ARM目標板上,並在/etc/init.d/rcS中動態載入:
insmod /etc/ppp/slhc.ko                                        
insmod /etc/ppp/ppp_generic.ko                                 
insmod /etc/ppp/ppp_async.ko                                   
insmod /etc/ppp/ppp_synctty.ko                                 
insmod /etc/ppp/ppp_deflate.ko                                 
insmod /etc/ppp/bsd_comp.ko                                    
insmod /etc/ppp/slip.ko
注意載入順序,我記得好象必須把slhc.ko先載入

2. 移植ppp與連線網路過程,  
1) ppp2.4.4 原始碼編譯過程

#./configure

#make CC=arm-linux-gcc 注意指定arm-linux-gcc的路徑,或是直接用絕對路徑指定

需要拷貝到ARM目標板的檔案有:
pppd
pppdump
pppstatus
chat
2 ) 指令碼準備
有4個指令碼需要準備,一個是規則檔案/etc/ppp/gprs-connect-chat,一個是引數檔案/etc/ppp/peers/gprs, 還有認證檔案:pap-secret和chap-secret。(其實我這裡只用到了pap-secret, 至於chap-secret 沒有有到。anyhow,把它們全建立上)
(1) 指令碼 #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              AT+FLO=0          #這個是GC864-DUAL-V2特別要設定的,就是要關閉流控
OK              ATS0=0
OK              ATE0V1
OK              AT+CGDCONT=1,"IP","CMNET" #連線中國移動cmnet網
OK              ATDT*99*1#
CONNECT         ''
(2) 指令碼gprsoptions
#/etc/ppp/peers/gprsoptions
# Usage:   root>pppd call gprsoptions
/dev/ttyS4
115200
nocrtscts
modem
#noauth
#auth
#-pap
#+chap
lock
debug
nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user cmnet
#user smsong
0.0.0.0:0.0.0.0
ipcp-accept-local
#ipcp-accept-remote
#lcp-echo-failure  12
#lcp-echo-interval 3 
noccp                
#novj                
#novjccomp           
persist              
connect '/etc/ppp/chat -s -v -f /etc/ppp/gprs-connect-chat'
(3) 認證檔案pap-secrets 根據需要來改
/etc/ppp # cat pap-secrets 
# Secrets for authentication using PAP
# client    server     secret                    IP addresses
cmnet   *       cmnet   *
(4) 認證檔案 chap-secrets 根據需要來修改,現在暫時沒用到
/etc/ppp # cat chap-secrets 
# Secrets for authentication using CHAP
# client    server     secret                    IP addresses
''      *       ''      *

3) 呼叫過程
ifconfig eth0 down //先關閉有線網路卡,以免與拔號初始化衝突
/etc/ppp/pppd call gprs& //啟動/etc/ppp/peers/gprs指令碼
ifconfig eth0 up //重新開有線網路卡
來看連線的顯示日誌內容:
/etc/ppp # ./pppd call gprs&
/etc/ppp # timeout set to 15 seconds
abort on (\nBUSY\r)
abort on (\nNO ANSWER\r)
abort on (\nRINGING\r\n\r\nRINGING\r)
timeout set to 40 seconds
send (^MAT^M)
expect (OK)
AT^M^M
OK
 -- got it

send (AT+FLO=0^M)
expect (OK)
^M
AT+FLO=0^M^M
OK
 -- got it

send (ATS0=0^M)
expect (OK)
^M
ATS0=0^M^M
OK
 -- got it

send (ATE0V1^M)
expect (OK)
^M
ATE0V1^M^M
OK
 -- got it

send (AT+CGDCONT=1,"IP","CMNET"^M)
expect (OK)
^M
^M
OK
 -- got it

send (ATDT*99*1#^M)
expect (CONNECT)
^M
^M
CONNECT
 -- got it

send (^M)
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyS4
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [LCP ConfReq id=0x1 ]
rcvd [LCP ConfAck id=0x1 ]
rcvd [LCP ConfReq id=0x1 ]
sent [LCP ConfAck id=0x1 ]
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [PAP AuthReq id=0x1 user="cmnet" password=]
rcvd [PAP AuthAck id=0x1 "Welcome!"]
Remote message: Welcome!
PAP authentication succeeded
sent [IPCP ConfReq id=0x1 ]
rcvd [IPCP ConfReq id=0x1 ]
sent [IPCP ConfAck id=0x1 ]
rcvd [IPCP ConfRej id=0x1 ]
sent [IPCP ConfReq id=0x2 ]
rcvd [IPCP ConfNak id=0x2 ]
sent [IPCP ConfReq id=0x3 ]
rcvd [IPCP ConfAck id=0x3 ]
local  IP address 10.176.120.186
remote IP address 192.168.202.0
primary   DNS address 218.201.96.130
secondary DNS address 211.137.191.26

4)  檢視網路設定與ping實驗
/etc/ppp # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.176.120.186  P-t-P:192.168.202.0  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:64 (64.0 B)  TX bytes:82 (82.0 B)
來ping 一下看看
/etc/ppp # ping www.163.com -c 3
PING www.163.com (221.204.240.161): 56 data bytes
64 bytes from 221.204.240.161: seq=0 ttl=46 time=466.873 ms
64 bytes from 221.204.240.161: seq=1 ttl=46 time=435.762 ms
64 bytes from 221.204.240.161: seq=2 ttl=46 time=414.000 ms

--- www.163.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 414.000/438.878/466.873 ms

3.其它問題

1 )  設定DNS地址
/etc/ppp 下會由拔號自動產生resolv.conf 檔案, 但它和 /etc/resolv.conf 並不是同一個檔案,所以有的時候不能解析DNS。
一個好辦法是,首先保證存在/etc/resolv.conf, 然後在/etc/ppp下建立軟連結ln -s /etc/ppp/resolv.conf /etc/resolv.conf
這樣在拔號成功後,在/etc/resolv.conf中會有類似以下內容:
nameserver 218.201.96.130
nameserver 211.137.191.26
2) 只能ping IP地址,不能ping域名的現象
在busybox的命令幫助頁面有這樣一段話:
引用:
LIBC NSS
When used with glibc, the BusyBox 'networking' applets will similarly require that you install at least some of the glibc NSS stuff (in particular, /etc/nsswitch.conf, /lib/libnss_dns*, /lib/libnss_files*, and /lib/libresolv*).
於是把arm-linux工具鏈的lib目錄下的 libnss_dns* , libnss_files* , libresolv* 拷貝到ARM目標板的/lib下。可以ping域名啦 
/etc/ppp # ping www.163.com
PING www.163.com (221.204.240.161): 56 data bytes
64 bytes from 221.204.240.161: seq=0 ttl=46 time=641.269 ms
64 bytes from 221.204.240.161: seq=1 ttl=46 time=435.801 ms
64 bytes from 221.204.240.161: seq=2 ttl=46 time=446.776 ms
64 bytes from 221.204.240.161: seq=3 ttl=46 time=381.381 ms
64 bytes from 221.204.240.161: seq=4 ttl=46 time=468.495 ms

--- www.163.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 381.381/474.744/641.269 ms


3) 如何實現拔號與中國聯通的3G 聯網?
換用TELIT公司的UC864-E, 使用USB連線方式。指定串列埠為ttyUSB0
對於ppp方面,只需要更改4個指令碼中的少量內容
a. 更改options指令碼
  把gprsoptions更名為g3options, 把裡面的這一行引數/dev/ttyS4 更改為/dev/ttyUSB0,
把connect '/etc/ppp/chat -s -v -f /etc/ppp/gprs-connect-chat'
更改為connect '/etc/ppp/chat -s -v -f /etc/ppp/g3-connect-chat'
b. 更改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              AT+FLO=0
OK              ATS0=0
OK              ATE0V1
OK              AT+CGDCONT=1,"IP","UNINET" #UNINET是代表中國聯通網的意思
#OK              AT+CGDCONT=1,"IP","CMNET"
OK              ATDT*99*1#
CONNECT    
c. 更改pap-secrets
# Secrets for authentication using PAP
# client    server     secret                    IP addresses
#cmnet   *       cmnet   *  #如果是中國移動GPRS就用cmnet
uninet *       uninet  * #如果是中國聯通3G就用uninet

d. 更改chap-secrets
同上pap-secrets

相關文章