Linux驱动-实现PPPD连接GPRS

初步实现使用pppd连接GPRS上网

(写这篇博客的目的为了以后能自己翻阅,也方便大家学习,提出改进意见)

背景:先说说移植这玩意的背景吧!公司需要做关于GPRS和S3C2416之间的驱动,便想到了使用现在成熟的PPP协议。目前用的GPRS为四频的SIM900,通过COM1与S3C2416连接,COM0为S3C2416的调试接口。设计硬件时需要注意的是SIM900为LVTTL电平,而S3C2416为TTL电平,通过串口连接时两者之间串连一个510欧姆的电阻即可。
         在接触2416之前,做的毕业设计是利用SIM900A+STM32实现GPRS功能的,所以对GPRS调试有了一定的了解,发现用AT指令来调试GPRS还是有一定的鸡肋,使用成熟的上层协议会事半功倍。

基础:首先熟悉Linux基础知识是必须的,其次要对网络知识有一定的了解,不然在涉及到网络编程时很容易遇到基本的问题,DNSIP,公网,内网等等。我研究过一段时间的网络知识,考了全网网工四级,所以网络方面还是有一定的概念的。在大三到大四期间,也学过很长时间的Linux基础知识,虽说那时候效率很低,但是慢慢摸索也懂得了一些。

硬件连接: S3C2416核心板为君益兴的Helper2416核心板  2416与SIM900通过COM1连接
    
好了,开始进入正题:

PPP移植步骤

①修改Linux内核,让其支持PPP(Linux内核需在2.6以上)
   (1) 在linux源代码根目录下查看自己的linux内核版本。
   (2) 进入图形界面模式:         make menuconfig ARCH=arm
Linux驱动-实现PPPD连接GPRS_第1张图片

②下载并编译PPP套件,将所需文件放入嵌入式根文件系统对应目录。
    (1) PPP套件下载链接地址   ftp://ftp.samba.org/pub/ppp  (笔者下载的是ppp-2.4.7)
   (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地址。如下图所示:
  Linux驱动-实现PPPD连接GPRS_第2张图片Linux驱动-实现PPPD连接GPRS_第3张图片
   (4) 其实现在如果去Ping域名的话,是ping不通的,返回bad address。那么需要修改/etc/resolv.conf,添加域名解析器的服务地址。比如我用的是浙江嘉兴的移动号,就去找浙江嘉兴移动的DNS,改掉保存再去ping就可以了。


Linux驱动-实现PPPD连接GPRS_第4张图片 Linux驱动-实现PPPD连接GPRS_第5张图片


  (5) 接下来会去研究关于PPP登录方式和PPP断线检测自动拨号的问题。期待大家一起讨论!



你可能感兴趣的:(Linux驱动)