在嵌入式Linux下GPEscortS上网方案,GPENVISIONS模块在Linux平台上ppp拨号上香港网球总会结与体会

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

让Linux内核支持PPP

  1. 安装wvdial

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中的信息。 

进入Linux内核目录,执行#make menuconfig

sudo apt-get install wvdial

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

Network Device Support à

  1. 在/etc/wvdial.conf中写入wvdial的配置信息: femacs /etc/wvdial.conf

我使用就是该方式,下面列出ppp拨号相关配置文件并作适当的解释;
注意:我使用的gprs模块是HUAWEI
GTM900A/B两种,不同的模块的内部设置有差异,所以配置文件中的某些参数配置有差异,另外还有自身的pc机或者arm开发板的环境以及所处的地点的信号,移动ISP都有关,在出现问题的时候要考虑这些潜在的可能因素。错误排查的过程是个枯燥难受的过程,但是反过来去看,这个过程之后会收获很多。

<*> PPP (point-to-point protocol) support

Init1 = ATZ

默认情况在/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。注意,为什么不能确切地给出解决的方式,原因是打印出来的同一个错误信息,我称之为现象,同一现象可能是由很多种原因造成的,需要自己实地排查。)

[*] PPP multilink support

Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

#/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

<*> PPP support for async serial ports

Init3 = AT+CGDCONT=1,”IP”,”CMNET”  ##important! 否则无法使用DNS

网赌十大信誉的平台 1

<*> PPP support for sync tty ports

Modem Type = Analog Modem

<*> SLIP (serial line) support

Baud = 115200  ##根据你的gprs modem来设定

[*] CSLIP compressed headers

New PPPD = yes

ppp套件安装

Modem = /dev/ttyS0 ##你所连接的串口

Ø 下载ppp: ×最新版本为2.4.4

ISDN = 0

Ø 将ppp-2.4.4.tar.gz解压至目录

Phone = *99***1#  ##中国移动的拨号号码

×这里默认ppp源码目录为$(PPP)

Password = ***    ##其实没什么用

#tar zxvf ppp-2.4.4.tar.gz

Username = itlanger

Ø 然后交叉编译ppp:

这一步,可以首先运行wvdial,这时会出现找不到modem,然后修改/etc/wvdial.conf,
增加

#cd $(PPP)

Baud = 115200  ##根据你的gprs modem来设定

#./configure

Modem = /dev/ttyS0 ##你所连接的串口

#make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc ×这里指定交叉编译器

然后再次运行wvdial, 再手动加入一下内容到/etc/wvdial.conf:

Ø 将ppp套件安装至嵌入式系统中:

Init3 = AT+CGDCONT=1,”IP”,”CMNET”

×这里默认可执行文件在嵌入式系统下的目录为$(EMB_BIN)

Phone = *99***1#  ##中国移动的拨号号码

#cp $(PPP)/chat/chat $(EMB_BIN)

Password = ***    ##其实没什么用

#cp $(PPP)/pppd/pppd $(EMB_BIN)

Username = itlanger

#cp $(PPP)/pppdump/pppdump $(EMB_BIN)

这里Init3 = AT+CGDCONT=1,”IP”,”CMNET” 一定要加,否则wvdial拨号时会出现:

#cp $(PPP)/pppstats/pppstats $(EMB_BIN)

warning, can’t find address for `www.suse.de`

×这里默认嵌入式系统的etc目录为$(EMB_ETC)

–> warning, address lookup does not work

#mkdir $(EMB_ETC)/ppp

–> Nameserver (DNS) failure, the connection may not work.

#cp $(PPP)/etc.ppp/* $(EMB_ETC)/ppp

导致只能ping通IP,不能ping通域名

ppp套件配置

  1. 配置ppp参数: femacs /etc/ppp/options

$(EMB_BIN)/dial-on.sh (GPRS启动脚本)

noipdefault

#!/bin/sh

ipcp-accept-local

#define dial_on function

ipcp-accept-remote

dial_on()

defaultroute

{

noauth

#test if pppd is running

crtscts

pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

debug

if [ $pppd_stat -gt 0 ]

4.拨号上网: sudo wvdial

then

–> WvDial: Internet dialer version 1.60

echo “ppp connection’s already started.”

–> Initializing modem.

else

–> Sending: ATZ

#close ethernet interface

ATZ

ifconfig eth0 down

OK

#ppp start

–> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

pppd modem /dev/ttyS1 57600 nocrtscts lock connect “chat -v -f
/etc/ppp/gprs-connect” user “” noauth debug defaultroute

ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

# pppd配置说明:

OK

# ttyS1:连接GPRS模块SIM300的串口

–> Sending: AT+CGDCONT=1,”IP”,”CMNET”

# 57600:GPRS的拨号速率

AT+CGDCONT=1,”IP”,”CMNET”

# nocrtscts:无流控

OK

# lock:锁定设备

–> Modem initialized.

# connect “chat –v –f /etc/ppp/gprs-connect”:GPRS连接脚本文件

–> Sending: ATDT*99***网赌十大信誉的平台,1#

# user “”:用户名,这里是无

–> Waiting for carrier.

# noauth:无需认证

ATDT*99***1#

# debug:输出调试信息

CONNECT

# defaultroute:此拨号连接作为默认路由

~[7f]}#@!}!}#} }9}”}&} }*} } }’}”}(}”}%}&K_{}$}#}%B#}%<e~

echo “ppp is starting…”

–> Carrier detected.  Waiting for prompt.

fi

~[7f]}#@!}!}#} }9}”}&} }*} } }’}”}(}”}%}&K_{}$}#}%B#}%<e~

}

–> PPP negotiation detected.

#dial on gprs

–> Starting pppd at Tue Dec 15 11:19:14 2009

dial_on

–> Pid of pppd: 6666

#wait for ppp’s init

–> Using interface ppp0

sleep 5

–> Authentication (CHAP) started

pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

–> Authentication (CHAP) successful

if [ $pppd_stat -eq 0 ]

–> local  IP address 10.24.229.233

then

–> remote IP address 192.168.254.254

echo “trying 2nd time to call ppp”

–> primary   DNS address 211.137.160.5

dial_on

–> secondary DNS address 211.136.17.107

sleep 5

–> Script /etc/ppp/ip-up run successful

fi

–> Default route Ok.

pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`

–> Nameserver (DNS) Ok.

if [ $pppd_stat -eq 0 ]

–> Connected… Press Ctrl-C to disconnect

then

  1. 断开以太网连接:

echo “pppd error!”

sudo ifconfig eth0 down

echo “please check pppd’s config files”

sudo route add default gw 10.24.229.233 ##这里是ppp0的IP

fi

  1. 测试网络:

#open ethernet interface

ping 60.28.166.84

ifconfig eth0 up

ping www.chinaunix.net

#end

如果ping不通域名,可以cat /etc/resolv.conf

$(EMB_BIN)/dial-off.sh (关闭GPRS连接脚本)

然后写入拨号获得的DNS
 

#!/bin/sh

. 安装wvdial sudo apt-get install wvdial 2.
在/etc/wvdial.conf中写入wvdial的配置信息: femacs /etc/wvdial.conf Init1
= ATZ Init2 = ATQ0 V1 E1 S0=0 C1 D2 +FCLASS=0 Init3…

#get pppd’s pid

pid=`pidof pppd`

#if pppd process is running

if [ -n $pid ]

then

#kill pppd

kill $pid

#open the ethernet interface

ifconfig eth0 up

echo “ppp connection is closed.”

else

echo “ppp connection isn’t existed.”

fi

#end

$(EMB_ETC)/ppp/gprs-connect (GPRS连接配置文件)

#GPRS连接超时设置

TIMEOUT 60

#若MODEM遇到BUSY、ERROR、NO CARRIER等信息时,停止拨号

ABORT “BUSY”

ABORT “ERROR”

ABORT “NO CARRIER”

#外送“AT”指令

” AT

#当得到“OK”回应时,外送AT+CGDCONT=1,”IP”,”CMNET”命令

“OK” “AT+CGDCONT=1,\042IP\042,\042CMNET\042”

#当得到“OK”回应时,外送ATDT*99***1#命令

“OK” “ATDT*99***1#”

#当得到“CONNECT”回应时,拨号结束,程序退出

“CONNECT”

$(EMB_ETC)/ppp/pap-secrets (GPRS认证配置文件)

# Secrets for authentication using PAP

# client server secret IP addresses

” * ” *

说明

(1)
还需要在$(EMB_ETC)/ppp目录下创建指向$(EMB_ETC)/resolv.conf的链接,用于指定PPP连接的DNS。

(2)
在ppp连接时,需要关闭eth连接。在脚本中已经设置好了,首先关闭eth连接,然后进行ppp连接,在ppp连接完成时,再开启eth连接。

(3)
最好在系统中开启syslogd进程,这样在/var/log/messages文件中会记录GPRS进行拨号的DEBUG信息,便于调试。

(4) 运行拨号脚本后,可以使用#ifconfig查看PPP连接信息。

本文来自CSDN博客,转载请标明出处:

进入Linux内核目录,执行#make
menuconfig Network Device Support * PPP (point-to-point protocol)
support [*] PPP multilink support * PPP support for…

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注