论文部分内容阅读
摘要本文主要论述了远程水位监测系统的通信帧的格式。以及对不同的通信帧的发送和接收的不同处理。水库水位监测系统软件作为客户端,远程测控系统作为服务器端,通过网络传递信息,通过WinSock来实现网络之间的链接和数据交换。
关键词水位监测系统 通信帧 类 数据通信
中图分类号:TP39文献标识码:A
1 通信帧的格式
Windows MFC(Microsoft Foundation Class)将有关SOCKET的操作封装到一个类——Csocket中。我们在进行网络通讯时,又从Csocket中派生另外两个类,CClientSocket和ClientSocket,在类中定义了一个区分标志位flag。
客户端的行为封装在类CclientSocket中,在其中针对不同的信息帧定义了不同的发送函数和接收函数,因此,在水库监测系统软件(客户端)中,进行数据通信时,只需调用函数:收信息帧函数和发信息帧函数。而且,为了保持模块的独立性,我们将有关信息帧封装到一个类CMsg中下面我们要对帧的格式加以描述。当进行水库水位的远程测量时发送通信帧的格式如下:
接受通信帧的格式如下:
各个变量的含义为:
int flag;//套接字的值(区分标志位)
BOOL m_bClose; //套接字是否关闭
Int m_strTableName;//测量数据写入到数据库的表中(用m_strTableName的整数值代表)
Cstring m_strSendText;//发送的字符串
Cstring m_strText;//接收字符串
int single发送的信息帧是字符类型还是数据类型
float bufferSend[40];//发送测量数据的缓冲区
2 通信帧的类型
根据各个标志位具体值的不同,通信帧的共有二种不同的类型:字符类型、数据类型。针对不同的信息帧都有不同的发送函数。字符类型通信帧又可分为关闭型和非关闭型,通信的信息都是字符串。
数据类型通信帧包含的信息是一组数据。当服务器端和客户端连接成功时,客户端向服务器度端发出一个非关闭型字符型信息帧,通知对方连接成功。在测量水库水位时,每测量完一个测量点,将测得的数据转换为字符型,通过一个字符型通信帧发向服务器端,并在服务器端显示出来,以达到实时性显示的要求。在巡测水库水位时,即对水库的各个断面的测量点都测完,并存储到本地数据文件中读出到缓冲区中,用发送消息帧函数发出。
3 服务器端和客户端通信的实现
有关帧的格式及其初始化封装在类CMsg中。类CMsg的声明如下:
class CMsg :public Cobject
{protected:
DECLARE_DYNCREATE(CMsg)
public:
CMsg();
//Attributes
public:
Cstring m_strSendText;// 发送的字符串
Cstring m_strText;// 接收字符串
int m_strTableName;// 测量数据写入到数据库的表中(用m_strTableName的整数值代表)
float bufferSend[40];// 发送测量数据的缓冲区
int flag;// 套接字的值(区分标志位)
BOOL m_bClose;// 套接字是否关闭
int single;//该信息包
//Operations
public:
void init();
//Implementation
public:
Void initXunceMessage(Cstring &message);
Void initExitMessage(Cstring &message);//初始化字符型(关闭)信息帧
Void initComMessage(Cstring &message);// 初始化字符型信息帧
Virtual~ CMsg();
Virtual void Serialize(Carhive&ar);//与进行交互:序列化/反序列化
};
其中有四个初始化帧的函数:
void init();//初始化数据型信息帧
Void initXunceMessage(Cstring &message);// 初始化字符型(单个测量点)信息帧
Void initExitMessage(Cstring &message);// 初始化字符型(关闭)信息帧
Void initComMessage(Cstring &message);// 初始化字符型信息帧
序列化函数通过重载操作符“<<”和“>>”是将一系列CMsg()成员变量变成字节流(序列化Serialize)或者由字符流合成CMsg()成员变量(反序列化Serialize),字节流在档案类Carchive中,Carchive类相当于Socket文件的CsockeFile的缓冲区。
在与CMsg()中与四个初始化信息帧函数相对应,在类的成员函数中定义了四个发送信息帧函数和一个接收信息帧函数。
接收信息帧函数:void ReceiveMsg(CMsg*pMsg);
发送信息帧函数:void SendinitMsg();
VoidSendXunceMessage(Cstring &message);
VoidSendExitMessage(Cstring &message);
VoidSendComMessage(Cstring &message);
4 查询、巡测、选测、部分选测功能
客户端程序中,为了方便用户对以前的测量结果进行查询,将每次测得的数据和时间存储到数据文件和索引文件中。为此定义了索引文件中的数据结构:
Struct TestResultStruct
{time_t time;
LONG Address;}
其中,成员变量time用来存储测量的时间,存储每次测量的数据存储在数据文件中的地址。根据此地址读取数据。
水库共有9个断面,每个断面包括多个测量点,为了表示多个断面及断面中的测量点,在类中定义了属性成员:
CStringArray WellName;
CObArray WellNameInDuanMian;
CObArray Results;
CObArray ViewSomeOne;
CObArray ViewTestResult;
其中,WellName存放所有测量点的名字,WellNameInDuanMian存放每个断面的测量点,Results存放测量结果,后面两个属性成员当进行查询时调用,ViewTestResult用来存放从前测量的时间和数据地址,ViewSomeOne存放要查询的数据,若程序中需要用到某个断面或测量点,只需给出其数组的下标值即可。
为了实现巡测、选测、部分选测功能,将单个测量点作为测量单位。每测量一个测量点,调用一次测量函数:Void CmeasureDoc::measure(intn);其中,形参n是要测量的测量点的数字号。这样可以灵活地设置测量的方式,实现测量的多种功能。测量的数据通过调用函数Void CmeasureDoc::measure(int n);将结果存入Results中。这样,使用巡测、选测、部分选测功能时,只需调用该函数修改Results的值即可。
关键词水位监测系统 通信帧 类 数据通信
中图分类号:TP39文献标识码:A
1 通信帧的格式
Windows MFC(Microsoft Foundation Class)将有关SOCKET的操作封装到一个类——Csocket中。我们在进行网络通讯时,又从Csocket中派生另外两个类,CClientSocket和ClientSocket,在类中定义了一个区分标志位flag。
客户端的行为封装在类CclientSocket中,在其中针对不同的信息帧定义了不同的发送函数和接收函数,因此,在水库监测系统软件(客户端)中,进行数据通信时,只需调用函数:收信息帧函数和发信息帧函数。而且,为了保持模块的独立性,我们将有关信息帧封装到一个类CMsg中下面我们要对帧的格式加以描述。当进行水库水位的远程测量时发送通信帧的格式如下:
接受通信帧的格式如下:
各个变量的含义为:
int flag;//套接字的值(区分标志位)
BOOL m_bClose; //套接字是否关闭
Int m_strTableName;//测量数据写入到数据库的表中(用m_strTableName的整数值代表)
Cstring m_strSendText;//发送的字符串
Cstring m_strText;//接收字符串
int single发送的信息帧是字符类型还是数据类型
float bufferSend[40];//发送测量数据的缓冲区
2 通信帧的类型
根据各个标志位具体值的不同,通信帧的共有二种不同的类型:字符类型、数据类型。针对不同的信息帧都有不同的发送函数。字符类型通信帧又可分为关闭型和非关闭型,通信的信息都是字符串。
数据类型通信帧包含的信息是一组数据。当服务器端和客户端连接成功时,客户端向服务器度端发出一个非关闭型字符型信息帧,通知对方连接成功。在测量水库水位时,每测量完一个测量点,将测得的数据转换为字符型,通过一个字符型通信帧发向服务器端,并在服务器端显示出来,以达到实时性显示的要求。在巡测水库水位时,即对水库的各个断面的测量点都测完,并存储到本地数据文件中读出到缓冲区中,用发送消息帧函数发出。
3 服务器端和客户端通信的实现
有关帧的格式及其初始化封装在类CMsg中。类CMsg的声明如下:
class CMsg :public Cobject
{protected:
DECLARE_DYNCREATE(CMsg)
public:
CMsg();
//Attributes
public:
Cstring m_strSendText;// 发送的字符串
Cstring m_strText;// 接收字符串
int m_strTableName;// 测量数据写入到数据库的表中(用m_strTableName的整数值代表)
float bufferSend[40];// 发送测量数据的缓冲区
int flag;// 套接字的值(区分标志位)
BOOL m_bClose;// 套接字是否关闭
int single;//该信息包
//Operations
public:
void init();
//Implementation
public:
Void initXunceMessage(Cstring &message);
Void initExitMessage(Cstring &message);//初始化字符型(关闭)信息帧
Void initComMessage(Cstring &message);// 初始化字符型信息帧
Virtual~ CMsg();
Virtual void Serialize(Carhive&ar);//与进行交互:序列化/反序列化
};
其中有四个初始化帧的函数:
void init();//初始化数据型信息帧
Void initXunceMessage(Cstring &message);// 初始化字符型(单个测量点)信息帧
Void initExitMessage(Cstring &message);// 初始化字符型(关闭)信息帧
Void initComMessage(Cstring &message);// 初始化字符型信息帧
序列化函数通过重载操作符“<<”和“>>”是将一系列CMsg()成员变量变成字节流(序列化Serialize)或者由字符流合成CMsg()成员变量(反序列化Serialize),字节流在档案类Carchive中,Carchive类相当于Socket文件的CsockeFile的缓冲区。
在与CMsg()中与四个初始化信息帧函数相对应,在类的成员函数中定义了四个发送信息帧函数和一个接收信息帧函数。
接收信息帧函数:void ReceiveMsg(CMsg*pMsg);
发送信息帧函数:void SendinitMsg();
VoidSendXunceMessage(Cstring &message);
VoidSendExitMessage(Cstring &message);
VoidSendComMessage(Cstring &message);
4 查询、巡测、选测、部分选测功能
客户端程序中,为了方便用户对以前的测量结果进行查询,将每次测得的数据和时间存储到数据文件和索引文件中。为此定义了索引文件中的数据结构:
Struct TestResultStruct
{time_t time;
LONG Address;}
其中,成员变量time用来存储测量的时间,存储每次测量的数据存储在数据文件中的地址。根据此地址读取数据。
水库共有9个断面,每个断面包括多个测量点,为了表示多个断面及断面中的测量点,在类中定义了属性成员:
CStringArray WellName;
CObArray WellNameInDuanMian;
CObArray Results;
CObArray ViewSomeOne;
CObArray ViewTestResult;
其中,WellName存放所有测量点的名字,WellNameInDuanMian存放每个断面的测量点,Results存放测量结果,后面两个属性成员当进行查询时调用,ViewTestResult用来存放从前测量的时间和数据地址,ViewSomeOne存放要查询的数据,若程序中需要用到某个断面或测量点,只需给出其数组的下标值即可。
为了实现巡测、选测、部分选测功能,将单个测量点作为测量单位。每测量一个测量点,调用一次测量函数:Void CmeasureDoc::measure(intn);其中,形参n是要测量的测量点的数字号。这样可以灵活地设置测量的方式,实现测量的多种功能。测量的数据通过调用函数Void CmeasureDoc::measure(int n);将结果存入Results中。这样,使用巡测、选测、部分选测功能时,只需调用该函数修改Results的值即可。