您的位置:首页 > 编程语言 > Qt开发

OK6410与GPRS连接实现与PC机通信,Qt移植

2015-10-02 17:36 645 查看
       我用到的GPRS模块是SIM300A,采用的是TCP连接,UDP只支持一对一通信。       

       工具:网络调试助手http://download.csdn.net/detail/u010780613/9153089点击打开链接

       需要做一个项目,实现OK6410充当网关,然后通过GPRS将数据发送到PC机中。用GPRS的话PC机的IP必须是公网IP,不然找不到。

       公网IP的查看方式:192.168或者172.21等开头的肯定不是公网ip,电信的110、移动183开头的就是公网ip。可以打开浏览器,在百度中输入ip,如果查看到的ip和本机的ip一致,那么PC的ip就是公网ip。途径:电信的无线ChinaNet,移动的CMCC-EDU(移动不一定),因为电信掌握的IP资源比较多,早年3G上网卡什么都是公网IP,但是随着ip资源的枯竭,3G上网卡等都不能用了,只剩下ChinaNet。据说电信拨号上网,宽带上网可以找客服改,不过比较麻烦。

       有公网IP是实现GPRS通信的前提,接下来必须懂得AT指令。详细的AT指令可以网上看看,我只说跟GPRS有关的部分。

AT+CGCLASS="B",设置移动台类别为 B
AT+CGDCONT=1,"IP","CMNET",设置 PDP 上下文标志为 1,采用互联网协议( IP),接入点为"CMNET"
AT+CGATT=1,附着 GPRS 业务
AT+CIPCSGP=1,"CMNET",设置为GPRS 连接,接入点为” CMNET”
AT+CLPORT="TCP","2001",即设置 TCP 连接本地端口号为 2001
AT+CIPSTART="TCP","110.11.52.222","8800",模块将建立一个 TCP 连接,连接目标地址为:110.11.52.222,连接端口为 8800,连接成功会返回: CONNECT OK
在连接成功以后发送: AT+CIPSEND,模块返回: >,此时可以输入要发送的数据,最大可以一次发送 1352 字节,数据输入完后,同发短信一样,输入十六进制的: 1A( 0X1A),启动发送数据。在数据发送完成后,模块返回: SENDOK,表示发送成功
AT+CIPSTATUS,模块即返回当前连接状态
AT+CIPCLOSE=1,即可快速关闭当前 TCP/UDP 连接
AT+CIPSHUT,则可以关闭移动场景,关闭场景后连接状态为: IPINITIAL,可以通过发送: AT+CIPSTATUS,查询
如果是还没测试的GPRS模块,就自己让GPRS通过串口与PC机通信,进行检测。打开网络调试助手,设置协议类型为: TCPServer,本地 IP 地址直接用默认的即可(我没有连接公网ip),设置本地端口为: 8080,注意,这里的端口号可以随便设置,范围为 0~65535,只要该端口没有被其他程序占用即可。设置好之后,点击“连接”按钮(点击后变为“断开”,此时电脑端的) TCPServer 已经开始工作,等待连接接入,如下图所示。
<img src="https://img-blog.csdn.net/20151005212358467?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
其次,在OK6410开发板上应该将GPRS模块与串口2相连,可以在Qt程序中加入以下代码,完成GPRS的准备工作:
QString CGCLASS="AT+CGCLASS=\"B\"\r";
QString CGDCONT="AT+CGDCONT=1,\"IP\",\"CMNET\"\r";
QString CGATT="AT+CGATT=1\r";
QString CIPCSGP="AT+CIPCSGP=1,\"CMNET\"\r";
QString CLPORT="AT+CLPORT=\"TCP\",\"2001\"\r";
QString CIPSTART="AT+CIPSTART=\"TCP\",\"110.11.52.22\",\"8800\"\r"";

this->msgSend(CGCLASS);
sleep(1);
qDebug()<<recvmsg();
this->msgSend(CGDCONT);
sleep(1);
qDebug()<<recvmsg();
this->msgSend(CGATT);
sleep(1);
qDebug()<<recvmsg();
this->msgSend(CIPCSGP);
sleep(1);
qDebug()<<recvmsg();
this->msgSend(CLPORT);
sleep(1);
qDebug()<<recvmsg();
this->msgSend(CIPSTART);
sleep(1);
qDebug()<<recvmsg();
 发送代码:

void Index::sendGPRS()
{
sendData=QString("#%1#%2#%3$%4").arg(num1).arg(num2).arg(num3).arg("\x1a");
if(sendfd == 1)
{
CIPSEND = ~CIPSEND;
if(CIPSEND == 0)
{
myGPRS->msgSend("AT+CIPSEND\r");
}
else
myGPRS->msgSend(sendData);

}
}
接收代码:

void Index::recvGPRS()
{
GPRS_str = myGPRS->recvmsg();
if(GPRS_str=="null")  return;

if(GPRS_str.contains("!",Qt::CaseInsensitive))
{
qDebug()<<GPRS_str;
}
else if(GPRS_str.contains("get",Qt::CaseInsensitive))

{
qDebug()<<"Please return Message";
}
}


      其中,发送和接收都是针对与GPRS连接的那个串口,这个代码之前都有说过。另外,我自己写了个java的接收程序,通过socket进行通信。测试的时候可以通过网络测试工具。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ok6410 GPRS Qt