内核版本Linux-3.0     芯片sim900


一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通讯功能移动和联通的网络都支持GPRSEDGE在部分省市实现了网络覆盖。

GPRS模块是具有GPRS数据传输功能的GSM模块。GPRS模块就是一个精简版的手机集成GSM通信的主要功能于一块电路板上具有发送短消息、通话、数据传输等功能。GPRS模块相当于手机的核心部分如果增加键盘和屏幕就是一个完整的手机。普通电脑或者单片机可以通过RS232串口与GPRS模块相连通过AT指令控制GPRS模块实现各种基于GSM的通信功能。

GPRS模块区别于传统的纯短信模块两者都是GSM模块但是短信模块只能收发短信和语音通讯而GPRS模块还具有GPRS数据传输功能。



二配置内核添加PPP拨号上网

在虚拟机的linux上操作

Device Drivers  --->

      。。。。。。

      [*] Network device support  --->

              。。。。。。

              *** CAIF transport drivers ***

              <*>   PPP (point-to-point protocol) support

              [*]     PPP multilink support (EXPERIMENTAL)

              [*]     PPP filtering

              <*>     PPP support for async serial ports

              <*>     PPP Deflate compression

              <*>     PPP BSD-Compress compression

              <*>     PPP MPPE compression (encryption) (EXPERIMENTAL)

              <*>     PPP over Ethernet (EXPERIMENTAL)

              。。。。。。

在内核路径下再make一次将新生成的内核烧进开发板。



三下载编译ppp-2.4.4.tar.gz 下载源码自己解压编译生成可执行命令用于ppp拨号上网

下载地址http://download.csdn.NET/detail/zhyustar/1531748

以下在虚拟机的linux上执行

自己建个sim900文件夹我自己的路径在/home/zzx/fl2440/3rdparty/sim900将下载的ppp-2.4.4.tar.gz放在该目录下

[zzx@localhost sim900]$ tar -xzf ppp-2.4.4.tar.gz

[zzx@localhost sim900]$ ls

ppp-2.4.4  ppp-2.4.4.tar.gz

[zzx@localhost sim900]$ cd ppp-2.4.4

[zzx@localhost ppp-2.4.4]$ ./configure

[zzx@localhost ppp-2.4.4]$ ls

Changes-2.3  etc.ppp   modules   README          README.MSCHAP80  scripts
chat         FAQ       PLUGINS   README.cbcp     README.MSCHAP81  SETUP
common       include   pppd      README.eap-srp  README.pppoe     solaris
configure    linux     pppdump   README.linux    README.pwfd
contrib      Makefile  pppstats  README.MPPE     README.sol2 

[zzx@localhost ppp-2.4.4]$ cd chat/

[zzx@localhost chat]$ vim chat.c


linux ppp移植_linux ppp


[zzx@localhost chat]$ vim Makefile


linux ppp移植_linux ppp_02

[zzx@localhost chat]$ cd ../pppd

[zzx@localhost ppp-2.4.4]$ vim auth.c 

[zzx@localhost pppd]$ vim auth.c 

linux ppp移植_linux ppp_03

注.c文件中用/* */做注释Makefile文件中使用#做注释

[zzx@localhost pppd]$ vim Makefile

linux ppp移植_linux ppp_04 

linux ppp移植_linux ppp_05 

[zzx@localhost pppd]$ cd ..

[zzx@localhost ppp-2.4.4]$ make

[zzx@localhost ppp-2.4.4]$ cd chat/

[zzx@localhost chat]$ ls

chat  chat.8  chat.c  chat.o  Makefile  Makefile.linux  Makefile.sol2

[zzx@localhost chat]$ file chat

chat: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

[zzx@localhost chat]$ cd ../pppd

[zzx@localhost pppd]$ file pppd

pppd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped


将生成的chat和pppd文件用tftp放到开发板的/usr/sbin/路径下并给于可执行权限chmod a+x chat pppd



四开发板下脚本的编写

以下在开发板上操作

>: mkdir /etc/ppp

>: cd ppp/

>: vi gprs-connect-chat

linux ppp移植_linux ppp_06 

***************************************************

一个简单的chat脚本有下面的结构 
“” AT 
OK ATDT dialnumber 
CONNECT “” 
1) MODEM期望空字符串。这句话的意思直接理解就是MODEM不管收到什么字符串先发出字符串AT 
2) 期望收到“OK”字符串然后发送字符串“ATDT dialnumber” 
3) 如果收到“CONNECT”就不再发送认为数据链路已建立连接。 
4)如果需要进行超时控制就可以加入如下字段 
TIMEOUT 10 
5)如果要增加对特殊情况的处理就加入下面字段 
ABORT BUSY 
ABORT NO ANSWER 
ABORT RINGING 
意思是如果收到字符串“BUSY”、“NO ANSWER”、“RINGING”就退出执行。


三大运营商拨号设置

linux ppp移植_linux ppp_07 

**********************************************


编写gprs脚本编写gprs脚本为PPP连接指定了连接使用的设备、使用的控制字符传输速率、指定了硬件加速、溢出控制等

在/etc/ppp/peers路径下编写gprs脚本注意默认路径为/etc/ppp/peers

>: mkdir peers

>: cd peers/

>: vi gprs 
linux ppp移植_linux ppp_08 

注加上参数-v 告诉 chat命令将其所有的输出入拷贝到系统记录里通常是 #/var/log/messageschat脚本的位置可以位/etc/目录下也可以位于/var下这个可以根据需要灵活设置



测试ppp拨号上网

注意需要将eth0即网口给禁用掉这样ping命令才会通过ppp0端口寻找路由连接外网 

>: ifconfig eth0 down

>: pppd call gprs &        //&为后台运行符
>: abort on (BUSY)
abort on (NO ANSWER)
abort on (NO CARRIER)
abort on (NO DIALTONE)
abort on (ERROR)
abort on (\nRING\r\n\r\nRING\r)
timeout set to 20 seconds
send (^MAT^M)
expect (OK)
^MAT^M^M
OK
 -- got it

send (AT+CGDCONT=1,"IP","3GNET"^M)
expect (OK)
^M
AT+CGDCONT=1,"IP","3GNET"^M^M
OK
 -- got it

send (ATDT*99#^M)
Waiting for connect...
expect (CONNECT)
^M
ATDT*99#^M^M
CONNECT
 -- got it

send (^M)
Connect Success!
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyS1
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x20790fc3> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0xa0000> <auth pap>]
sent [LCP ConfAck id=0x1 <asyncmap 0xa0000> <auth pap>]
rcvd [LCP ConfRej id=0x1 <magic 0x20790fc3> <pcomp> <accomp>]
sent [LCP ConfReq id=0x2 <asyncmap 0x0>]
rcvd [LCP ConfAck id=0x2 <asyncmap 0x0>]
No secret found for PAP login
sent [PAP AuthReq id=0x1 user="root" password=<hidden>]
rcvd [PAP AuthAck id=0x1 "Login OK"]
Remote message: Login OK
PAP authentication succeeded
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [LCP ProtRej id=0x2 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [IPCP ConfReq id=0x1 <addr 192.200.1.21>]
sent [IPCP ConfAck id=0x1 <addr 192.200.1.21>]
rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [IPCP ConfNak id=0x2 <addr 10.217.45.236> <ms-dns1 218.106.127.114> <ms-dns3 218.104.111.122>]
sent [IPCP ConfReq id=0x3 <addr 10.217.45.236> <ms-dns1 218.106.127.114> <ms-dns3 218.104.111.122>]
rcvd [IPCP ConfAck id=0x3 <addr 10.217.45.236> <ms-dns1 218.106.127.114> <ms-dns3 218.104.111.122>]
local  IP address 10.217.45.236
remote IP address 192.200.1.21
primary   DNS address 218.106.127.114
secondary DNS address 218.104.111.122

>: ifconfig
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.217.45.236  P-t-P:192.200.1.21  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:64 (64.0 B)  TX bytes:125 (125.0 B)

>: 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=0 ttl=51 time=1223.093 ms
64 bytes from 4.2.2.2: seq=1 ttl=51 time=896.179 ms
64 bytes from 4.2.2.2: seq=2 ttl=51 time=629.710 ms
64 bytes from 4.2.2.2: seq=3 ttl=51 time=584.789 ms

--- 4.2.2.2 ping statistics ---
5 packets transmitted, 4 packets received, 20% packet loss
round-trip min/avg/max = 584.789/833.442/1223.093 ms 

>: ping www.baidu.com
PING www.baidu.com (180.97.33.107): 56 data bytes
64 bytes from 180.97.33.107: seq=0 ttl=50 time=2204.226 ms
64 bytes from 180.97.33.107: seq=1 ttl=50 time=1383.368 ms
64 bytes from 180.97.33.107: seq=2 ttl=50 time=599.730 ms

--- www.baidu.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max = 599.730/1395.774/2204.226 ms 

连接外网成功在/etc/ppp目录下

linux ppp移植_linux ppp_09

linux ppp移植_linux ppp_10


**************************************

若运行pppd call gprs & 出现下面错误

linux ppp移植_linux ppp_11 

解决先用>: microcom -s 115200 /dev/ttyS1 进行AT串口通信测试  注CTRL+x 为取消microcom指令

>: microcom -s 115200 /dev/ttyS1           //使用microcom命令来进行串口通信相当于pc机上的串口通信软件
AT       //测试串口是否连接上返回OK成功
OK
AT+CPIN?     //测试sim卡是否在位返回READY OK表明检测到卡
+CPIN: READY

OK
AT+CREG?   //判断卡是否注册
+CREG: 1,1     //1 代表当网络注册状态改变时激活网络注册结果码   1代注册到了本地网络 

OK
AT+CSQ      //测试信号强度
+CSQ: 18,0     // 31为最强

OK

我出现上述截图问题是因为没有用大的卡套本人的是小卡所以sim卡没有被检测到

以下为一些常用的检测AT指令

先要用AT命令看看
1 AT有没有反映判断模块是否上电
2 AT+CPIN? 判断卡是否在位 -> AT+CREG? 判断卡是否注册上 

然后才是pppd拨号
只有卡注册到移动运营商上了才能pppd拨号 


AT+CREG
命令解释网络注册及状态查询
命令格式AT+CREG=MODE<CR>
命令返回OK  
    如果输入 AT+CREG? <CR>则返回+CREG: <mode>, <stat> [ ,<lac>,<ci> ]  
    注: <mode>的值共有三个选项,分别是 0 or 1 or 2,  其中0代表关闭网络注册结果码, 1代表当网络注册状态改变时激活网络注册结果码, 2 代表激活网络注册结果码同时显示区域和小区信息.
    <stat>的返回值共有三个,分别是 0, 1, 2,3,4,5 ,  其中 0 代表没有注册网络同时模块没有找到运营商, 1代注册到了本地网络, 2 代表找到运营商但没有注册网络, 3 代表注册被拒绝, 4 代表未知的数据, 5代表注册在漫游状态.
   <lac>表示所属网络区域代码,十六进制格式显示,如: “ 279C” 
   <ci>表示所属网络的小区 ID,十六进制格式显示,如: “ 0EB2”                     
    注: <mode>的值设定为 0 或1 的话, <lac>,<ci>的返回值则不显示.
测试结果A T+CREG=0 <CR>
OK
AT+CREG? <CR>
+CREG: 0,1
 
AT+CREG=1 <CR>
OK
AT+CREG? <CR>
+CREG: 1,1
 
AT+CREG=2 <CR>
OK
AT+CREG? <CR>
+CREG: 2,1, “ 279C” , “ 0EB2” 


AT+CSQ

+CSQ: 12,0 信号强度弱31最强

AT+CGATT?

+CGATT: 1      覆盖到GPRS网络如果返回值是零则可能是SIM卡内没有钱了或者是覆盖不到GPRS网络 

******************************************

*****************************************

还有个错误就是我们将sim卡插到gprs模块后打开开关还需要长按复位键然后一个led灯会变成常闪状态说明正常gprs模块工作之前我的那个灯常闪了十秒左右就又熄灭了后来看上一位使用这个模块的同学博客说是硬件原因将5V-2A的电源线换成9V-2A的就可以保持常闪状态了。他的博客原文地址http://www.cnblogs.com/xiaohexiansheng/p/5723994.html 

*******************************************

*******************************************

有一个问题没能解决就是在执行pppd call gprs &指令后再使用microcom -s 115200 /dev/ttyS1 命令串口不能通信输入AT后并没有得到回显OK先用ps指令查看系统进程用kill指令杀掉pppd call gprs &指令再执行microcom时AT又正常回显了难道是不能同时执行这两个暂不清楚

本文内容出自http://blog.csdn.net/xiongzhizhu/article/details/52202026#comments