接上一节未完的嵌入式车载平台的GPRS网络实现(转)
前面以为GPRS模块直接执行AT指令就可以联网,好像不对,看了下面的知道还缺少PPP协议,那么PPP协议一般是ADSL在拨号的时候用的(PPPOE),怎么和串口通信挂钩的呢?
来自:http://network.51cto.com/art/201009/224135.htm
前面的内容,我们都讲解了PPP协议的一些基本应用,以及一些相关的配置。那么这里我们就主要讲解一下实现Linux下pppd通过GPRS拨号上网的过程。昨天把开发板的bootloader删了,没办法,只得在PC上调GPRS拨号了.先在windows下拨号成功,然后用工具看拨号时具体使用了哪些AT命令,再使用这些命令到linux下使用pppd来拨号,最后终于成功了,之前开发板上不能成功拨号极有可就是AT指令有问题,现在只有等开发板回来后再到ARM7上调了.
下面贴一下拨号使用的几个脚本,GPRS模块是使用的华为的GTM900-B:
1, /etc/ppp/peers/gprs: 复制内容到剪贴板
代码:
- #/etc/ppp/peers/gprs
- # This is pppd script for China Mobile, used Huawei GTM900-B GPRS Module
- # Usage: root>pppd call gprs
- /dev/ttyS0 与串口0相关联
- 19200
- crtscts
- modem
- #noauth
- debug
- nodetach
- #hide-password
- usepeerdns
- noipdefault
- defaultroute
- user "cmnet"
- 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 '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
- #connect '/bin/chat -v -s -f /etc/ppp/gprs-connect-chat'
- #disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'2
gprs-connect-chat: 复制内容到剪贴板
代码:
- #/etc/ppp/gprs-connect-chat
- # chat script for China Mobile, used HuaWei GTM900-B GPRS module.
- TIMEOUT 15
- ABORT "DELAYED"
- ABORT "BUSY"
- ABORT "ERROR"
- ABORT "NO DIALTONE"
- ABORT "NO CARRIER"
- TIMEOUT 40
- '' \rAT
- OK ATS0=0
- OK ATE0V1
- OK AT+CGDCONT=1,"IP","CMNET"
- OK ATDT*99***1#
- CONNECT ''3
用于chap认证的密码文件:chap-secrets,由于移动的GPRS服务不需要用户名和密码,所以刚开始没设用户名和密码,结果在chap认证的时候总不能通过.后来在gprs里添加user "cmnet"和这个密码文件后就OK了. 复制内容到剪贴板
代码:
- #/etc/ppp/chap-secrets
- #client server secret IP address
- "cmnet" * "cmnet" * 4
- 另外还有个可选的,断开连接的脚本如下: 复制内容到剪贴板
代码:
- ABORT OK
- ABORT BUSY
- ABORT DELAYED
- ABORT "NO ANSWER"
- ABORT "NO CARRIER"
- ABORT "NO DIALTONE"
- ABORT VOICE
- ABORT ERROR
- ABORT RINGING
- TIMEOUT 12
- "" \\k\\k\\k\\d+++ATH
- "使用: 将PC上的DNS删掉后运行如下:
- [root@localhost ppp]# pppd call gprs
- timeout set to 15 seconds
- abort on (DELAYED)
- abort on (BUSY)
- abort on (ERROR)
- abort on (NO DIALTONE)
- abort on (NO CARRIER)
- timeout set to 40 seconds
- send (^MAT^M)
- expect (OK)
- ^M^M
- OK
- -- got it
- send (ATS0=0^M)
- expect (OK)
- ^M
- AT^M
- OK
- -- got it
- send (ATE0V1^M)
- expect (OK)
- ^M
- ATS0=0^M^M
- OK
- -- got it
- send (AT+CGDCONT=1,"IP","CMNET"^M)
- expect (OK)
- ^M
- ATE0V1^M^M
- OK
- -- got it
- send (ATDT*99***1#^M)
- expect (CONNECT)
- ^M
- ^M
- OK^M
- ^M
- CONNECT
- -- got it
- send (^M)
- Serial connection established.
- using channel 42
- Using interface ppp0
- Connect: ppp0 <--> /dev/ttyS0
- sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x8c5e3d45> <pcomp> <accomp>]
- rcvd [LCP ConfRej id=0x1 <magic 0x8c5e3d45>]
- sent [LCP ConfReq id=0x2 <asyncmap 0x0> <pcomp> <accomp>]
- rcvd [LCP ConfAck id=0x2 <asyncmap 0x0> <pcomp> <accomp>]
- rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MD5> <pcomp> <accomp>]
- sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth chap MD5> <pcomp> <accomp>]
- rcvd [CHAP Challenge id=0x1 <fb17db52a81bc14997f72e2932ab0b342bab961d49c611>, name = ""]
- sent [CHAP Response id=0x1 <2c757eac52b8d9a7d80ca7a77c419ad9>, name = "cmnet"]
- rcvd [CHAP Success id=0x1 ""]
- CHAP authentication succeeded
- sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15>]
- 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>]
- rcvd [LCP ProtRej id=0x1 80 fd 01 01 00 0c 1a 04 78 00 18 04 78 00]
- rcvd [IPCP ConfReq id=0x1 <addr 221.177.160.163>]
- sent [IPCP ConfAck id=0x1 <addr 221.177.160.163>]
- rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
- sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
- rcvd [IPCP ConfNak id=0x2 <addr 10.165.226.25> <ms-dns1 211.137.64.163> <ms-dns3 211.136.20.203>]
- sent [IPCP ConfReq id=0x3 <addr 10.165.226.25> <ms-dns1 211.137.64.163> <ms-dns3 211.136.20.203>]
- rcvd [IPCP ConfAck id=0x3 <addr 10.165.226.25> <ms-dns1 211.137.64.163> <ms-dns3 211.136.20.203>]
- local IP address 10.165.226.25
- remote IP address 221.177.160.163
- primary DNS address 211.137.64.163
- secondary DNS address 211.136.20.203
再将这里的DNS给PC或作个连接到/etc/ppp/resolf.conf应该就OK了.
下面来自:http://zhangyange00.blog.163.com/blog/static/505752201141023527867/
最近一直在搞协议栈这块,呵呵,,像TCP/IP,FTP,BOA等基本都搞定了,剩下一个ppp通过GPRS拨号上网的
题,教我搞了几天,妈的,最后监测出来,原来是开发板上的模块接触不良造成连接不上,,,狂晕啊!!!!!
不过,我借鉴了网上很多兄弟的文章,再次非常感谢他们的辛勤劳作!
为了备忘,我还是喜欢把它写下来,同时也可以给别人的帮助,或是大家一起讨论。
第一步:编译内核,make menuconfig 中选上关于ppp协议的所有选项,,呵呵呵。。。。我是这么干的。
第二步:在你的开发板上运行pppd命令,如果出现说没有这样的命令的话,那么你就需要移植了,,呵呵,恭喜
了,因为我也是移植过去的。其实移植这个并不难,简要步骤:
1>./configure
2> 生成Makefile后,make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
3> 基本上编译通过了,在目录下把该copy的文件copy出来放进开发板相应的位置就ok了
然后再次运行pppd,出现一串乱码,说明你移植成功了。【这里说的比较简单,是因为网上这样的文章实在太多
哈,如果关于这方面你还有什么不懂的,我们可以一起讨论。】
第三步:就是编写拨号的脚本文件了,这个网上也有很多的,,下面这些文件大家最好放在/etc/ppp目录里
#####################################################################################
#/etc/ppp/peers/gprs
#/etc/ppp/peers/gprs
# This is pppd script for China Mobile, used Huawei GTM900-B GPRS Module
# Usage: root>pppd call gprs
/dev/usb/tts/0
460800
crtscts
modem
debug
nodetach
usepeerdns
noipdefault
defaultroute
user "cmnet"
0.0.0.0:0.0.0.0
connect '/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#disconnect '/sbin/chat -v -f /etc/ppp/gprs-disconnect-chat'
#####################################################################################
#/etc/ppp/chap-secrets
"cmnet" * "cmnet" *
#####################################################################################
#/etc/ppp/gprs-connect-chat
# chat script for China Mobile, used HuaWei GTM900-B GPRS module.
TIMEOUT 15
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT 40
'' \rAT
OK ATS0=0
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET"
OK ATD*99***1#
CONNECT ''
#####################################################################################
#/etc/ppp/gprs-disconnect-chat
ABORT VOICE
ABORT ERROR
ABORT RINGING
TIMEOUT 12
"" \\k\\k\\k\\d+++ATH
"NO CARRIER-AT-OK" ""
#####################################################################################
#/etc/ppp/pap-secrets
"cmnet" * "cmnet" *
#####################################################################################
以上一共有5个文件,大家可以分门别类的放好就ok了。
最后当然要chmod 一下了,给他们可执行的权限哈。。
然后在运行#pppd call /etc/ppp/peers/gprs 就ok啦。。。
最后,我想说,以上的脚本不是通用的,每个开发板的环境各不相同,大家遇到的问题肯定是千奇百怪的,所以
有什么问题,大家可以一起讨论,共同进步!!!!!!!!
以上脚本,借鉴了网络上的很多文章,谢谢我们伟大的工程师们,,^_^
我们的gprs拨号上网已经做好了,当初做这个东西的时候对面这方面的东西一点也不懂,好在网上很多前辈有自己的经验介绍,少走了不少冤枉路。现在我也把自己GPRS拨号上网的东西总结下,如有错误请大家及时给我纠正。
网上大部分的GPRS案例都是华为GTM900模块的,我们的拨号用的是中兴的ME3000模块,模块对拨号程序是没有影响的。一个可以拨号上去另一个也可以拨。
我先介绍下我参考主要资料:http://blog.chinaunix.net/u3/90973/showart_1998886.html博客,我用的pppd拨号,我本身是要移植到达芬奇平台上面的,本人移植过程中没有遇到什么问题,感觉移植很是方便。其他的我也没有怎么试。我推荐大家使用这个拨号。
我建议大家实现GPRS拨号的不要一开始就在网上拷贝几个脚本直接运行,有可能一下你就成功了,这是有可能的。但是你还是不知道GPRS到底是怎么实现拨号的,建议大家先去看看拨号的原理和各个阶段分别实现什么功能,好好的阅读你的拨号模块的说明文档,这对拨号成功后上网功能的实现是很有帮助的。
当你对拨号原理和模块的使用方法了解以后就可以开始实现拨号了。
我建议你分两步走,第一步可以在windows环境下实现这个拨号这个功能。这里主要难点是使用GPRS模块在xP上面新建一个为模块拨号的modem。至于方法你可以在网上找一下,这个功能我实现,但是具体的步骤我不记得了,如果实现成功了电脑的链接速度就会显示171.2k,过程不难。这个过程可以让你了解GPRS拨号的过程和一些at命令。
第二阶段可以在linux下面拨号了,我使用的pppd拨号主要是以下几个脚本:第一个是拨号参数配置文件,其中最重的两个参数端口名称和波特率。我把我的参数配置文件贴出来:
#/etc/ppp/peers/gprs
# This is pppd script for China Mobile, used Huawei GTM900-B GPRS Module
# Usage: root>pppd call gprs
/dev/ttyUSB0//端口名称
9600//波特率
nocrtscts//无流控制
mtu 2000//最大发送字节数
mru 2000//最大接收字节数
modem
#noauth
debug
nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user "cmnet"//我拨号用的是中国移动,联通也是这个名字
0.0.0.0:0.0.0.0
ipcp-accept-local
ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 0
#noccp
#novj
#novjccomp
#persist
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#connect '/bin/chat -v -s -f /etc/ppp/gprs-connect-chat'//这里是拨号的时候调用一个验证脚本,账号加密用的
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'
我的校验文本上是gprs-connect-chat的具体内容是:
#/etc/ppp/gprs-connect-chat
# chat script for China Mobile, used ZTE ME3000 GPRS module.
TIMEOUT 15
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT 40
'' /rAT
OK AT*TSIMINS?
OK AT+ZSTR=2
OK AT+CPAS
OK AT+CSQ
OK AT+COPS?
OK AT+CREG?
OK ATS0=0
OK ATE0V1
#OK AT+CGDCONT=1,"IP","UNINET"
#OK AT+CGDCONT=1,"IP","uninet"
OK AT+CGDCONT=1,"IP","CMNET"
#OK ATDT#777
OK ATDT*99***1#
CONNECT ''
参数文件配置好之后,介绍下拨号程序脚本文件,gprs_dialup.sh
#!/bin/sh
dns1=" "
dns2=" "
cd /etc/ppp/peers
pppd call gprs&//通过pppd拨号调用gprs参数配置文件,利用模块进行拨号,下面程序是为了GPRS程序可用了写的,简言之就是仅仅完成拨号,我们的拨号依然是一个玩具,不能给别人用
echo "pppd ok"
sleep 12
echo "sleep ok"
cp -rf /etc/ppp/resolv.conf /etc/
sed -n '1p' /etc/resolv.conf > /etc/ppp/primarydns
sed -n '2p' /etc/resolv.conf > /etc/ppp/seconddns
dns1=`cut -f 2 -d ' ' /etc/ppp/primarydns`
dns2=`cut -f 2 -d ' ' /etc/ppp/seconddns`
echo $dns1
echo $dns2
resolv.conf这个文件是拨号成功后记录网络服务提供商的dns的域名服务器的IP的,这个文件时非常重要的。因为以后的拨号软件的健壮性是靠它来实现的。
这样应该就可以进行拨号了,如果有什么问题,可以看下是不是以下原因:sim卡有无,GPRS服务是否开通,模块的波特率是否配置正确,端口名称是否正确等等。
我这里GPRS拨号的总结对GPRS拨号上网部分总结不是非常的细致,主要原因是我在做这个的时候晕倒的主要问题并不是GPRS拨号这部分,而是如何使GPRS拨号尽可能的稳定比如说断点续拨,异常处理等等。后面的处理才是最麻烦的。不是有经验的人指导是比较难处理后面的环节的,所以我把拨号的细节说的不是很清楚,大家要多多的自己慢慢钻研。如果有问题可以可以留言,有能力一定帮你。
顺便说一下联通和移动的拨号所用的拨号脚本和拨号的配置文件时完全相同的。不要奇怪,这是因为联通原来是CDMA网络,后来联通重组将自己的CDMA网络划分给了电信,自己加入了GPRS网络,如果你拨号成果你就会发现移动和联通的DNS服务器IP地址是相同的。
联系客服