Linux驱动-实现PPPD连接GPRS

2019-07-12 23:06发布

初步实现使用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


②下载并编译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地址。如下图所示:       (4) 其实现在如果去Ping域名的话,是ping不通的,返回bad address。那么需要修改/etc/resolv.conf,添加域名解析器的服务地址。比如我用的是浙江嘉兴的移动号,就去找浙江嘉兴移动的DNS,改掉保存再去ping就可以了。




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