GPRS模块--PPP手动拨号

时间:2022-01-10 22:27:22


前言:
    目前,手机端基本普遍具有GPRS模块,该模块集成了手机常见的功能如:打电话、发短信、上网等功能,那么这些常见的功能能否提供给安装了Linux最小系统的开发板使用呢?答案是肯定的,当然要实现1个模块添加到一个新的开发板上,这需要解决许多问题,例如:它们的连接方式是什么?
怎么确认他们是否建立连接?他们成功建立之后交流方式又是什么?
    本文介绍关于将一个安装了Linux系统(DIY)的开发板如何与GPRS模块连接,并且使用GPRS模块的特殊指令进行PPP拨号上网;
    感兴趣可以了解一下关于开发板使用AT指令集进行打电话,接电话,挂电话,发短信,收短信测试,以及对应的编程:



工具准备:
    本次使用搭载sim900b的GPRS模块;
    以及FL2440实验板;
    windows8.1及安装了CentOS6.7的虚拟机;
    tftp下载软件;
    一根ch340usb转串口的串口线;


一.GPRS理论基础:
    GSM模块,是将GSM射频芯片、基带处理芯片、存储器、功放器件等集成在一块线路板上,具有独立的操作系统、GSM射频处理、基带处理并提供标准接口的功能模块。GSM模块根据其提供的数据传输速率又可以分为GPRS模块、EDGE模块和纯短信模块。短信模块只支持语音和短信服务。GPRS,可说是GSM的延续。它经常被描述成“2.5G”,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间。GPRS的传输速率从56K到114Kbps不等,理论速度最高达171k。相对于GSM的9.6kbps的访问速度而言,GPRS拥有更快的访问数据通信速度,GPRS技术还具有在任何时间、任何地点都能实现连接,永远在线、按流量计费等特点。EDGE技术进一步提升了数据传输的速率到384K-473K,被称为”2.75G”,数据传输速率更2倍于GPRS。目前,国内的GSM网络普遍具有GPRS通讯功能,移动和联通的网络都支持GPRS,EDGE在部分省市实现了网络覆盖。 
    GPRS模块,是具有GPRS数据传输功能的GSM模块。GPRS模块就是一个精简版的手机,集成GSM通信的主要功能于一块电路板上,具有发送短消息、通话、数据传输等功能。GPRS模块相当于手机的核心部分,如果增加键盘和屏幕就是一个完整的手机。普通电脑或者单片机可以通过RS232串口与GPRS模块相连,通过AT指令控制GPRS模块实现各种基于GSM的通信功能。 
    本次使用搭载sim900b的GPRS模块;
    以及FL2440实验板;

以下凡是localhost表示在在自己虚拟机(CentOS6.7)下操作
二.配置开发板的内核,以保证支持ppp拨号上网
    (一)进行模块连接
    1.GPRS模块使用串口转usb连接到FL2440开发板上(并且各自插上电源);
    2.用一根网线将PC和开发板相连(使用tftp下载方式,下载到开发板上,因此需要这一步);
    3.额外需要一个usb转串口将PC与开发板相连(使用SecureCRT的方式登入进开发板系统);
    
    (二)配置最小系统Linux内核对PPP拨号的支持:
    按上述操作之后,还需要对FL2440开发板进行内核配置(系统内核选取linux3.0(可在Linux官网上下载的到,或者找我以前的博客,前面也有记录)),其中就需要设置内核对ppp和usb转串口的支持(注意usb的时钟线问题(可参考我的博客:常见问题故障));
    首先找到开发板对应的内核:/home/guozhihao/Desktop/fl2440/linux/linux-3.0
    然后在该路径下,输入make menuconfig进入以下界面:
    
[guozhihao@localhost linux-3.0]$ make menuconfig
    GPRS模块--PPP手动拨号
    Dvice Drivers --->Network device support --->
    GPRS模块--PPP手动拨号
    关于PPP拨号的勾选上;
    完成PPP拨号内核的设置;

三.ppp工具下载
   
[guozhihao@localhost ppp]$ wget https://download.samba.org/pub/ppp/ppp-2.4.7.tar.gz
    上述链接需要使用谷歌搜索,才可以找到,CSDN下载需要积分;且,该版本(2.4.7)
    说明:
    Linux下用ppp上网需要用到两个程序:一个是pppd还有一个是chat;这两个已包含在内;
    pppd的功能是在成功获得分配的IP地址之后创建一个网络设备;
    chat是用于与GPRS模块的AT命令交流,发送联网请求对应的AT命令;

四.解压并设置对应参数
    (一)执行./configure使其生成对应的Makefile:
    原因:前面有介绍关于configure Makefile 两者关系
    
  
 [guozhihao@localhost ppp]$ tar -xzf ppp-2.4.7.tar.gz
    [guozhihao@localhost ppp]$ cd ppp-2.4.7
    [guozhihao@localhost ppp-2.4.7]$ ls
Changes-2.3  contrib  linux    pppdump      README.eap-srp   README.MSCHAP81  README.sol2
chat         etc.ppp  modules  pppstats     README.linux     README.pppoe     scripts
common       FAQ      PLUGINS  README       README.MPPE      README.pppol2tp  SETUP
configure    include  pppd     README.cbcp  README.MSCHAP80  README.pwfd      solaris
    [guozhihao@localhost ppp-2.4.7]$ cd chat/

    
    (二)修改对应的Makefile信息(添加使用最小内核系统使用的交叉编译器位置):
    
[guozhihao@localhost chat]$ vim Makefile
    添加代码如下: (红色为添加代码)
    
CC =/opt/xtools/arm920t/bin/arm-linux-gcc
    以及让其以静态的形式存放在arm-linux开发板上
    $(CC) -o chat chat.o --static    
    
    (三)添加完后,执行make,产生chat文件:
    
[guozhihao@localhost chat]$ file chat
    chat: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
    可看到对应的chat文件为32位 ARM 静态可执行文件;    

    (四)与上一步相同步骤:
    
[guozhihao@localhost ppp-2.4.7]$ cd  pppd/
    同样对pppd文件下的Makefile进行配置;
    
[guozhihao@localhost pppd]$ vim Makefile
    添加代码:
CC = /opt/xtools/arm920t/bin/arm-linux-gcc
  
 [guozhihao@localhost pppd]$ file pppd
    pppd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
    
五.编译完成后移植
    以下方法可供参考,你也可以使用其他的方法进行移植:
    由于下载包下载到虚拟机下,所以借助PC当中介,进行传输文件;
    1.将之前的编译完成ELF文件,也就是pppd、chat使用tftp下载的方式,下载到开发板上;
    以pppd文件为例:
    
[guozhihao@localhost pppd]$ sz pppd
    rz
    Starting zmodem transfer.  Press Ctrl+C to cancel.
    Transferring pppd...
      100%     671 KB  671 KB/s 00:00:01       0 Errors
    2.在PC端打开tftp软件,设置好对应位置
    然后在开发板上使用tftp服务下载到/GPRS/ppp        (下载失败请参照我之前的tftp服务常见问题参考参考:https://blog.csdn.net/PipiAvenger/article/details/79702084) 
    
/GPRS/ppp >: tftp -gr chat 192.168.92.99
    chat                 100% |*******************************|   607k  0:00:00 ETA
    3.给下载的文件赋予权限
    /GPRS/ppp >: chmod 777 chat pppd
    
六.拨号上网测试
    在开发板的/etc目录下新建/ppp/peers目录并在peers目录创建如下配置文件:可以参考man手册(对应命令man 8 pppd)进行配置脚本,并且教你使用的方法:以下是我参考配置而成的脚本
    
/etc/ppp/peers >: ls
wcdma                  wcdma-chat-connect     wcdma-chat-disconnect
以下是设置对应的脚本:
并且对应的设置参数可以在pppd.h中的全局变量之中查看对应的设置意思


  
  /etc/ppp/peers >: vim wcdma
#Copyright (c) 2018 guozhihao

#设置调试信息,并将调试信息记录到/var/log/messages文件下
debug

#lock锁定正在使用的串口,防止其他应用程序或者命令调用
nodetach
lock

#设置串口位置
/dev/ttyUSB0

#设置波特率
115200

#set flowerate
crtscts     #硬件流控
show-password    #显示密码
usepeerdns    #使用peer路径下的dns,没有会自动创建
noauth     #取消认证
noipdefault #禁用默认IP
novj    
novjccomp
noccp

#Accept the peer's idea of our local IP address
ipcp-accept-local

#ipcp-accept-remote
ipcp-accept-remote

#对应的参数-s -v -f可以在使用 chat -h来了解是对应设置意思
connect '/GPRS/ppp/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect'    
disconnect '/GPRS/ppp/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect'



   
/etc/ppp/peers >: vim wcdma-chat-connect
ABORT 'NO CARRIER'            #判断AT返回值参见错误
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'BO ANSWER'
'' \rAT                                     #驱动GPRS模块必须命令
OK \rATZ                                #那所有当前参数设置为用户的自定义参数
OK \rAT+CGDCONT=1,"IP","cmnet"    #使用终端设备建立上下文,并设置PDP类型为IP类型,以及接入点为cmnet
#
OK-AT-OK ATDT*99***1#           #进行拨号连接(有些模块例如sim900a是使用ATD来进行拨号)

CONNECT \d\c



说明:
AT+CGDCONT是设置上网接口的连接点(APN),三大运营商有各自不同的接点:
GPRS模块--PPP手动拨号


    
/etc/ppp/peers >: vim wcdma-chat-disconnect
ABORT "ERROR"        #ABORT对错误的返回值进行处理
ABORT "NO DIALTONE"
SAY "\n Sending break to the modem\n"
'' "\K"
'' "+++ATH"        #+++停止数据传输并且进入命令模式,ATH表示挂断拨号过程
SAY "\nGoodbay\n"



上述设置好后:
    使用命令pppd call wcdma&
/etc/ppp/peers >: pppd call wcdma&
[1]-  Done(8)                    pppd call wcdma
/etc/ppp/peers >: abort on (NO CARRIER)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (BUSY)
abort on (BO ANSWER)
send (^MAT^M)
expect (OK)
^MAT^M^M
OK
-- got it

send (^MATZ^M)
expect (OK)
^M
^MATZ^M^M
OK
-- got it

send (^MAT+CGDCONT=1,"IP","cmnet"^M)
expect (OK)
^M
^MAT+CGDCONT=1,"IP","cmnet"^M^M
OK
-- got it

send (ATDT*99***1#^M)
expect (CONNECT)
^M
ATDT*99**:1#^M^M
CONNECT
-- got it

send (\d)
....


一堆的请求连接信息,最后连接成功,会分配IP地址,并且在你的网卡设备中多出一个ppp0:
GPRS模块--PPP手动拨号
GPRS模块--PPP手动拨号
此时,需要重新设置默认网卡,本开发板默认路由器为eth0而非ppp0所以:
/etc/ppp/peers >: route add default dev ppp0        //如果该语句没有设置,发现已经已经分配了地址,但是ping不通可参考这个语句;

/etc/ppp/peers >: ping 4.2.2.2
PING 4.2.2.2 (4.2.2.2): 56 data bytes
64 bytes from 4.2.2.2: seq=4 ttl=47 time=835.000 ms
64 bytes from 4.2.2.2: seq=7 ttl=47 time=855.000 ms
64 bytes from 4.2.2.2: seq=11 ttl=47 time=695.000 ms
64 bytes from 4.2.2.2: seq=15 ttl=47 time=815.000 ms
^C
--- 4.2.2.2 ping statistics ---
26 packets transmitted, 4 packets received, 84% packet loss
round-trip min/avg/max = 695.000/800.000/855.000 ms
ping 成功!

连上互联网后,不仅会分配IP地址,还会分配DNS:如果想查看分配的DNS,可以从查看/etc/ppp/peer/路径下的resolv.conf里面就是配置的分配的dns;
GPRS模块--PPP手动拨号
由于信号特别差:丢包率很高:达到70%~80%;
至此,成功上网;