linux下手机apn没有ppp拨号号过程中APN等参数是如何传入

以前没有调试过RIL的东西, 从零开始, 花了两周时间,终于拨号成功,这里发表出来与大家共享经验,少走弯路.
上一篇文章是一个成功拨号的Android RIL log, 这里主要结合上一篇log进行分析, 分享一些注意事项, 由于时间有限,尽量言简意概, 主要要自己尝试去实践才会有所收获。
(本文所指的log行号,是指上一篇文章所标记的行号)
1. 所要了解的一些源码及脚本文件:
android/hardware/ril/reference_ril/
(reference_ril.c)
android/hardware/ril/rild
android/extern/ppp/pppd
android/extern/ppp/chat
android/data/etc/apn-conf-sdk.xml
android/system/core/rootdir/etc/ppp/init.gprs-pppd
android/system/core/rootdir/etc/ppp/peers/cmnet
android/system/core/rootdir/etc/ppp/chat/cmtc-isp
android/vendor/xxxxx/xxxx/system.prop
reference_ril.c: RIL的一些AT命令操作,通过一些onRequest接口操作,对不同的硬件,需作一些修改调整。
apn-conf-sdk.xml: 以下是一个例子,有些不支持的APN,需要自己加上去,否则在log 中会出现类似:No APN found for carrier: 46xxx, 的错误。一般移动的TD USIM是46007,
有些是46000.
&apns version="6"&
&apn carrier="Android"
apn="internet"
server="*"
password="*"
mmsc="null"
&apn carrier="TelKila"
apn="internet"
server="*"
password="*"
mmsc="null"
&apn carrier="CMCC"
apn="cmnet"
server="*"
password="*"
mmsc="null"
&apn carrier="CHINA MOBILE"
apn="cmnet"
server="*"
password="*"
mmsc="null"
init.gprs-pppd: 调用pppd GPRS拨号的初始化脚本。
/system/bin/setprop "net.gprs.ppp-exit" ""
/system/bin/log -t pppd "Starting pppd"
/system/xbin/pppd call cmnet $*
PPPD_EXIT=$?
PPPD_PID=$!
/system/bin/log -t pppd "pppd exited with $PPPD_EXIT"
/system/bin/setprop "net.gprs.ppp-exit" "$PPPD_EXIT"
cmnet:pppd拨号option脚本:
/dev/ttyACM2
usepeerdns
defaultroute
noipdefault
ipcp-accept-local
ipcp-accept-remote
user cmnet
password cmnet
connect "/system/xbin/chat -v -t 50 -f /system/etc/ppp/chat/cmtc-isp"
cmtc-isp:
ABORT 'BUSY'
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT '+CME ERROR: 100'
AT+CGDCONT=1,"IP","CMNET"
AT+CGEQREQ=1,2,128,384,0,0,0,0,"0E0","0E0",,0,0
ATDT*98*1#
system.prop
rild.libpath=/system/lib/libreference-ril.so
rild.libargs=-d /dev/ttyACM0
2. 所要具备的调试工具:
可在linux下通过发送AT命令调试硬件模块,在较新版本busybox中可以找到此模块。如命令:
#./microcom -t 12000 /dev/ttyACM0
注: -t 12000 为延迟退出ms时间,不宜太长时间,时间太长,会感觉 像死机,时间太短,经常会命令没输完就退出了。
ppp(pppd, chat):可手拨号连接GPRS,如命令:
# pppd call cmnet &
3. 设备文件
1)/dev/ttyACM0, /dev/ttyACM1, /dev/ttyACM2
这是usb transceiver 模拟串口的设备文件,如果是直接串口连接,可能是/dev/ttyS0, /dev/mux0等。
2) #ifconfig ppp0
GPRS连接上后,会出现ppp0的网络接口,用如上命令可以查看ppp0网络接口属性。
4. 常用AT命令,具体可以查《中国移动宽带随e 行客户端软件A T命令接口规范》
AT^SYSCONFIG
AT+CGDCONT
AT+CGEQREQ
5. RIL启动过程分析
如果硬件模块驱动配置成功,在/dev目录下会出现类似于ttyACM0,ttyS0等的设备文件
1-36行: 初始化过程,设备文件由system.prop属性文件决定,
110): [0000]& SCREEN_STATE
这里开始了第一个onRequest,
然后会开始一系列的onRequest:
110): [0000]& SCREEN_STATE
110): [0001]& RADIO_POWER
110): [0002]& BASEBAND_VERSION
110): [0003]& GET_IMEI
110): [0004]& GET_IMEISV
110): [0005]& REQUEST_GET_ACCESS_MODE
110): [0006]& OPERATOR
110): [0007]& GPRS_REGISTRATION_STATE
110): [0008]& REGISTRATION_STATE
110): [0009]& QUERY_NETWORK_SELECTION_MODE
110): [0010]& GET_CURRENT_CALLS
110): [0011]& OPERATOR
110): [0012]& GPRS_REGISTRATION_STATE
110): [0013]& REGISTRATION_STATE
110): [0014]& QUERY_NETWORK_SELECTION_MODE
110): [0015]& OPERATOR
110): [0016]& GPRS_REGISTRATION_STATE
110): [0017]& REGISTRATION_STATE
110): [0018]& QUERY_NETWORK_SELECTION_MODE
110): [0019]& SET_NETWORK_SELECTION_AUTOMATIC
110): [0020]& OPERATOR
110): [0021]& GPRS_REGISTRATION_STATE
110): [0022]& REGISTRATION_STATE
110): [0023]& QUERY_NETWORK_SELECTION_MODE
110): [0024]& getIMSI:RIL_REQUEST_GET_IMSI 11 GET_IMSI
110): [0025]& GET_SIM_STATUS
110): [0026]& QUERY_FACILITY_LOCK
110): [0027]& QUERY_FACILITY_LOCK
110): [0028]& OPERATOR
110): [0029]& GPRS_REGISTRATION_STATE
110): [0030]& REGISTRATION_STATE
110): [0031]& QUERY_NETWORK_SELECTION_MODE
110): [0032]& OPERATOR
110): [0033]& GPRS_REGISTRATION_STATE
110): [0034]& REGISTRATION_STATE
110): [0035]& QUERY_NETWORK_SELECTION_MODE
以上onRequest不一定都是必须的,如果GPRS_REGISTRATION_STATE,REGISTRATION_STATE出现的注册状态为:
AT& +CGREG: 1,1
AT& +CREG: 2,1,"a834","5692"
那么你的恭喜你网络注册成功了,如果出现
AT& +CGREG: 1,0
AT& +CREG: 2,0
那么要查一下为什么注册不成功,检查一下SIM插好没,我发现AT+CFUN=4命令有可能会影响到后来的网络注册。
如果网络没有注册,不会出现以下连接信息
110): [DataConnectionTracker] ***trySetupData due to gprsAttached
如果出现此条信息,那么恭喜你又进了一步,要开始下一步ppp拨号上网了,
通过 #logcat &命令,会看到
140): Starting pppd
如果拨号成功,会出现如下信息:
Serial connection established.
Using interface ppp0
Connect: ppp0 &--& /dev/ttyACM2
Remote message: Login OK
PAP authentication succeeded
IP address 10.77.154.38
remote IP address 192.200.1.21
DNS address 211.136.112.50
secondary DNS address 211.136.20.203
这时候网络连接成功,radio log会出现如下信息,
110): [DataConnectionTracker] setState: CONNECTED
这时候就可以放松一下了,郁闷期已过,剩下的稳定性的问题可以慢慢调试了。
ping 一下www.google.com
#ping www.google.com
PING www.l.google.com (64.233.189.99) 56(84) bytes of data.
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=1 ttl=242 time=196 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=2 ttl=242 time=189 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=3 ttl=242 time=195 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=4 ttl=242 time=199 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=5 ttl=242 time=203 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=6 ttl=242 time=196 ms
64 bytes from hkg01s01-in-f99.1e100.net (64.233.189.99): icmp_seq=7 ttl=242 time=187 ms
#ifconfig ppp0
出现ppp0接口属性。
6. 所遇问题分析总结:
1)No APN found for carrier: 46xxx
改一下apn-conf-sdk.xml文件吧,将所对应的46xxx的APN信息写入即可。
网络注册失败,出现:
+CGREG: 1,0
+CREG: 2,0
我发现有几种情况:
1&没插SIM卡;
2&信号不好(一般3G出现低于100的信号值,说明信号强度太差,无法注册);
3&AT+CFUN=4关机命令,即使后面用了AT+CFUN=1开机,可能因为开机需要时间延迟,造成无法注册,这是我发现的比较诡异的地方,需要咨询一下供应商。
3)pppd call cmnet:
connect script failed!
pppd exited with 8
发现出现这个错误的原因比较复杂,不一定是真正的cmnet与cmtc-isp两个脚本的问题,按我的经验发现,如果connect script failed!错误出现紧跟着Starting pppd, 那应该是
真正的脚本有问题;如果间隔时间较长,那就不应该是脚本的问题了,脚本语法问题程序很快能检查出来,通常这样的可能是通道通信的问题,rild与pppd用的同一个串
口通道,也可能造成这个错误,通常都会有2-3个通道,换成另一个tty通道就可以了,我想了如下一个办法来调试这个错误:
1&删除文件/etc/init.gprs-pppd,重启后,系统不会用pppd自动拨号;
2&手动拨号, 运行如下命令:
#pppd call cmnet &
第一次运行会出现错误:
Removed stale lock on ttyACM2 (pid 259)
Failed to open /dev/ttyACM2: I/O error
再运行一次:
Serial connection established.
Using interface ppp0
Connect: ppp0 &--& /dev/ttyACM2
Remote message: Login OK
PAP authentication succeeded
IP address 10.77.48.209
remote IP address 192.200.1.21
DNS address 211.136.112.50
secondary DNS address 211.136.20.203
目前还不知道为什么这样,正在查,有高手可以指点一下。
另外出现这个问题可能还有其它原因,按出现的时间来看,我认为是比较好的一个排查问题的方法。
附:与xxxx聊天解决问题记录,以供大家参考,可能会有点用(注意,时间要从下往上看呀)
在 日 下午4:43,xxxx写道:
另外,还有一些问题:
我现在这种上网是跟android完全没有关系的。还没有跟上层完成数据传输。
要完成跟上层的数据传输,就必需要实现要正确的返回我刚才问你的那个问题“GET_IMEI”, "GET_IMSI",
因为这两个返回了,android才能完成与apns-conf.xml文件中的numeric值的匹配。
麻烦指点下,我上面这个理解对不对。还有你现在的apns-conf.xml中主数据可以写入telephony.db数据库吗?
在 日 下午4:39,xxxx写道:
方便就留个联系方式,改天请你吃个便饭。交个朋友。
在 日 下午4:29,xxxx写道:
恩。这个必需的。。。
你也在深圳吧?
在 日 下午4:29,xxxx写道:
# ping 220.181.112.76
PING 220.181.112.76 (220.181.112.76) 56(84) bytes of data.
64 bytes from 220.181.112.76: icmp_seq=1 ttl=50 time=2646 ms
64 bytes from 220.181.112.76: icmp_seq=2 ttl=50 time=1659 ms
64 bytes from 220.181.112.76: icmp_seq=3 ttl=49 time=679 ms
64 bytes from 220.181.112.76: icmp_seq=5 ttl=49 time=185 ms
64 bytes from 220.181.112.76: icmp_seq=6 ttl=50 time=181 ms
64 bytes from 220.181.112.76: icmp_seq=7 ttl=49 time=198 ms
64 bytes from 220.181.112.76: icmp_seq=8 ttl=49 time=185 ms
64 bytes from 220.181.112.76: icmp_seq=9 ttl=50 time=202 ms
原来什么都不用设置就可以拨号成功了?和linux下面的是一样的,只是这么弄好像上层根本响应不到。
在 日 下午4:26,xxxx写道:
( 2319): Connect: ppp0 &--& /dev/ttyUSB5
( 2319): sent [LCP ConfReq id=0x1 &asyncmap 0x0& &magic 0x7b8e6e14& &pcomp& &accomp&]
( 2319): rcvd [LCP ConfReq id=0x0 &mru 1500& &asyncmap 0xffffffff& &auth pap& &magic 0x& &pcomp& &accomp&]
( 2319): No auth is possible
( 2319): sent [LCP ConfRej id=0x0 &auth pap&]
( 2319): rcvd [LCP ConfAck id=0x1 &asyncmap 0x0& &magic 0x7b8e6e14& &pcomp& &accomp&]
( 2319): rcvd [LCP ConfReq id=0x1 &mru 1500& &asyncmap 0xffffffff& &magic 0x& &pcomp& &accomp&]
( 2319): sent [LCP ConfAck id=0x1 &mru 1500& &asyncmap 0xffffffff& &magic 0x& &pcomp& &accomp&]
( 2319): sent [CCP ConfReq id=0x1 &deflate 15& &deflate(old#) 15& &bsd v1 15&]
( 2319): sent [IPCP ConfReq id=0x1 &compress VJ 0f 01& &addr 0.0.0.0& &ms-dns1 0.0.0.0& &ms-dns3 0.0.0.0&]
( 2319): rcvd [LCP ProtRej id=0x2 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
( 2319): sent [IPCP ConfReq id=0x1 &compress VJ 0f 01& &addr 0.0.0.0& &ms-dns1 0.0.0.0& &ms-dns3 0.0.0.0&]
( 2319): rcvd [IPCP ConfReq id=0x3 &addr 192.168.0.1&]
( 2319): sent [IPCP ConfAck id=0x3 &addr 192.168.0.1&]
( 2319): rcvd [IPCP ConfRej id=0x1 &compress VJ 0f 01&]
( 2319): sent [IPCP ConfReq id=0x2 &addr 0.0.0.0& &ms-dns1 0.0.0.0& &ms-dns3 0.0.0.0&]
( 2319): rcvd [IPCP ConfNak id=0x2 &addr 10.233.0.103& &ms-dns1 120.196.165.7& &ms-dns3 221.179.38.7&]
( 2319): sent [IPCP ConfReq id=0x3 &addr 10.233.0.103& &ms-dns1 120.196.165.7& &ms-dns3 221.179.38.7&]
( 2319): rcvd [IPCP ConfAck id=0x3 &addr 10.233.0.103& &ms-dns1 120.196.165.7& &ms-dns3 221.179.38.7&]
( 2319): local
IP address 10.233.0.103
( 2319): remote IP address 192.168.0.1
( 2319): primary
DNS address 120.196.165.7
( 2319): secondary DNS address 221.179.38.7
兄弟,看起来是不是已经成功了啊。
在 日 下午4:11,xxxx写道:
我是在深圳的,你呢?
已经开始拨号了,注意以下几个设置:
1. tty端口设置,一般会有3个虚拟端口,各有用处,咨询模块厂商;
:恩。我们这个是TD模块,有5个端口,实际只用了3个,你说的BUSY这种情况应该是对的,因为我现在AT是用的ttyUSB5,刚才我的拨号脚本也是用的ttyUSB5。我觉得应该是这个问题吧。
2. 拨号脚本配置,咨询模块厂商;
:这个脚本应该不是问题,因为我在linux下面已经可以拨号上网了。用这两个脚本。
在 日 下午4:05,wenfeng cao &ccc.&写道:
已经开始拨号了,注意以下几个设置:
1. tty端口设置,一般会有3个虚拟端口,各有用处,咨询模块厂商;
2. 拨号脚本配置,咨询模块厂商;
在 日 下午4:01,xxxx写道:
我现在改的/etc/apns-conf.xml中已经有了中国移动的,但是/data/data//data/data/com.android.providers.telephony/databases/telephony.db中没有生成对应的记录。
然后按你说的直接拨号,提示下面的错误。。
( 2261): Starting pppd
( 2265): chat_send (BUSY)
( 2265): abort on (BUSY)
( 2265): chat_send (NO CARRIER)
( 2265): abort on (NO CARRIER)
( 2265): chat_send (ERROR)
( 2265): abort on (ERROR)
( 2265): chat_send (AT+CGDCONT=1,"IP","cmnet")
( 2265): send (AT+CGDCONT=1,"IP","cmnet"^M)
( 2265): expect (OK)
( 2265): alarm
( 2265): Failed
( 2263): Connect script failed
( 2274): pppd exited with 8
在 日 下午3:38,wenfeng cao &ccc.&写道:
framework, java层调用过来的, 直接把中移动的加进去试试吧。
在 日 下午3:35,xxxx写道:
你的意思是我直接改/development/data/etc/apns-conf_sdk.xml这个文件是吧?
能否指点下,这个文件最后生成的文件系统的目录下的/system/etc/apns-conf.xml文件,跟拨号上网的关系在代码中体现在哪里啊?
也就是说我用PPPD拨号的时候,哪里调用到了这个apns-conf.xml文件中的信息了。
在 日 下午3:27,wenfeng cao &ccc.&写道:
直接找到那个配置xml文件吧,APN写数据库不一定好使,应该要修改framework!
在 日 下午3:25,xxxx写道:
如果这个问题不解决,在 ”设置/无线和网络设置/移动网络设置/接入点名称“ 设置里面显示不出来我设置的APN
另外,我是参考这篇文章设置的APN,但是写入数据库没有成功。很奇怪。
http://myqdroid.blog.51cto.com/134
在 日 下午2:31,wenfeng cao &ccc.&写道:
( 2034): AT& +CGREG: 1,1
( 2034): AT& OK
( 2034): AT& +CREG: 2,1,"a563","c46b"
( 2034): AT& OK
感觉网络注册成功了,你这个应该不算什么致命错误,
试着配置APN,拨号看看,
你的APN还没有配置,直接在xml文件里里配置一下吧,
在 日 下午2:19,xxxx写道:
卡肯定是插了,只是SIM卡检测好像是有点问题。因为我安装了一个Hidroid的设置APN的工具,它提示“无法检测到SIM卡”,但是我的SIM ready已经打印出来了。
我给你发了一个日志文件,logcat -b radio
在 日 下午1:12,wenfeng cao &ccc.&写道:
参看我博客这段log吧,不会是没插入SIM吧,感觉IMEI你已经读到了呀
56): onRequest: GET_IMEI
56): AT& AT+CGSN
110): Notifying: Radio On
110): [UNSL]& UNSOL_RESPONSE_RADIO_STATE_CHANGED SIM_NOT_READY
110): [UNSL]& UNSOL_RESPONSE_NETWORK_STATE_CHANGED
110): [UNSL]& RIL_UNSOL_ACCESS_MODE_CHANGED {2}
110): Notifying: SIM ready
110): [UNSL]& UNSOL_RESPONSE_RADIO_STATE_CHANGED SIM_READY
在 日 下午1:07,wenfeng cao &ccc.&写道:
那是这条AT命令错误了,用microcom串口工具调一下吧,看看AT命令有没有语法问题。
在 日 上午10:15,xxxx写道:
Hi wenfeng,
那个问题我刚看了一下,错误是在下面这里返回的:
@reference-ril.c
case RIL_REQUEST_GET_IMEI:
p_response = NULL;
err = at_send_command_numeric("AT+CGSN", &p_response);
// 因为这里返回的err = -6 所以在这里就报错了
if (err & 0 || p_response-&success == 0) {
RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
RIL_onRequestComplete(t, RIL_E_SUCCESS,
p_response-&p_intermediates-&line, sizeof(char *));
at_response_free(p_response);
目前还不太清楚具体原因是什么。。
在 日 下午2:43,wenfeng cao &ccc.&写道:
那得到com.android.internal.telephony中跟踪一下java代码,打印一下LOG,
看一下在哪里出现异常了。
在 日 上午11:24,xxxx写道:
非常感谢,这么快回复我,我已经测试过了,没有问题,你看下面的LOG也已经打出来了,AT返回是正确的。只是好像上层没有收到这个数据。。
在 日 上午10:49,wenfeng cao &ccc.&写道:
用microcom串口调试工具对AT命令测试一下吧
在 日 上午10:06,xxxx写道:
Hi, wenfeng:
我现在在获取IMEI和IMSI的时候遇到一点问题,想请教一下:
现在的问题上层RILJ发送请求。RILD已经收到,也正确返回,但是RILJ处理响应时出现异常,LOG如下:
1. GET_IMEI出错:
( 2108): [0004]& GET_IMEI
( 2032): onRequest: GET_IMEI
( 2032): AT& AT+CGSN
( 2032): AT& +CGSN: 647
( 2032): AT& OK
( 2108): [0004]& GET_IMEI error: com.android.internal.telephony.CommandException: GENERIC_FAILURE
2. GET_IMSI出错:
( 2108): [0020]& getIMSI:RIL_REQUEST_GET_IMSI 11 GET_IMSI
( 2032): onRequest: GET_IMSI
( 2032): AT& AT+CIMI
( 2032): AT& +CIMI: 323
( 2032): AT& OK
com.android.internal.telephony.CommandException: GENERIC_FAILURE
看起来这两个问题比较类似。
RIL层代码分析--拨号整个流程
拨出电话流程:
1 在系统源码这个路径下/packages/apps/Phone/src/com/android/phone/Dialta...
Android RIL 调试分析全记录 No APN found for carrier
Android RIL 调试分析全记录以前没有调试过RIL的东西, 从零开始, 花了两周时间,终于拨号成功,这里发表出来与大家共享经验,少走弯路.上一篇文章是一个成功拨号的Android RIL lo...
RIL 调试log
# logcat -b radio &
56): Opening tty device /dev/ttyS2
Android RIL log全记录
# logcat -b radio & 行数
56): Opening tty device /dev/ttyS22
android RIL 调试5
试着配置APN,拨号看看,
你的APN还没有配置,直接在xml文件里里配置一下吧,
在 日 下午2:19,xxxx写道:
卡肯定是插了,只是SIM卡检测好像是有点问题。因为我...
Step 1:注册监听事件
GsmServiceStateTracker(CdmaServiceStateTracker) 在构造函数就会通过registerForVoiceNetworkState...
2. 所要具备的调试工具:
可在linux下通过发送AT命令调试硬件模块,在较新版本busybox中可以找到此模块。如命令:
#./microcom -t 12000 /de...
SelectionMode=cellSelectionByRow 只能选择行也可以选择整表,不能选择列,但是不能自由选择SelectionMode=cellSelectionFree 自由选择,可以选...
以前没有调试过RIL的东西, 从零开始, 花了两周时间,终于拨号成功,这里发表出来与大家共享经验,少走弯路.
上一篇文章是一个成功拨号的Android RIL log, 这里主要结合上一篇l...
没有更多推荐了,pppd 拨号脚本设置
浅析linux下脚本拨号上网
既然是拨号上网,就不能不提到ppp(point-to-point protocol)协议.ppp协议提供了一种通过串行点对点联接传输数据报的方式.它由三部份组成:一种在串行封装数据报的方式,扩展联接控制协议 LCP,和用来建立和配置不同网络层协议的家族网络控制协议NCP.封装方案由内核驱动代码来提供.pppd(ppp daemon)提供基本的LCP,认证支持,和建立和配置IP的网络控制协议NCP.一个ppp会话分为四个步骤:连接建立、连接质量控制、网络层协议配 置、连接终止;提供了密码认证协议(PAP)或者邀请握手认证协议(CHAP)来保证连接安全.使用PPP你可以把你的
Linux PC连接到一台ppp服务器上并存取该服务器所连接的网络资源就如同你是直接连接在该网络上一般。你也可以把你的Linux PC设为一台ppp服务器,这样一来其它电脑就可以拨入你的电脑并且存取在你区域网络里的资源。
 当然,对于我们最终用户来讲,它是一个server/client模型的应用。本文主要讨论客户端怎样拨号上网,毕竟对于桌面系统的用 户,ppp是日常生活的一个重要组成部分。在这里我想大家可能对windows下的拨号适配器的简单易用深表"敬佩",在这里我不想对其进行具体讨论,公 司提供的TAPI可以让每一个windows下的程序员编写一个拨号程序不是一件困难的事,而在linux下呢?无论是gnome下的wvdial还是
kde下的kppp,他们与纯脚本ppp-on相比不过是更直接,更易操作,称他们为图形化的拨号脚本并不为过,因为他们最终都是调用pppd这个功能强 大大却不好驾驭的程序。有人告诉我kppp与windows下的拨号适配器功能差不多,不过我要告诉你kppp对pppd程序的依赖程度大过kppp作为 一个独立的拨号程序,甚至/etc/ppp/options下的选项值对kppp的影响也是不可忽视的。
关于linux下脚本拨号的过程:(其实可适用于linux下所有的拨号过程,当然实际过程没有这么简单,如果有兴趣,请阅读源码)
1.由pppd程序调用chat会话程序
2.chat会话程序负责拨号,启动服务器端的pppd程序,验证身份,然后chat会话程序结束
3.由pppd程序继续chat会话程序的工作,与服务器端的pppd程序进行握手,建立ppp连接
ppp-on脚本包含有pppd程序,而ppp-on-dialer脚本含有chat会话程序,如果说pppd程序完成 的是连接建立、连接质量控制、网络层协议配置、连接终止,那么chat程序完成的是明文(textword)的验证,如果是拨入的服务器端需要密码认证协 议(PAP)或者邀请握手认证协议(CHAP)来保证连接安全,那么还须在/etc/ppp目录下配置pap-secrets或chap-secrets 文件。
关于ppp-on,ppp-on-dialer纯脚本拨号的配置
一个完整的ppp-on文件如下:(这里的实例及ppp-on-dialer文件均以163直通车为例) TELEPHONE=163 # ISP提供的上网电话号码
ACCOUNT=163 # 账号名称
PASSWORD=163 # 登录密码
LOCAL_IP=0.0.0.0 # 本地IP地址,0.0.0.0表示由ISP动态分配
REMOTE_IP=0.0.0.0 # 远端IP地址,一般为0.0.0.0
NETMASK=255.255.255.0 # 子网掩码
export TELEPHONE ACCOUNT PASSWORD \
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer \
exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115***\
asyncmap 0 kdebug 4 \
$LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute \
connect $DIALER_SCRIPT&
这个文件需要注意的地方:
a.注意"\"表示一行完整的结束。
b.尽量把kdebug的级别设置高一些,因为根据kdebug的级别来确定文件/var/log/messages的详细程度。
一个完整的ppp-on-dialer文件如下: exec chat -v \
TIMEOUT 3 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r' \
ABORT '\nUsername/Password Incorrect\r'\ 此行可缩短由于账号密码不正确的验证时间
'OK-+++\c-OK' ATH0 \
TIMEOUT 30 \
OK ATDT163 \
sername:--sername: 163 \
assword: 163 \
大家说以上配置对吗?文件配置是对的,但是问题不少。我还是以实际问题来做具体分析吧(前提:无论外猫内猫均已装好,检查命令:echo "echo ATDT 163"&/dev/modem),在/etc/ppp目录下键入了./ppp-on命令后,出现如下错误:
1.TR的亮,无拨号音。
解决办法:
首先检查ppp-on-dialer文件的权限,设为chmod 7 ppp-on-dialer
然后查看ppp-on-dialer文件,每行后面的 "\"是否存在
最后查看倒数第三行ok ATDT$TELEPHONE的电话号码是否设置正确,注意这里需设为实际电话号码,不是变量
2.在/var/log/messages文件中出现如下提示:
21:13:32 ken pppd[657]: CCP terminated by peer
21:13:32 ken pppd[657]: Compression disabled by peer.
或直接出现connect scripts fail提示(反复N次均为如下提示)
注意:在ppp-on-dialer文件的chat -v表示通过syslogd将客户端与服务器端建立连结的会话信息写入了/var/log/messages文件,如果你要查看这个会话信息,请键入 tail -f /var/log/messages或者tailf /var/log/messages,这些信息对于正确配置拨号脚本文件很有用.
解决办法:
首先检查账号密码是否正确
然后就可能是chat会话程序本身的问题,大家看一下面一个例子:
成都天府热线163在minicom下的提示:
***********************************************
*Quidway A8010 Internet Server
*welcome!!
***********************************************
please input username:
please input password:
成都天府热线169在minicom下的提示:
*** Welcome To TianFu Online EeYing01-11 ! ***
大家可能注意到有什么不同了吧!也就是不同拨号服务器对于账号密码输入提示的不同,用过windows拨号终端的朋友可能会知道,那么windows拨号 为什么没有这个问题,因为这是chat程序本身的问题:不能根据拨号服务器对于账号密码的提示不同而send账号和密码,解决办法:用minicom去得 到正确的提示,根具提示修改ppp-on-dialer文件最后两行的配置,这里以成都天府热线163,169在minicom下的提示为例:
sername:--sername: 163 \
assword: 163 \
ogin:--ogin: liujien \
assword: liujien \
这样就完了吗,没有,这里的配置还要根据你的isp的要求(hint),用minicom N次去得到正确的提示,不过你还要冒着你的isp修改账号密码提示的风险,所以我劝你放弃chat会话程序吧。因为kppp,wvdial都不存在这个问 题.chat会话程序是force,而wvdial,kppp却是guess.带着这个问题我读了ppp-2.4.1源码的说明文件,其实作者已在 ppp-2.3.11版就已提供了PLUGINS PASSPROMPT(注:ppp-2.3.10版已提供插件支持,大家用redhat6.2自带了ppp-2.3.11的RPM包,至于插件一般的国内
的LINUX网站上提供的ppp源码包都附带有),这个插件提供给第三方程序将账号密码发送给你的isp的调用功能。相关内容的英文如下:
A new `passprompt' plugin is included, thanks to Alan Curry, which makes it possible for pppd to call an external program to get the PAP password to send to the peer.
那么到底如何使用这个plugin呢?在包含pppd.h头文件的目录下编译passprompt.c文件 gcc -c -O passprompt.c
gcc -shared -o passprompt.o
大家就可得到一个passprompt.so的共享链接文件,将之拷贝到/etc/ppp/plugins目录下,修改/etc/ppp/options 文件,加入一行plugin /etc/ppp/plugins/passprompt.so,然后你就可修改ppp-on文件的将DIALER_SCRIPT指向你所要指定的脚本文 件,可自编程序或者在网上去下载一个第三方程序。
我给大家提供了一个简单方法,大家可安装wvdial拨号程序,然后在gnome下将/etc/wvdial.conf文件配置好,在/etc/ppp目 录下新建一个脚本,命名为wvdial,内容如下wvdial 163 (163是你所要拨号的电话号码),然后chmod 7 wvdial,修改ppp-on文件,如:DIALER_SCRIPT=/etc/ppp/wvdial \
3.客户端已得到一个ip地址(用ifconfig 命令即可看到),通过域名无法浏览网页,通过ip地址可以。
解决办法:
一般的办法:去查isp给你提供的手册,得到域名服务器的ip地址,修改/etc/resolv.conf文件如下:nameserver 61.139.2.69(我以成都163为例),还可以在windows下用ipconfig /all命令也能得到dns服务器地址,因为windows的拨号程序默认设置为:自动获得dns服务器地址。
软件作者给我们提供的办法:
what was new in ppp-2.3.6.
**************************
Added new option `usepeerdns', thanks to Nick Walker . If the peer supplies DNS addresses, these will be written to /etc/ppp/resolv.conf. The ip-up script can then be used to add these addresses to /etc/resolv.conf if desired (see the ip-up.local.add and ip-down.local.add
files in the scripts directory).
软件作者在ppp-2.3.6版即提供了类似于windows 拨号程序的选项:usepeerdns,如果你的isp提供dns服务器地址,将在/etc/ppp/resolv.conf文件及/etc /resolv.conf文件中写入主要域名服务器地址和辅助域名服务器地址,如下: nameserver 61.139.2.69
nameserver 202.103.4.5
如何设置:修改/etc/ppp/options文件,添加一行"usepeerdns" (这行的意思是使用pppoe的dns,如果不想使用pppoe的dns,可以用#注释掉)
在这里笔者抛砖引玉,对linux脚本拨号上网并没有作太多深入的探讨,只是就围绕几个常见的问题进行了分析并提供了比较简单的解决办法.希望大家能够多 读一些软件作者给我们提供的英文说明文件,因为国内的有些资料太过陈旧,不要没有耐心去读man pages,他们很有用,不过去读一读某些网站的文章是一个不错的选择。如果大家对我的文章有不同的看法,请给我写信,不吝赐教,谢谢.
Linux下pppd拨号脚本配置
本文主要介绍了嵌入式Linux系统下使用pppd 2.4.4来进行PPP拨号需要使用的脚本是如何配置的,配置项的含义,同时也说明了如何来配置参数,实现ppp拨号上网。
一.问题提出
Linux系统下使用pppd拨号上网
1.首先拷贝pppd和chat到/usr/sbin目录;
2.然后编写三个脚本,option脚本要注意的是串口设备名称,不要复制网上的脚本,一定要看芯片手册写的modem口的名称,connect脚本要...
pppd拨号脚本配置
pppd拨号脚本配置
ppp拨号脚本配置
本文主要介绍了嵌入式Linux系统下使用pppd 2.4.4来进行PPP拨号需要使用的脚本是如何配置的,配置项的含义,同时也说...
pppd错误码
在linux系统下做无线模块拨号上网需要使用PPPD进行拨号,PPPD错误退出是将返回退出错误码,此错误码将有利于我们对PPPD退出查明原因:
0 pppd已经...
修改pppd,提高openwrt中pppoe多拨成功率
原文链接: http://www.morfast.net/blog/linux/pppoe-multilink/,转载请注明出处,谢谢!
先上一张最终效果图吊吊大家胃口:
是的,这张是普通...
openwrt pppd源码bug修复(系统时间变化对pppd的影响)
openwrt 版本:15.05
以前就用过pppd,不过是arm架构的linux,而且当时的开发板都带有实时时钟,没有发现过系统时间变化对pppd拨号的影响。
现在在openwrt上进行...
linux环境下pppd gprs拨号上网总结
我们的gprs拨号上网已经做好了,当初做这个东西的时候对面这方面的东西一点也不懂,好在网上很多前辈有自己的经验介绍,少走了不少冤枉路。现在我也把自己GPRS拨号上网的东西总结下,如有错误请...
没有更多推荐了,

我要回帖

更多关于 linuxppp协议实现 的文章

 

随机推荐