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有关的部分。
其中,发送和接收都是针对与GPRS连接的那个串口,这个代码之前都有说过。另外,我自己写了个java的接收程序,通过socket进行通信。测试的时候可以通过网络测试工具。
工具:网络调试助手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进行通信。测试的时候可以通过网络测试工具。
相关文章推荐
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- Qt定时器和随机数详解
- Qt实现图片移动实例(图文教程)
- Qt for Android开发实例教程
- QModelIndex/Role/Model介紹<二>
- 基于PyQt5的快速开发框架QFramer
- OSX下安装PyQt
- 飞凌ok6410开发板烧写yaffs2以后无法修改rcS的解决办法 3ff8
- ok6410开发板移植DirectFB手记
- 【笔记】给Qt内嵌一个Chrome吧
- 【算法】最短路径之A*搜索
- qt入门必备
- 在 Qt4 中使用 C++11
- Hello Word ~ v0.2.2 背单词软件发布 -- By WHYPRO
- ubuntu下opencv和qt的安装配置
- linux下opengl的安装(with qt)
- qt 学习小节
- QT的命名风格