GPRS模块的使用(一)

为了做一个QT gprs模块用上网传输数据,我这里用的是BenQ  M23 GSM/GPRS模块。

首先我简单介绍一下:

BENG公司的M23/M23模块是目前市场上的主流GSM/GPRS模块之一,可以应用于GSM短信通信以及语音通信,其中,短信息适合对实时性质要求不高数据量不大的数据通信。由于支持GPRS 和嵌入式的TCP/IP,M23还可以使用于实时性要求较高数据量相对较大,传送速度相对较快的数据通信领域。M23模块支持的是CLASS B类型GPRS 网络,能够支持语音短信和GPRS数据传输,但是不是同一时刻进行两种通信方式,当进行短信和语音通信的时候GPRS数据传输暂时挂起,当结束之后继续自动恢复GPRS 数据的传输。

现在我这里的gprs模块是基于串口通信的。所以我要用这模块必须先要把串口设置好

为了好点调试设计而来一个测试界面(不过也可以当成是一个gprs网络接口)

这是一个界面,下面来看看要做哪些工作才能使自己写的程序能通过gprs发送数据

在这里还要说一点,我由于我用的是M23这个gprs模块,本来设想的是通过ppp拨号上网,在linux下调试了好几天多没见到成果,下面步骤(包括从网上找来的资料)

GPRS拨号模块

GPRS传输层负责建立与GPRS网络的物理连接,实现数据的物理层传输。选用GPRS模块M23作为传输介质,GPRS模块相当于一种无线Modem,它的接口简单,可通过AT指令来控制,解决了开发底层传输媒体的困难。

在嵌入式Linux环境下,通过PPP拨号,GPRS上网

PPP的拨号上网,方法如下:(通过网上搜索)

1.首先得让内核支持PPP,进入Linux 内核目录(kernel-2.6.30.4),执行 #make menuconfig
    添加如下内核选项:(这一步一般是不用做的,因为GEC2440其实已经添加了此功能了)
Device Drivers ---> Network device support --->

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

[*]   PPP multilink support

<*> PPP support for async serial ports

<*> PPP support for sync tty ports

<*> SLIP (serial line) support

[*]   CSLIP compressed headers

添加完成后保存并退出,执行# make zImage

编译完成以后,在内核目录的arch/arm/boot 目录下便会生成一个 zImage 内核文件,烧到开发板中,这样开发板内核就支持了PPP了。

2.下载ppp-2.4.4.tar.gz 或其他版本PPP 拨号程序源码可以上网搜索

进入ppp-2.4.4.tar.gz的目录执行解压命令 #tar zxf ppp-2.4.4.tar.gz

解压后出现 ppp-2.4.4 文件夹,进入该目录( #cd ppp-2.4.4 ),执行配置命令

#./configure

然后执行 #make CC=/usr/local/arm/4.1.2/bin/arm-linux-gcc   (后面的CC表示你的交叉编译器目录,要是你添加PATH路径,直接CC=arm-linux-gcc

编译完成后,进入下一步。

3.修改相关拨号脚本

进入 ppp-2.4.4 目录下的 script 目录,可以找到 ppp-on ppp-off ppp-dial-on 等多个脚本文件
    执行#vi ppp-on
    内容如下,修改一下里面的内容
    TELEPHONE=555-1212 改为 TELEPHONE=*99***1#
    exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS0 38400 \
          asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP \
          noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT

改为

exec /bin/pppd debug lock modem nocrtscts 你的串口设备 你的波特率 \
            asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP \
            noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT
    ppp-on 修改完成后执行 ESC 和 :wq! 强制保存。
    然后修改ppp-on-dialer
    执行#vi ppp-on-dialer
    删除最后两行关于 拨号帐户密码的。
    到此修改结束

复制相关文件到开发板

以下$(PPP)为 计算机上ppp-2.4.4 的目录 ,$(EMB_BIN)代表 开发板中的 /bin 目录,$(EMB_ETC)代表开发板中的 /etc 目录
    #cp $(PPP)/chat/chat $(EMB_BIN)#cp $(PPP)/pppd/pppd $(EMB_BIN)
    #cp $(PPP)/pppdump/pppdump $(EMB_BIN)#cp $(PPP)/pppstats/pppstats $(EMB_BIN)              
    #mkdir $(EMB_ETC)/ppp              
    #cp $(PPP)/etc.ppp/* $(EMB_ETC)/ppp
    #cp $(PPP)/scripts/ppp-on   $(EMB_BIN)
    #cp $(PPP)/scripts/ppp-off   $(EMB_BIN)
    #cp $(PPP)/scripts/ppp-on-dialer   $(EMB_ETC)/ppp

复制完成(其实放到相应的/usr/sbin目录也是可以的,只要你仔细看ppp-on的脚本)
此后,连接好ARMGPRS模块后,便可以输入命令 #ppp-on 执行拨号了!
    执行上面的ppp-on 命令以后 等一会,你可以看见GPRS模块上面的指示灯快速而稳定地闪烁,表明拨号成功了
    这时候你可以在开发板上执行#ifconfig 命令,可以看见新建了一个 ppp0 的设备 ,上面还有IP地址等信息呢!
    经过这部后,还要修改DNS服务器地址

#vi /etc/resolv.conf

添加 nameserver 211.136.20.203(这要视乎你本地的移动DNS服务器地址)

广东 中国移动CMNET 

primary   DNS address 211.137.130.3

secondary DNS address 211.137.130.19

保存退出

尝试一下 ping www.baidu.com 看看能够ping出什么东西来?,如果ping不通,使用#ifconfig发现有ppp0设备,也有eth设备,可以先关掉eth设备试下#ifconfig eth0 down   (根据显示的eth名)

如果这样就搞定了,我想我也不用写了,当发现还是不成功,而且看上去还是有很多不明白的时候可以再接着上面的步骤继续如下操作

首先是ppp-on,ppp-off,ppp-on-dialer只是一些写好的脚本,自己可以查看,不是很难。

主要步骤是先在板子的/etc/ppp/peers目录下建立文件gprsgprs也可以是其它名字),写入拨号参数。接着在/etc/ppp目录下建立gprs-connect-chat(拨号命令)、chap-secret(用户名等),最后调用#pppd call gprs(前提是你已经在前面的步骤中把pppd等文件复制指定目录下了),可以通过#tail -f /var/log/messages命令查看日志。最后关闭掉eth设备,即可通过ppp0设备上网了。下面给出各个文件的内容
1.
#/etc/ppp/peers/gprs
# This is pppd script for China Mobile, used GPRS Module
# Usage:   root>pppd call gprs
/dev/ttyUSB0    #自己的设备文件名,首先最后在ppp拨号上网前保证你的模块能正确接收和返回AT命令吧
115200          #波特率
nocrtscts       #无硬件流控的
modem
#noauth         #想让ppp在后台运行可以去掉注释
debug
#nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user "cmnet"   #你的用户名,最好随便起个,不加双引号也可以的
0.0.0.0:0.0.0.0 #从远端分配ip地址等
ipcp-accept-local
#ipcp-accept-remote
#lcp-echo-failure  12
#lcp-echo-interval 3
#noccp
#novj
#novjccomp
#persist
#connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
connect '/usr/sbin/chat -v -s -f /etc/ppp/gprs-connect-chat'
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'

可以根据自己的需要和文件存放的位置修改,切忌直接复制啊!
2.
#/etc/ppp/gprs-connect-chat
# chat script for China Mobile, used GPRS module.
TIMEOUT         15
ABORT           "DELAYED"
ABORT           "BUSY"
ABORT           "ERROR"
ABORT           "NO DIALTONE"
ABORT           "NO CARRIER"
TIMEOUT         40
''              AT
OK              AT+CFUN=1 #都是标准的AT命令,如果采用的3G网卡的话需要这个命令,不是则应该删除
OK                ATS0=0
OK              ATE0V1
OK              AT+CGDCONT=1,"IP","CMNET" #中移动的
OK              ATDT*99***1#
CONNECT         ''

3.
#/etc/ppp/chap-secrets
#client    server secret IP address
"cmnet"    *     "cmnet"    *
现在一般都采用chap认证,也有pap认证的。

最后想关闭ppp了,那么可以用上面的ppp-off,也可以直接ps下,再kill了啊!呵呵!

上面设置花了好多时间都没成功,由于时间紧急,以后有时间了在继续调试,下面我们又一种简单的方式来gprs上网,就是通过命令设置

AT 命令与解释

如果 sim 卡已经开通了 GPRS业务就可以通过程序来实现数据传输了 。 作为服务器端必须有一个或者能映射一个固定的公网 IP ,而且约定的通信端口必须是处于监听状态,否则拨号连接将不成功 。

AT+CGDCONT=1,"IP","CMNET" // 接入点为中国移动 CMNET

AT%CGPCO=1,"PAP,,",1 // PAP 验证,用户名密码为空即可

AT$NOSLEEP=1 // 使模块在长时间没有通信的时候不会进入睡眠

AT+CNMI=2,1,,1 // 短信接收提醒,使在 gprs 模式下时能够收到短信

AT$DESTINFO="x.x.x.x",1,x // X代表远端服务器IP和端口,1代表TCP,如是2代表UDP

ATD*97# // 使用内置拨号协议拨号

如上设置后就对串口操作就可以把数据发送到互联网,或接受互联网发来的数据