gprs模块在linux下ppp拨号上网

    由于一个嵌入式平台上项目开发的需要,在arm平台上实施ppp拨号上网。说起这个linux平台的ppp拨号上网,也许很多人觉很简单,网上的成功的例子很多!不错,你说的对,但是我还要给点我的看法,就是这个简单的ppp拨号折腾了我的时间之长,我都不好意思讲。但是,现在看来这个过程学到了好多的东西,得到很多分析能力的锻炼。现在成功移植到arm开发板上。特写日志于此,分享我的这段时间以来的总结:


    linux平台的ppp拨号上网,(注明:这里只谈命令行拨号,用linux就要习惯和熟练使用命令行)
    在网上常见的有三种方式:
    1.使用智能的ppp拨号软件wvdial
    参考案例:本博客的《使用wvdial启动ppp协议拨号上网》

    http://blog.chinaunixXXX.net/u2/76263/showart_122706


    2.使用3个脚本的方式:即ppp-on,ppp-on-dialer,ppp-off
    参考文档:linux-ppp-howto (
    http://XXX.dcaccess.net/welcome/linux/PPP-HOWTO.html
     )、howto hook up ppp (
    http://XXX.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模块是HUAWEIGTM900A/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
    ######################################################################
    #
    # 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","CMNET"^M^M)
    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.64.64.64
    local IP address 10.144.202.159
    remote IP address 10.64.64.64
    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","CMNET"^M^M)
    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.64.64.64
    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.64.64.64
    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:16436 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.64.64.64 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.
    64 bytes from 211.136.20.203: icmp_seq=1 ttl=247 time=3379 ms
    64 bytes from 211.136.20.203: icmp_seq=2 ttl=247 time=2388 ms
    64 bytes from 211.136.20.203: icmp_seq=3 ttl=247 time=2892 ms
    64 bytes from 211.136.20.203: icmp_seq=4 ttl=247 time=1952 ms
    64 bytes from 211.136.20.203: icmp_seq=5 ttl=247 time=1692 ms
    64 bytes from 211.136.20.203: icmp_seq=6 ttl=247 time=2112 ms
    64 bytes from 211.136.20.203: icmp_seq=7 ttl=247 time=1492 ms
    64 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.
    64 bytes from 202.108.22.5: icmp_seq=1 ttl=50 time=3142 ms
    64 bytes from 202.108.22.5: icmp_seq=2 ttl=50 time=3348 ms
    64 bytes from 202.108.22.5: icmp_seq=3 ttl=50 time=2796 ms
    64 bytes from 202.108.22.5: icmp_seq=4 ttl=50 time=3632 ms
    64 bytes from 202.108.22.5: icmp_seq=5 ttl=50 time=1936 ms
    64 bytes from 202.108.22.5: icmp_seq=7 ttl=50 time=909 ms
    64 bytes from 202.108.22.5: icmp_seq=6 ttl=50 time=1951 ms
    64 bytes from 202.108.22.5: icmp_seq=8 ttl=50 time=2839 ms
    64 bytes from 202.108.22.5: icmp_seq=9 ttl=50 time=1984 ms
    64 bytes from 202.108.22.5: icmp_seq=10 ttl=50 time=2404 ms
    64 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拨号的朋友好运!
    
    转载自:http://os.chinaunix.net/a2009/0717/995/000000995707.XXX
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值