视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
GPRS模块在Linux平台上ppp拨号上网总结与心得
2025-10-02 15:11:08 责编:小OO
文档
GPRS模块在Linux平台上ppp拨号上网总结与心得

2009年07月17日 02:09 来源:ChinaUnix博客 作者:iibull 编辑:周荣茂 

    由于一个嵌入式平台上项目开发的需要,在arm平台上实施ppp拨号上网。说起这个linux平台的ppp拨号上网,也许很多人觉很简单,网上

    的成功的例子很多!不错,你说的对,但是我还要给点我的看法,就是这个简单的ppp拨号折腾了我的时间之长,我都不好意思讲。但是,现在看来这个过程学到

    了好多的东西,得到很多分析能力的锻炼。现在成功移植到arm开发板上。特写日志于此,分享我的这段时间以来的总结:

     linux平台的ppp拨号上网,(注明:这里只谈命令行拨号,用linux就要习惯和熟练使用命令行)

     

    在网上常见的有三种方式:

    1.使用智能的ppp拨号软件wvdial:

    参考案例:本博客的《使用wvdial启动ppp协议拨号上网》

    http://blog.chinaunix.net/u2/76263/showart_12270.html

    2.使用3个脚本的方式:即ppp-on,ppp-on-dialer,ppp-off

    参考文档:linux-ppp-howto ( 

    http://www.dcaccess.net/welcome/linux/PPP-HOWTO.html

     )、howto hook up ppp (

    http://www.theory.physics.ubc.ca/ppp-linux.html

    ) 以及网上很多成功的案例

     

    注:以上两种方式各有自己的优缺点,第一种方式智能稳定,他不需要chat程序,使用集成的wvdial工具包直接连接ISP,安全稳定,可以断线自动重

    拨。第二方式,使用chat程序,但是很多的参数需要自己去配置,虽然比较灵活,但是如果遇到了拨号错误以后,你若不清ppp协议拨号实现的具体机制和每

    个参数的含义,你就会很吃力,也许运气好的时候,你运行的环境正好和本地的移动isp配置吻合,恭喜你能上网了,但是你遗憾的是没有学到东西,想了解

    ppp机制的朋友,可以试试第2种方式,在了解大体了解ppp协议的前提下,观察思考/var/log/messages中的信息。 

    3.使用命令pppd call somescript的方式:

    参考案例:

    http://blog.csdn.net/bouillisy/archive/2005/07/27/436203.aspx

    我使用就是该方式,下面列出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设置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

    no #不需要压缩控制协议,有可能对端不需要,根据自己的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

    ######################################################################

    #

    # If the ppp0 pid file is present then the program is running. Stop it.

    if [ -r /var/run/$DEVICE.pid ]; then

     kill -INT `cat /var/run/$DEVICE.pid`

    #

    # If the kill did not work then there is no process running for this

    # pid. It may also mean that the lock file will be left. You may wish

    # to delete the lock file at the same time.

     if [ ! "$?" = "0" ]; then

     rm -f /var/run/$DEVICE.pid

     echo "ERROR: Removed stale pid file"

     exit 1

     fi

    #

    # Success. Let pppd clean up its own junk.

     echo "PPP link to $DEVICE terminated."

     exit 0

    fi

    #

    # The ppp process is not running for ppp0

    echo "ERROR: PPP link is not active on $DEVICE"

    exit 1

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    做好上面的配置以后,输入pppd call gprs命令,注意如果你的gprs这个文件不在/etc/ppp/peers/目录下,在给出标注路径给pppd

    [root@localhost ppp_scripts]# pppd call gprs

    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^M)

    expect (OK)

    ^M^M

    OK

     -- got it

    send (ATS0=0^M^M)

    expect (OK)

    ^M

    AT^M

    OK

     -- got it

    send (ATE0V1^M^M)

    expect (OK)

    ^M

    ^M^M

    OK

     -- got it

    send (AT+CGDCONT=1,"IP

    expect (OK)

    ^M

    ATS0=0^M^M

    OK

     -- got it

    send (ATDT*99***1#^M^M)

    expect (CONNECT)

    ^M

    ^M^M

    OK^M

    ATE0V1^M^M

    OK^M

    ^M

    OK^M

    ^M

    OK^M

    ^M

    OK^M

    ^M

    CONNECT

     -- got it

    send (^M)

    Serial connection established.

    using channel 20

    Using interface ppp0

    Connect: ppp0 /dev/ttyS0

    Warning - secret file /etc/ppp/pap-secrets has world and/or group access

    sent [LCP ConfReq id=0x1 ]

    rcvd [LCP ConfRej id=0x1 ]

    sent [LCP ConfReq id=0x2 ]

    rcvd [LCP ConfAck id=0x2 ]

    rcvd [LCP ConfReq id=0x1 ]

    sent [LCP ConfAck id=0x1 ]

    rcvd [CHAP Challenge id=0x1 , name = ""]

    Warning - secret file /etc/ppp/chap-secrets has world and/or group access

    sent [CHAP Response id=0x1 , name = "smsong"]

    rcvd [CHAP Success id=0x1 ""]

    CHAP authentication succeeded

    CHAP authentication succeeded

    sent [CCP ConfReq id=0x1 ]

    sent [IPCP ConfReq id=0x1 ]

    rcvd [LCP ProtRej id=0x1 80 fd 01 01 00 0c 1a 04 78 00 18 04 78 00]

    Protocol-Reject for 'Compression Control Protocol' (0x80fd) received

    rcvd [IPCP ConfReq id=0x1]

    sent [IPCP ConfNak id=0x1 ]

    rcvd [IPCP ConfRej id=0x1 ]

    sent [IPCP ConfReq id=0x2 ]

    rcvd [IPCP ConfReq id=0x2]

    sent [IPCP ConfAck id=0x2]

    rcvd [IPCP ConfNak id=0x2 ]

    sent [IPCP ConfReq id=0x3 ]

    rcvd [IPCP ConfAck id=0x3 ]

    Could not determine remote IP address: defaulting to 10...

    local IP address 10.144.202.159

    remote IP address 10...

    primary DNS address 211.138.200.69

    secondary DNS address 211.103.13.101

    Script /etc/ppp/ip-up started (pid 4578)

    Script /etc/ppp/ip-up finished (pid 4578), status = 0x0

    使用ctrl+c可以断开连接,这样一般不太好测试是不是连接上了(遇有开发不上的控制台只有一个的原因),可以去掉/etc/ppp

    /peers/gprs文件中的nodetach参数,要用ping,你需要将eth0即网口给禁用掉,这样ping才会通过ppp0端口寻找路由连接外

    网。

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    可以用命令tail -f /var/log/messages看到日志:

    Mar 20 20:55:55 localhost pppd[4557]: pppd 2.4.4 started by root, uid 0

    Mar 20 20:55:56 localhost chat[4558]: timeout set to 15 seconds

    Mar 20 20:55:56 localhost chat[4558]: abort on (\\nBUSY\\r)

    Mar 20 20:55:56 localhost chat[4558]: abort on (\\nNO ANSWER\\r)

    Mar 20 20:55:56 localhost chat[4558]: abort on (\\nRINGING\\r\\n\\r\\nRINGING\\r)

    Mar 20 20:55:56 localhost chat[4558]: timeout set to 40 seconds

    Mar 20 20:55:56 localhost chat[4558]: send (^MAT^M^M)

    Mar 20 20:55:56 localhost chat[4558]: expect (OK)

    Mar 20 20:55:56 localhost chat[4558]: ^M^M

    Mar 20 20:55:56 localhost chat[4558]: OK

    Mar 20 20:55:56 localhost chat[4558]: -- got it 

    Mar 20 20:55:56 localhost chat[4558]: send (ATS0=0^M^M)

    Mar 20 20:55:56 localhost chat[4558]: expect (OK)

    Mar 20 20:55:56 localhost chat[4558]: ^M

    Mar 20 20:55:56 localhost chat[4558]: AT^M

    Mar 20 20:55:56 localhost chat[4558]: OK

    Mar 20 20:55:56 localhost chat[4558]: -- got it 

    Mar 20 20:55:56 localhost chat[4558]: send (ATE0V1^M^M)

    Mar 20 20:55:56 localhost chat[4558]: expect (OK)

    Mar 20 20:55:56 localhost chat[4558]: ^M

    Mar 20 20:55:56 localhost chat[4558]: ^M^M

    Mar 20 20:55:56 localhost chat[4558]: OK

    Mar 20 20:55:56 localhost chat[4558]: -- got it 

    Mar 20 20:55:56 localhost chat[4558]: send (AT+CGDCONT=1,"IP

    Mar 20 20:55:57 localhost chat[4558]: expect (OK)

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: ATS0=0^M^M

    Mar 20 20:55:57 localhost chat[4558]: OK

    Mar 20 20:55:57 localhost chat[4558]: -- got it 

    Mar 20 20:55:57 localhost chat[4558]: send (ATDT*99***1#^M^M)

    Mar 20 20:55:57 localhost chat[4558]: expect (CONNECT)

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: ^M^M

    Mar 20 20:55:57 localhost chat[4558]: OK^M

    Mar 20 20:55:57 localhost chat[4558]: ATE0V1^M^M

    Mar 20 20:55:57 localhost chat[4558]: OK^M

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: OK^M

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: OK^M

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: OK^M

    Mar 20 20:55:57 localhost chat[4558]: ^M

    Mar 20 20:55:57 localhost chat[4558]: CONNECT

    Mar 20 20:55:57 localhost chat[4558]: -- got it 

    Mar 20 20:55:57 localhost chat[4558]: send (^M)

    Mar 20 20:55:57 localhost pppd[4557]: Serial connection established.

    Mar 20 20:55:57 localhost pppd[4557]: Using interface ppp0

    Mar 20 20:55:57 localhost pppd[4557]: Connect: ppp0 /dev/ttyS0

    Mar 20 20:55:58 localhost pppd[4557]: Warning - secret file /etc/ppp/pap-secrets has world and/or group access

    Mar 20 20:56:00 localhost pppd[4557]: Warning - secret file /etc/ppp/chap-secrets has world and/or group access

    Mar 20 20:56:00 localhost pppd[4557]: CHAP authentication succeeded

    Mar 20 20:56:00 localhost pppd[4557]: CHAP authentication succeeded

    Mar 20 20:56:01 localhost kernel: PPP Deflate Compression module registered

    Mar 20 20:56:02 localhost pppd[4557]: Could not determine remote IP address: defaulting to 10...

    Mar 20 20:56:02 localhost pppd[4557]: local IP address 10.144.202.159

    Mar 20 20:56:02 localhost pppd[4557]: remote IP address 10...

    Mar 20 20:56:02 localhost pppd[4557]: primary DNS address 211.138.200.69

    Mar 20 20:56:02 localhost pppd[4557]: secondary DNS address 211.103.13.101

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    [root@localhost ~]# ifconfig

    eth0 Link encap:Ethernet HWaddr 00:0A:EB:91:3B:C4 

     UP BROADCAST MULTICAST MTU:1500 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:1000 

     RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

     Interrupt:209 Base address:0x4000 

    lo Link encap:Local Loopback 

     inet addr:127.0.0.1 Mask:255.0.0.0

     inet6 addr: ::1/128 Scope:Host

     UP LOOPBACK RUNNING MTU:136 Metric:1

     RX packets:1240 errors:0 dropped:0 overruns:0 frame:0

     TX packets:1240 errors:0 dropped:0 overruns:0 carrier:0

     collisions:0 txqueuelen:0 

     RX bytes:2039094 (1.9 MiB) TX bytes:2039094 (1.9 MiB)

    ppp0 Link encap:Point-to-Point Protocol 

     inet addr:10.144.202.159 P-t-P:10... Mask:255.255.255.255

     UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

     RX packets:5 errors:0 dropped:0 overruns:0 frame:0

     TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

     collisions:0 txqueuelen:3 

     RX bytes:62 (62.0 b) TX bytes:98 (98.0 b)

    [root@localhost ~]# ifconfig eth0 down 

     禁用以太网接口eth0,使得不和ppp0接口使用时候的路由冲突

    [root@localhost ~]# ping 211.136.20.203

    PING 211.136.20.203 (211.136.20.203) 56(84) bytes of data.

     bytes from 211.136.20.203: icmp_seq=1 ttl=247 time=3379 ms

     bytes from 211.136.20.203: icmp_seq=2 ttl=247 time=2388 ms

     bytes from 211.136.20.203: icmp_seq=3 ttl=247 time=22 ms

     bytes from 211.136.20.203: icmp_seq=4 ttl=247 time=1952 ms

     bytes from 211.136.20.203: icmp_seq=5 ttl=247 time=1692 ms

     bytes from 211.136.20.203: icmp_seq=6 ttl=247 time=2112 ms

     bytes from 211.136.20.203: icmp_seq=7 ttl=247 time=1492 ms

     bytes from 211.136.20.203: icmp_seq=8 ttl=247 time=1472 ms

    --- 211.136.20.203 ping statistics ---

    9 packets transmitted, 8 received, 11% packet loss, time 7999ms

    rtt min/avg/max/mdev = 1472.094/2172.525/3379.568/638.150 ms, pipe 4

    这个时候如果你只能ping纯的ip地址,而不能解析域名,这个时候你可能需要将/etc/ppp/resolv.conf(内容被新获得的

    dns取代)内容拷贝到/etc/resolv.conf中或者做一个到/etc/resolv.conf的链接。这样就可以ping域名和在浏览器中打

    开网页啦。

     

    [root@localhost ~]# ping 

    www.baidu.com

    PING 

    www.a.shifen.com

     (202.108.22.5) 56(84) bytes of data.

     bytes from 202.108.22.5: icmp_seq=1 ttl=50 time=3142 ms

     bytes from 202.108.22.5: icmp_seq=2 ttl=50 time=3348 ms

     bytes from 202.108.22.5: icmp_seq=3 ttl=50 time=2796 ms

     bytes from 202.108.22.5: icmp_seq=4 ttl=50 time=3632 ms

     bytes from 202.108.22.5: icmp_seq=5 ttl=50 time=1936 ms

     bytes from 202.108.22.5: icmp_seq=7 ttl=50 time=909 ms

     bytes from 202.108.22.5: icmp_seq=6 ttl=50 time=1951 ms

     bytes from 202.108.22.5: icmp_seq=8 ttl=50 time=2839 ms

     bytes from 202.108.22.5: icmp_seq=9 ttl=50 time=1984 ms

     bytes from 202.108.22.5: icmp_seq=10 ttl=50 time=2404 ms

     bytes from 202.108.22.5: icmp_seq=11 ttl=50 time=1417 ms

    --- 

    www.a.shifen.com

     ping statistics ---

    12 packets transmitted, 11 received, 8% packet loss, time 13806ms

    rtt min/avg/max/mdev = 909.082/2396.720/3632.981/803.194 ms, pipe 4

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    另

    外,如果你希望一开机就可以自动拨号上网,只要在自己的开机启动脚本(我的开发板上是/etc/init.d/rcS,在pc上有好几个如:/etc

    /rc.local文件,做链接到cd

    /etc/rcN.d,N的选择看运行的级别)里面加上如下的语句,注意这个脚本里面的可执行程序给出的必须是据对路径,因为刚开机嘛,整个机子的环境变

    量还没有设置好。 还有不要在新加入的命令后面加&使得其变成后台进程,它会周期性执行,会出错! 

    添加的几条shell语句如下: 

    /etc/ppp/rmlock #简单的一个判断并删除无效的串口的lock文件,保证成功拨号 

    /usr/bin/pppd call gprs #自动拨号 

    /usr/bin/sleep 20 #给它20s的拨号时间,看你的模块拨通的情况了。 

    /bin/qtopia & #这个是原来脚本里面有的,把它的顺序安排在这个位置,是为了在看到qt界面启 #动以后,真好gprs拨号已经建立号,也就可以上网了。 

    /sbin/ifconfig eth0 down #顺便开机禁用eth0网口 

    注:rmlock文件

    #/etc/ppp/rmlock file 

    #!/bin/sh

    if [ -f /var/lock/LCK..s3c2410_serial1 ]; then

    /bin/rm -f /var/lock/LCK..s3c2410_serial1 

    fi

    如何解决pppd 运行的段错误:

    当你手动中断ppp链接次数过多后,可能回出现pppd运行的段错误,

    The suggestion from debian bug report solves this problem. It is

    pretty straightforward: Simply delete /var/run/pppd.tdb file (in my

    system, it is /var/run/pppd2.tdb).

    总结:根据自己的环境和喜好选用其中一种拨号方式,wvdial的方式移植到arm开发板的时候,交叉编译的时候出错很多,可以试试,相对比较

    麻烦,而其它运行需要wvstreams的库的支持,占用空间大。第2中方式最常用,但是出错的可能性比较大,原因使其比较灵活,第3中跟第2中方式类

    似。在出错的时候可以到google上搜索同样的错误现象,参考并修改自己的参数,再分析尝试,只要坚持到底,才会真有收获!当时你要没有什么时间了也不

    想学习ppp的内部拨号机制,建议用windows把,那个封装的很好。稳定可靠!呵呵

     

    祝:ppp&linux拨号的朋友好运!下载本文

显示全文
专题