初步实现使用pppd连接GPRS上网
(写这篇博客的目的为了以后能自己翻阅,也方便大家学习,提出改进意见)
背景:先说说移植这玩意的背景吧!公司需要做关于GPRS和S3C2416之间的驱动,便想到了使用现在成熟的PPP协议。目前用的GPRS为四频的SIM900,通过COM1与S3C2416连接,COM0为S3C2416的调试接口。设计硬件时需要注意的是SIM900为LVTTL电平,而S3C2416为TTL电平,通过串口连接时两者之间串连一个510欧姆的电阻即可。
在接触2416之前,做的毕业设计是利用SIM900A+STM32实现GPRS功能的,所以对GPRS调试有了一定的了解,发现用AT指令来调试GPRS还是有一定的鸡肋,使用成熟的上层协议会事半功倍。
基础:首先熟悉Linux基础知识是必须的,其次要对网络知识有一定的了解,不然在涉及到网络编程时很容易遇到基本的问题,DNS,IP,公网,内网等等。我研究过一段时间的网络知识,考了全网网工四级,所以网络方面还是有一定的概念的。在大三到大四期间,也学过很长时间的Linux基础知识,虽说那时候效率很低,但是慢慢摸索也懂得了一些。
硬件连接: S3C2416核心板为君益兴的Helper2416核心板 2416与SIM900通过COM1连接
好了,开始进入正题:
PPP移植步骤
①修改Linux内核,让其支持PPP(Linux内核需在2.6以上)
(1) 在linux源代码根目录下查看自己的linux内核版本。
(2) 进入图形界面模式:
make menuconfig ARCH=arm
(2) 将ppp-2.4.7解压
tar zxvf ppp-2.4.7.tar.gz
(3) 进入解压目录,配置交叉编译PPP套件。
#.configure
#make CC=/Software/arm-jyxtec-linux-gnueabi/bin/arm-linux-gcc(指定交叉编译路径)
(4) 编译成功后,将PPP套件安装至嵌入式系统中。
cp $(ppp-2.4.7)/chat/chat /home/roofs/bin
cp $(ppp-2.4.7)/pppd/pppd /home/roofs/bin
cp $(ppp-2.4.7)/pppdump/pppdump /home/roofs/bin
cp $(ppp-2.4.7)/pppstats/pppstats /home/roofs/bin
(/home/roofs/bin为笔者的嵌入式根文件系统共享的NFS所在位置的bin目录)
(5)
在嵌入式文件系统的etc目录下创建ppp文件夹,并拷贝相关文件至此。
(/home/bruce/samba_share/etc)#mkdir ppp
(/home/bruce/samba_share/etc)#cp $(ppp-2.4.7)/etc.ppp/* /home/roofs/etc/ppp
③ 相关脚本准备
(1) GPRS启动脚本
文件名:dial-on.sh
存放位置:/home/roofs/bin
#!/bin/sh
#define dial_on function
dial_on()
{
#test if pppd is running
pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`
if [ $pppd_stat -gt 0 ]
then
echo "ppp connection's already started."
else
#close ethernet interface
ifconfig eth0 down
#ppp start
pppd modem /dev/ttySAC1 115200 nocrtscts lock connect "chat -v -f /etc/ppp/gprs-connect" user "" noauth debug defaultroute
# pppd配置说明:
# ttyS1:连接GPRS模块SIM900的串口
# 115200:GPRS的拨号速率
# nocrtscts:无流控
# lock:锁定设备
# connect “chat ???? ???? /etc/ppp/gprs-connect”:GPRS连接脚本文件
# user “”:用户名,这里是无
# noauth:无需认证
# debug:输出调试信息
# defaultroute:此拨号连接作为默认路由
echo "ppp is starting"
fi
}
#dial on gprs
dial_on
#wait for ppp's init
sleep 5
pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`
if [ $pppd_stat -eq 0 ]
then
echo "trying 2nd time to call ppp"
dial_on
sleep 5
fi
pppd_stat=`ifconfig|grep ppp|wc -l|cut -b 7-7`
if [ $pppd_stat -eq 0 ]
then
echo "pppd error!"
echo "please check pppd's config files"
fi
#open ethernet interface
ifconfig eth0 up
#end
(2) GPRS连接配置文件 (关于配置拨号脚本可参考SIM900官方指导手册,内有详细介绍拨号设置)
文件名:gprs-connect
存放位置:/home/roofs/etc/ppp
TIMEOUT 30
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO CARRIER"
'' AT
OK ATS0=0
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET"
OK ATD*99***1#
CONNECT ''
(3) 其实到这里为止,一个简单的PPP协议栈就搭建完成了,当然最重要的就是调试过程,要调试成可行的的确是很不容易的,笔者自己也摸索了很久,所以各位要有耐心,做Linux的研究就是这样,探索+前人的总结。直接运行dial-on.sh,查看是否已经连接上PPP,尝试ping某个可ping通的IP地址。如下图所示:
(4) 其实现在如果去Ping域名的话,是ping不通的,返回bad address。那么需要修改/etc/resolv.conf,添加域名解析器的服务地址。比如我用的是浙江嘉兴的移动号,就去找浙江嘉兴移动的DNS,改掉保存再去ping就可以了。
(5) 接下来会去研究关于PPP登录方式和PPP断线检测自动拨号的问题。期待大家一起讨论!