前言:
目前,手机端基本普遍具有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
Dvice Drivers --->Network device support --->
关于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),三大运营商有各自不同的接点:
/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:
此时,需要重新设置默认网卡,本开发板默认路由器为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;
由于信号特别差:丢包率很高:达到70%~80%;
至此,成功上网;