GPRS网络编程
一:GPRS简介
GPRS是通用分组无线业务(General Packet Radio Service)的简称,它突破了GSM网只能提供电路交换的思维方式,只通过增加相应的功能实体和对现有的基站系统进行部分改造来实现分组交换,这种改造的投入相对来说并不大,但得到的用户数据速率却相当可观。GPRS(General Packet Radio Service)是一种以全球手机系统(GSM)为基础的数据传输技术,可说是GSM的延续。GPRS和以往连续在频道传输的方式不同,是以封包(Packet)式来传输,因此使用者所负担的费用是以其传输资料单位计算,并非使用其整个频道,理论上较为便宜。
目前GPRS已经有了广泛的应用,在日常生活中可以使用手机、PDA、PC无线上网娱乐、查询;在工作中提供了移动办公、地图导航等功能,这些功能大大便利了我们的工作,使得我们随时都可以完成自己的工作等需求。
二:PDA上如何启动GPRS
PDA连接GPRS接入可以在连接里设置,但是一定要设置成CMNET,不要设置csd号码。
三:如何通过程序调用GPRS
PDA上网有两种常见方式,一种是通过Microsoft ActiveSyn与PC连接上网;一种是通过GPRS或蓝牙,一般情况下PDA上只支持一种网络连接方式。所以在一般情况下在启动GPRS网络时先要判断是否已经连接到了Internet,如果已经连接到了则无法启动GPRS连接。
启动PDA上的GPRS功能,除了使用系统自带的上网工具如Internet浏览器外,就是自己使用程序来启动。
自己使用程序来启动GPRS涉及到RAS网络编程 所以要先包含头文件
#include <initguid.h>
#include <connmgr.h>
#include "Ras.h"
接下来判断是否存在(GPRS)网络:如果要判断启动是否GPRS网络,先要列出所有网络连接列表,在判断激活的是哪个。由于一般情况下PDA在连接Microsoft ActiveSyn连接网络的情况下,其他方式一般无法启动,所以判断是哪种上网方式没有太多的意义,这里我直接判断PDA是否连接到了Ineternet;
1:判断是否连接到网络
定义参数: DWORD dwError, dwRasConnSize, dwNumConnections; RASCONN RasConn[20];//此参数存放当前活动的Ras连接if (dwError = RasEnumConnections (RasConn,&dwRasConnSize,&dwNumConnections)) return -1;//这里表示无法连接如果dwNumConnections返回参数为0时 表示没有网络连接,不为0时,终止现有的网络连接,在启动GPRS。 2:如果存在 先断开所有远程接入 if (dwError = RasHangUp(RasConn[index].hrasconn)) return -1; else return 0; //成功关闭3;连接GPRS
使用函数ConnMgrEstablishConnectionSync来申请请求,连接类型主要是根据第一个参数来设定。
四:使用WININET通过GPRS下载上传数据
由于是做小数据量的网络传送,所以使用Winnet。在下载过程中遵循一般下载过程
首要要作出设置,发送数据、接受数据以及同时访问服务器的连接限制
1现在创建CInternetSession对象
CInternetSession inetSession(_T(""));
CHttpConnection* pHttpConn = NULL;
CHttpFile* pHttpFile = NULL;
2针对连接服务器超时及限制设置
如:inetSession.SetOption(INTERNET_OPTION_MAX_CONNS_PER_SERVER,&uParam,sizeof(int));
第一个参数表示设置的类型:这里我们主要设置
请求服务器时间INTERNET_OPTION_CONNECT_TIMEOUT
发送数据时间- INTERNET_OPTION_SEND_TIMEOUT、
接受数据的时间INTERNET_OPTION_RECEIVE_TIMEOUT、
服务器连接个数INTERNET_OPTION_MAX_CONNS_PER_SERVER、INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER;
3调用CHttpConnection::OpenRequest创建一个CHttpFile对象
4发送数据:CHttpFile::AddRequestHeaders
CHttpFile::SendRequest
这里发送数据只有在网络正常的情况下才能正常设置超时,详细处理看注意事项;
5:接受数据保存文件
使用CHttpFile::QueryInfo接受返回数据,判断参数值范围,如果正确则将读取到的数据存入文件,这里要注意转换字节转换。
6:异常处理 对所有异常的捕获可以是程序更稳定。
五:注意事项:
一:由于通过GPRS实现通过无线网络与远程服务器的连接存在不稳定和掉线等情况,如当时所在地区GPRS网络不稳定造成网络通行失败。
二:在网络不稳定或者突然断线情况下,使用Winnet网络连接会出现错误或不稳定造成退出或者网络超时无法返回,使得用户界面堵塞或者退出。
三:在使用Winnet多线程连接服务器时,要一定要设置运行TCP/IP最大连接数,否则部分线程会堵塞返回超时等错误。
解决方案:
(1)建立TCP连接的过程中要考虑到每一步可能会出现的错误,比如设备没有连接好、网络信号质量不高引起连接失败等,因此在程序设计的时候要做到两点,一是在程序启动时启动GPRS连接;二是在网络通信时,需要获取所有可能的错误并处理,同时也需要对接受到的返回的字符串进行判断,如果显示操作成功则进入下一步。
(2)由于网络不稳定造成了设置发送数据超时时间无效(微软证实BUG),我在这里经过测试,一般情况下大概在2-3分钟内函数会返回,由于PDA不能异步调用,所以这里我等待3分钟后,如果不返回则强行关闭网络连接线程。