串口设备远程监控软件设计与实现(本科毕业论文)(编辑修改稿)内容摘要:
灵活性和效率但是 MFC 的封装很浅,所以效率上损失不大,灵活性还可以,虽然也有很多缺陷,但还是一个比较好的东西。 MFC 中最重要的封装是 对 Win32 API 的封装,因此,理解Windows Object 和 MFC Object (C++对象,一个 C++类的实例 )之间的关系是理解 MFC 的关键之一。 所谓 Windows Object( Windows对象)是 Win32下用句柄表示的 Windows 操作系统对象;所谓 MFC Object (MFC 对象 )是 C++对象,是一个 C++类的实例,这里(本书范围内) MFC Object 是有特定含义的,指封装 Windows Object的 C++ Object,并非指任意的 C++ Object。 MFC Object 和 Windows Object 是不一样的,但两者紧密联系。 本章小结 本章主要讲述了本课题在软硬件设计方面需要的基础知识,包括硬件方面串口联网服务器的原理及工作模式,以及硬件架构。 软件方面,介绍了编写程序时所需要的 VC++软件,及 MFC 框架。 能够为后面知识的学习提供基础的帮助。 郭一君:串口设备远程监控软件设计与实现 13 第三章 串口联网服务器通讯底层 通信底层设计 串口联网软件底层以其硬件架构为基础。 控制网络的架构采用 C/S 模式架构。 其中串口服务器运行 TCP Server 端, PC 监控终端则设计为 TCP Client 端。 每一台连接到串口服务器上的串口设备,都具有固定的 IP及端口号。 运行在 PC的 Client监控终端,通过 Socket 与运行在串口服务器的 Server 端建立通信连接,进而控制串口设备。 如下图 51所示: 串 口 设 备 1T C P S e r v e r串 口 设 备 2串 口 设 备 n串 口 1串 口 2串 口 nT C P C l i e n t串 口 服 务 器 P C 监 控 终 端I n t e r n e t 图 01: 底层通信原理 连接到网络中的串口服务器,需要把串口服务器设置成 TCP Server 模式。 以康海时代 NC600 系列串口服务器为例,其设置步骤如下: 1) 用 IE 内核的浏览器登录串口 服务器的 IP 地址,进入设置主界面 2) 在串口配置项里面配置好响应设备串口的波特率灯参数。 3) 在工作模式中把对应的工作模式设置成 TCP Server 工作模式 4) 保存提交。 西安理工大学本科生毕业设计(论文) 14 MFC 中 TCP socket 编程 串口联网网络中,串口设备与 PC端监控软件的通信,主要通过 TCP socket套接字实现。 TCP为面向连接的一种网络连接方式,能够保证数据通信的安全性。 MFC 中对 socket 编程有很好的支持,这为物联网串口设备远程监控提供了便利。 TCP socket 基本原理 TCP socket 采用流式套接字进行网络连接。 流式套接字提供没有记录边界的数据流,即字节流。 字节流能确保以正确的顺序无重复地被送达。 其主要的编程模型如下: 创 建 并 初 始化 套 接 字监 听 来 自 客户 端 的 请 求接 受 连 接 请求接 收 数 据发 送 数 据关 闭 连 接请 求 建 立 连接发 送 数 据接 收 数 据关 闭 连 接创 建 并 初 始化 套 接 字服 务 器 客 户 机 图 02: 流式套接字编程模型 郭一君:串口设备远程监控软件设计与实现 15 在该模型中,服务器端创建并初始化套接字,监听来自客户端的连接请求。 客户端同样建立套接字, 用于向服务器端发起连接请求。 当服务器接收到来自客户机的连接请求后,与客户机建立连接。 连接成功后,则服务器和客户机可以 进行数据收发通信。 通信完成后,服务器和客户机关闭套接字。 基本 Windows Socket API Windows 操作系统提供了很多用于 Socket 通信的 API,可以很方便地开发 Socket 通信软件。 主要的 API 函数如下: 1) WSAStartup 调用 windows Socket DLL 函数原型 int WSAStartup( WORD wVersionRequested, // 应用程序要求的 sockets 版本 LPWSADATA lpWSAData //指向数据结构 WSDATA 的指针, //得到 windows Socket 的具体信息) ; WSDATA 定义如下: typedef struct WSAData { WORD wVersion。 WORD wHighVersion。 ifdef _WIN64 unsigned short iMaxSockets。 unsigned short iMaxUdpDg。 char FAR * lpVendorInfo。 char szDescription[WSADESCRIPTION_LEN+1]。 西安理工大学本科生毕业设计(论文) 16 char szSystemStatus[WSASYS_STATUS_LEN+1]。 else char szDescription[WSADESCRIPTION_LEN+1]。 char szSystemStatus[WSASYS_STATUS_LEN+1]。 unsigned short iMaxSockets。 unsigned short iMaxUdpDg。 char FAR * lpVendorInfo。 endif } WSADATA, FAR * LPWSADATA。 2) WSACleanup 结束对 Windows Sockets DLL 的调用 函数原型: int WSACleanup(void)。 3)socket 用于建立 Sockets。 函数原型: SOCKET socket( int af, // 地址族,一般是 AF_INET int type , //socket 类型, SOCK_STREAM 或 SOCK_DGRAM int protocol //协议类型,通常取值 0)。 4) closesocket 关闭套接字 函数原型: int closesocket( SOCKET s //要关闭的套接字 )。 5) bind 将一个本地地址和一个 SOCKET 描述字连接 郭一君:串口设备远程监控软件设计与实现 17 起来 函数原型: int bind( SOCKET s, // 要绑定的套接字 const struct sockaddr FAR* name, // 指向 SOCKADDR 结构的地址 int namelen // 地址结构的 sizeof) Tcp/ip SOCKADDR 的结构为 struct sockaddr{ unsigned short sa_family。 char sa_data[4]。 }。 struct sockaddr_in{ short sin_family。 unsigned short sin_port。 struct in_addr sin_addr。 char sin_zero[8]。 }。 6)listen 设定 socket 为监听状态 函数原型: int listen( SOCKET s, // 进行监听的 socket int backlog // 客户端可以连接的请求个数 )。 7) accept 接受一个 socket 的连接请求, 同时返回一个新的 socket ,新的 socket 用来在服务 西安理工大学本科生毕业设计(论文) 18 器与客户端之间传递和接收信息。 函数原型: SOCKET accept( SOCKET s, // 处于监听状态的 socket struct sockaddr FAR* addr, //将要接受地址的 sockaddr 指针 int FAR* addrlen //地址的长度 )。 8)connect 连接客户端的 socket 到指定的网络服务器。 连接成功后,客户端用此 socket 与服 务器通信。 函数原型: int connect( SOCKET s, // 将要连接的 socket const struct sockaddr FAR* name, // 目标 socket 地址 int namelen // 地址结构 sizeof )。 9)recv 用于接收已经建立连接的 socket 数据信息 函数原型: int recv( SOCKET s, char FAR* buf, //接收数据缓冲区 int len ,// 缓冲区长度 郭一君:串口设备远程监控软件设计与实现 19 int flags //有 MSG_PEEK 和 MSG_OOB )。 返回值:接收到的字节数 10) send 对已经建立连接的 socket 发送数据信息 函数原型: int send( SOCKET s, char FAR* buf, //发送数据缓冲区 int len ,// 缓冲区长度 int flags //有 MSG_PEEK 和 MSG_OOB )。 返回值:发送的字节数 11 ) WSAAsyncSelect 要求 socket 在有事件发生时通知使用者,本函数将套接口设置成为非 阻塞方式。 函数原型: int WSAAsyncSelect( SOCKET s, HWND hWnd, //接收网络事件的窗口句柄 unsigned int wMsg,//发送给窗口的网络事件消息 long lEvent //网络消息 )。 12) sendto 向目标地址发送数据信息 函数原型: 西安理工大学本科生毕业设计(论文) 20 int sendto( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen )。 13)recvfrom 接收目标地址传来的数据信息 函数原型: int recvfrom( IN SOCKET s, OUT char FAR * buf, IN int len, IN int flags, OUT struct sockaddr FAR * from, IN OUT int FAR * fromlen )。 MFC下的 Socket 编程类 MFC 提 供 了 两 个 类 用 以 支 持 套 接 字 编 程 , 它 们 是 CAsyncSocket 类和 CSocket 类。 1) CAsyncSocket 类 郭一君:串口设备远程监控软件设计与实现 21 CAsyncSocket 类一对一地封装 Windows Socket API。 CAsyncSocket 类适合哪些对网络通信细节很了解, 但希望利用回调的便利通知网络事件的程序员使用。 如果想利用 Windows Sockets 方便地处理 MFC 应用程序中的多个网络协议, 而又不想放弃灵活性, 可以考虑使用 CAsyncSocket。 CAsyncSocket 类是 MFC 在方便性与灵活性中的一种折衷方案。 它提供了一个类用以保留网络编程的灵活性,而方便性则由CSocket 类来提供。 2) CSocket 类 CSocket 类是 CAsyncSocket 类的派生类, 它致力于提供比 CAsyncSocket 类更高的抽象性,使得网络编程变得简单方便。 CSocket 类支持流方式和数据报方式,但一般情况下用的更多的是流方式的数据通信。 在流方式的通信模式下, CSocket 类通常会与 CArchive 类结合, 以串行化的方式发送和接收数据,这使得网络编程变得像读写文件一样简单了。 CArchive 类扮演的是一个数据缓 冲区的角色,它通过 CSocketFile 类与一个套接字相联系。 只要建立了两者的联系,然后往“数据缓冲区”装入数据与取出数据就完成了。 MFC 下 Socket编程基本步骤 sockets(套接字)编程有三种,流式套接字( SOCK_STREAM),数据报套接字( SOCK_DGRAM),原始套接字( SOCK_RAW);基于 TCP的 socket 编程是采用的流式套接字。 流式套接字。串口设备远程监控软件设计与实现(本科毕业论文)(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。