vc++课程设计
- 格式:doc
- 大小:359.00 KB
- 文档页数:15
目录1.功能概述 (2)1.1CMPP功能概述 (2)1.2应用程序功能概述 (3)2.具体实现 (4)2.1需求分析 (4)2.2数据库设计 (4)2.3界面设计 (5)2.3.1 相关窗体界面视图 (5)2.3.2 最小化到托盘的实现 (7)2.4各功能模块具体实现 (7)2.4.1 CMPP消息结构的定义 (7)2.4.2 连接、登录网关 (8)2.4.3 断开网关 (8)2.4.4 连接数据库 (8)2.4.5 断开数据库 (8)2.4.6 接收网关返回消息的线程的实现 (8)2.4.7 测试长连接的线程的实现 (8)2.4.8 发送信息 (8)2.4.9 接收信息 (8)2.4.10 保存信息 (8)2.4.11 删除信息 (8)2.4.12 回复信息 (8)2.4.13 状态提示功能 (9)2.4.14 配置文件 (8)2.4.14.1 配置文件的设置 (8)2.4.14.2 操作配置文件的类的实现 (9)3. 功能演示 (9)4. 总结 (14)附录关键函数具体实现代码 (15)1.功能概述1.1CMPP功能概述CMPP协议主要提供以下两类业务操作:(1)短信发送(Short Message Mobile Originate,SM MO)典型的业务操作举例如图2所示:图1 需要前转的MO示意图1)手机发出数据请求(可能是订阅信息或图片点播等),被源ISMG接收;2)源ISMG对接收到的信息返回响应;3)源ISMG在本地查询不到要连接的SP,向GNS(汇接网关)发路由请求信息;4)GNS将路由信息返回;5)源ISMG根据路由信息将请求前转给目的ISMG;6)目的ISMG对接收到的信息返回响应;7)目的ISMG将请求信息送SP8)SP返回响应;在以上操作中,步骤3到步骤8均使用CMPP协议;在随后的操作中,目的ISMG在接收到SP的响应后将产生MO状态报告发给源ISMG。
(2)短信接收(Short Message Mobile Terminated,SM MT)典型的业务操作举例如图3所示:图2 需要前转的MT示意图1)SP发出数据请求(可能是短信通知或手机铃声等),被源ISMG接收;2)源ISMG对接收到的信息返回响应;3)源ISMG在本地数据库中找不到要目的手机号段所对应网关代码,向GNS(汇接网关)发路由请求信息;4)汇接网关将路由信息返回;5)源ISMG根据路由信息将请求前转给目的ISMG;6)目的ISMG对接收到的信息返回响应;7)目的ISMG将请求信息发送至SMC;8)SMC向目的ISMG返回响应;在上述操作中,步骤1到步骤6均使用CMPP协议;在随后的操作中,SMC将通过NO.7信令网向移动用户发送信息,移动用户收到后将返回状态报告(Delivery-Receipt)给短信中心,短信中心将按照MO操作的流程将状态报告返回给SP(如果SP要求返回状态报告)。
注释:本课程设计中使用的网关是网关服务端的模拟器。
1.2应用程序功能概述通过连接网关和数据库实现信息的发送、接收、存储、删除等基本功能。
2.具体实现2.1需求分析随着通信行业的高速发展,许多企业和部门开始利用中国移动提供的互联网短信网关接口来自己开发实现短消息的接收和发送功能,以便为企业自身带来更多的方便或向用户提供更多的服务业务。
本课程设计利用vc++6.0和SQLServer2000实现通过网关发送和接收短消息的简单功能。
2.2数据库设计数据库用于存储与信息相关的数据,例如消息的内容、日期、发送人等等。
本程序利用S QLServer2000实现数据库的创建。
首先创建一个数据库,取名为WFtest。
在该数据库中创建三个表:recvmsg、sendmsg和phoneNO。
分别用于储存接收到的消息的数据、发送的消息的数据和联系人的联系号码。
三个表的设计如下图所示:2.3界面设计2.3.1 相关窗体界面视图关于界面应该怎么设计我考虑了很多,也曾做了好几个比较炫的界面,五颜六色的,还用CButton类专门设计了一下按钮的视图,添加了用于设置背景颜色和字体的对话框,但完成后感觉有些喧宾夺主,看的也很是别扭,至少我是这种感觉。
可能是自己不懂得颜色搭配的技巧吧。
最后还是决定舍弃自己添加的那些设计界面的对话框,采用了最简洁直观的界面,虽然有些单调,但在我看来却是很自然,很协调。
用VC++6.0创建基于对话框的应用程序,工程取名为IsmgTest。
设置程序视图如图所示:图5 发送消息时调出的对话框图6 查找对话框2.3.2 最小化到托盘的实现1.当用鼠标左键单击窗体上的最小化按钮时,应用程序最小化到托盘。
实现的效果如图所示:图7 最小化到托盘示意图首先在主对话框的属性框的styles页中选中Minimize box复选框,如图:图8 选中最小化属性其次在CIsmgTestDlg中添加WM_SYSCOMMAND窗口消息。
具体实现代码在OnSysCommand(UINT nID, LPARAM lParam)函数中。
2.当用鼠标左键单击状态栏中应用程序的图标是,应用程序恢复正常图。
具体实现代码在自定义消息WM_HINT的响应函数OnIcon(WPARAMwParam,LPARAM lParam)中。
3.当退出应用程序时,从状态栏中移除托盘。
具体实现代码在OnClose()函数中。
2.4 各功能模块具体实现2.4.1 CMPP消息结构的定义消息结构包括消息头和消息体,CMPP各消息结构的定义在MsgDef.h文件中。
2.4.2 连接登录网关连接网关需创建流式套接字,然后与网关建立长连接。
具体实现在ConnectServer(char *cServerIP, int nPort)函数中。
建立连接后就可以登录网关了。
从配置文件中读取登录信息,向网关发送CMPP_CONNECT消息。
具体实现在ClientLogin()函数中。
该功能在OnBtnLinkismg()函数中完成。
2.4.3 断开网关向网关发送CMPP_TERMINA TE消息断开连接,同时关闭创建的与网关通讯的线程,释放没用的资源。
具体实现在ClientLogoff()函数中。
该功能在OnBtnDlinkismg()函数中完成。
2.4.4 连接数据库与数据库建立连接,具体实现在DBConnect()函数中。
由OnBtnLinkdb()函数完成该功能。
2.4.5 断开数据库断开与数据库的连接,具体实现在DBDisConnect()函数中。
由OnBtnDlinkdb()函数完成该功能。
2.4.6 接收网关返回消息的线程的实现如果成功登录网关,则创建接收网关返回消息的线程RecieveGateThread,该线程的具体实现在RecieveGateThread(LPVOID lpParam)函数中。
2.4.7 测试长连接的线程的实现如果成功登录网关,则创建接检测长连接的线程ActiveTestThread,该线程的具体实现在ActiveTestThread(LPVOID lpParameter)函数中。
2.4.8 发送信息在编辑框中输入内容后,单击发送按钮,输入发送至的号码,则完成消息的发送功能。
具体实现在OnBtnSend()函数中。
2.4.9 接收信息当有消息到来时会首先被存储到recvmsg表中,“读取”按钮被激活。
单击该按钮消息则显示在编辑框中。
具体实现在OnBtnRead()函数中。
2.4.10 保存信息清空编辑框显示的接收信息,保存到recvmsg表中。
具体实现在OnBtnSave()函数中。
2.4.11 删除信息从数据库中删除当前消息,具体实现在OnBtnDelete()函数中。
2.4.12 回复信息恢复当前读取的消息,具体实现在OnBtnReply函数中。
2.4.13 状态提示功能连接到数据库后,会显示接收、发送和未读取的消息的条数。
具体实现在DBConnect()函数中。
连接到网关后连接状态会显示为“已连接”,否则为“未连接”。
2.4.14 配置文件2.4.14.1 配置文件的设置在工程目录下创建一配置文件命名为IsmgCfg.ini。
在文件中保存登陆网关的验证信息和数据库的配置信息。
如下:[ISMGCONFIG]GatewayIp=127.0.0.1GatewayPort=7890SPID=901234SPNumber=01850SPPWD=123456ServiceCode=114[DA TEBASE]DBServerName=WWW-A23DC12C0F5\XIYANGDBUser=saDBPwd=saDBProvider=sqloledb.1DataBase=WFtest2.4.14.2 操作配置文件的类的实现在工程中添加CsysConfig类,在其成员函数LoadConfig()中实现读取配置文件中的数据。
3.功能演示1.启动网关服务器端模拟器、SQLServer2000和应用程序。
图9 启动SQLServer2000 图10 启动网关模拟器。
图11 启动应用程序2.单击“连接网关”按钮,连接到网关和数据库。
图12 图13图14 状态显示3.接收消息。
图15图16 单击“读取”图17 recvmsg接收到消息4.删除消息。
单击“删除”按钮图18 单击“确定”图19已删除5.发送消息。
图20 单击“发送”图21 单击“查找”图22 选中者的号码会显示在编辑框中图23 单击“确定图24 单击“确定””图26 sendmsg表图256.回复消息。
回复消息发送时省去了输入号码的过程。
代码如下:if(!m_breply) ////如果不是回复信息{CSendDlg senddlg;if(IDOK==senddlg.DoModal()){if(senddlg.m_sendto.GetLength()!=11){MessageBox("输入号码有误!");return;}elsem_sendto=senddlg.m_sendto;}elsereturn;}Else /////////////////回复信息m_sendto=m_from;7.断开网关和数据库。
图27 图284.总结在程序调试通过的那一刻,心中的欢喜使我完全忘却了之前写代码时遇到种种“莫名其妙”的错误时沮丧的心情。
现在想想那些已被我解决的问题,感觉好可笑,因为有些错误实在低级之至,可当时的自己却怎么也发现不了,总是在“痛苦”一阵后才茅塞顿开。
我想如果自己没能耐心的坐下来,静心的查找可能也不会柳暗花明。
感谢自己的定力啊。
哈哈!其实该程序所涉及的知识自己学得还是可以的,所以基本上也没去查什么资料,这为我节省了不少时间。
通过这次课程设计,我巩固了一些基本知识,比如说操作数据库的SQL语句,数据库的连接,全局变量的使用,静态函数的使用等等。