版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4.2 系统数据库设计4.2.1 数据库设计原则根据能耗远程监测系统的特性,设计能耗系统的数据库。数据库采用Oracle 10.2版本,通过PLSQL可视化工具访问数据库。数据库设计考虑能耗监测系统的特点,依据规范性、效率、可操作性等原则设计。数据库设计的基本原则是在系统总体信息方案的指导下,各个库应当为它所支持的管理目标服务,在设计数据库系统时,应当重点考虑以下几个因素:1、 数据库必须层次分明,布局合理。2、 数据库必须高度结构化,保证数据的结构化,规范化和标准化,这是建立数据库和进行信息交换的基础。数据结构的设计应该遵循国家标准和行业标准,尤其要重视编码的应用。3、 在设计数据库的时候,
2、一方而要尽可能地减小冗余度,减小存储空间的占用,降低数据一致性问题发生的可能性,另一方面,还要考虑适当的冗余,以提高运行速度和降低开发难度。4、 必须维护数据的正确性和一致性。在系统中,多个用户共享数据库,由于并发操作,可能影响数据的一致性。因此必须用“锁”等办法保证数据的一致性。5、 设定相应的安全机制,由于数据库的信息、对特定的用户有特定的保密要求,安全机制必不可少。4.2.2 数据表主要结构数据表根据业务需求设计了以下的表,主要包括:用户、权限表:用于存储用户信息,用户权限及其关联表。分项数据时、日、月数据表:用于存储计算生成的分项分时数据表。测点数据时、日、月数据表:用于存储计算生成的
3、测点分时数据表。测点原始数据表:用于存储报文解析后的测点原始读数表。测点实时数据表:用于存储近期测点原始读数表,数据量较少,读数效率高,同时为二次计算提供数据。建筑信息表:用于存储建筑基本资料信息。测点、采集器、端口信息表:用于存储与采集器匹配的采集信息数据表。日志表:用于记录操作日志数据表。其数据表结构图如图4-8所示。4.2.3 数据表详细设计能耗远程监测系统主要数据表详细设计如下:1. T_D_User:用户数据表详细设计如表4-1所示:表4-1 用户数据表Table.4-1 User data字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKName用户名nvar
4、char(200)否Pass密码nvarchar(200)否CreateTime创建日期datetimeIsUsed是否启用nvarchar(200)2. T_D_Role:权限描述表详细设计如表4-2所示:表4-2 权限描述表Table.4-2 Permission description字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKRoleCode权限代码nvarchar(200)否RoleDes权限描述nvarchar(200)否3. T_D_User:用户权限关联表详细设计如表4-3所示:表4-3 用户权限关联表Table.4-3 User Rights As
5、sociation字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKUserId用户关联IDinteger否RoleId权限关联IDinteger否4. T_D_FlfxHour:分类分项数据表(时、日、月)详细设计如表4-4所示:表4-4 用户权限关联表Table.4-4 Classified sub item data字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKDian电nvarchar(50)总电能DZmczyd照明插座用电_1nvarchar(50)分项能耗DKtyd空调用电_2nvarchar(50)分项能耗DDlyd动力用电_3nv
6、archar(50)分项能耗DTsyd特殊用电_4nvarchar(50)分项能耗DDZmcz照明插座_1_1nvarchar(50)分项能耗DDZlyj走廊应急_1_2nvarchar(50)分项能耗DDSwzm室外照明_1_3nvarchar(50)分项能耗DDLrz冷热站_2_1nvarchar(50)分项能耗DDKtmd空调末端_2_2nvarchar(50)分项能耗DDDLdb冷冻泵_2_1_1nvarchar(50)分项能耗DDDLqb冷却泵_2_1_2nvarchar(50)分项能耗DDDLj冷机_2_1_3nvarchar(50)分项能耗DDDLt冷塔_2_1_4nvarcha
7、r(50)分项能耗DDDRsxhb热水循环泵_2_1_5nvarchar(50)分项能耗DDDDgl电锅炉_2_2_1nvarchar(50)分项能耗DDDKqjz空气机组_2_2_2nvarchar(50)分项能耗DDDXfjz新风机组_2_2_3nvarchar(50)分项能耗DDDPfjz排风机组_2_2_4nvarchar(50)分项能耗DDDFjpg风机盘管_2_2_5nvarchar(50)分项能耗DDDFtkt分体空调_2_2_6nvarchar(50)分项能耗DDDt电梯_3_1nvarchar(50)分项能耗DDSb水泵_3_2nvarchar(50)分项能耗DDXxzx信息
8、中心_4_1nvarchar(50)分项能耗DDXyf洗衣房_4_2nvarchar(50)分项能耗DDCfct厨房餐厅_4_3nvarchar(50)分项能耗DDYyc游泳池_4_4nvarchar(50)分项能耗DDJsf健身房_4_5nvarchar(50)分项能耗DDQt其他_4_6nvarchar(50)分项能耗Shui水nvarchar(50)分类能耗Gdrq管道燃气nvarchar(50)分类能耗Jzgrl集中供热量nvarchar(50)分类能耗Jzgll集中供冷量nvarchar(50)分类能耗Mei煤nvarchar(50)分类能耗Qtny其他能源nvarchar(50)分
9、类能耗Yhsyq液化石油气nvarchar(50)分类能耗Rgmq人工煤气nvarchar(50)分类能耗QiYou汽油nvarchar(50)分类能耗MeiYou煤油nvarchar(50)分类能耗ChaiYou柴油nvarchar(50)分类能耗Kzszy可再生能源nvarchar(50)分类能耗CreateTime时间datatime分类能耗BuildId建筑IDnvarchar(50)建筑关联ID5. T_D_BuildInfo:建筑基础信息表详细设计如表4-5所示:表4-5 建筑基本信息表Table.4-5 Building basic information字段名中文描述数据类型是
10、否为空键码备注Id自增长IDinteger否PKBuildId建筑代码nvarchar(50)否BUILDNAME建筑名称nvarchar(200)否BUILDOWNER建筑业主nvarchar(200)DISTRICTCODE所属行政区划nvarchar(200)ISSTANDARD是否标杆建筑nvarchar(200)BUILDYEAR建设年代nvarchar(200)BUILDFUNC建筑功能nvarchar(200)TOTALAREA建筑总面积nvarchar(200)UPFLOOR地上建筑层数nvarchar(200)DOWNFLOOR地下建筑层数nvarchar(200)AIRAR
11、EA空调面积nvarchar(200)HEATAREA采暖面积nvarchar(200)AIRTYPE空调系统形式nvarchar(200)HEATTYPE采暖系统形式nvarchar(200)BODYCOEF建筑体型系数nvarchar(200)STRUTYPE建筑结构形式nvarchar(200)WALLMATTYPE外墙材料形式nvarchar(200)WALLWARMTYPE外墙保温形式nvarchar(200)WALLWINTYPE建筑外窗类型nvarchar(200)GLASSTYPE建筑玻璃类型nvarchar(200)WINFRAMETYPE窗框材料类型nvarchar(200
12、)WORKDEPT工程施工单位nvarchar(200)DESIGNDEPT方案设计单位nvarchar(200)MONITORDATE施工日期datetimeACCEPTDATE竣工日期datetime6. T_D_Function:测点基础信息表详细设计如表4-6所示:表4-6 测点基础信息表Table.4-6 Basic information of measurement points字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKFunctionId测点IDnvarchar(200)否Type能源类型nvarchar(200)Adress地址描述nvarcha
13、r(200)BuildId所属建筑nvarchar(200)GatewayId所属采集器nvarchar(200)MeterId所属端口nvarchar(200)Unit测量单位nvarchar(200)FunctionName测点名称nvarchar(200)7. T_D_FunctionValue:测点原始(实时)数据表详细设计如表4-7所示:表4-7 测点原始数据表Table.4-7 Measuring point raw data字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKFunctionId测点IDnvarchar(200)否Value测点值nvarcha
14、r(100)否CreateTime数据日期datetimeErrorCode错误编码nvarchar(50)8. T_D_FunctionValueHour:测点分时数据表(时、日、月) 详细设计如表4-8所示:表4-8 测点分时数据表Table.4-8 Time measurement data字段名中文描述数据类型是否为空键码备注Id自增长IDinteger否PKFunctionId测点IDnvarchar(200)否FunctionValue测点分时值nvarchar(100)否CreateTime生成时间datetime否4.3 核心功能设计4.3.1 数据接入解析设计数据接入解析是将
15、能耗数据采集器通过网络传输的报文接入服务器,对于能耗远程监测系统的数据存储包含报文原始数据和业务数据的存储。原始报文为报文发送的内容,将报文保存为txt落地,以文件形式存储在服务器硬盘上。而业务数据为业务展示系统提供数据来源,该数据主要存储在Oracle中。对于两种数据,我们要考虑数据储存及读取的效率,数据的安全性。原始报文生成以后,系统根据时间+建筑编号命名生成txt文件,存在到硬盘。硬盘上建立文件夹,文件夹按年、月、日的日期名称生成文件夹,日文件夹下再自动生成每个小时的文件夹,原始报文根据时间存储在对应的文件夹下。根据时间分类存储可以让文件更有条理,查询起来更加便捷。另外服务器上安装文件备
16、份工具软件SmartCopy,定时将原始报文数据备份,软件会自动比较文件日期,当源文件日期比目标文件日期新则进行备份。当数据量随着时间的推移而不断增大,独立数据库无法满足系统要求时候,我们将采取分布式数据存储。分布式存储系统,是将数据通过多台分布的服务器进行存储。分布式网络存储系统采用可扩展的架构,利用多台存储服务器来分担存储工作压力,利用位置服务器分布架构存储数据,不但能够提高数据的存取效率、可靠性以及可用性,对于扩展性也十分有益。尽管数据存储方式是物理上是分布的,但是逻辑上是集中统一的。也就是说分布式数据是指数据信息和程序可以不需要部署在同一台服务器,可以分散到多台服务器上,与服务器的地理
17、位置无关,以网络上分散分布的信息数据及相关联的数据库操作为研究对象的一种理论计算模型。分部署数据库存储以不同地域不同网络的方式对数据存储,让数据通过架构达到共享、交换的目的。数据以某种特定的格式记录在计算机内部或外部存储设备上。数据接收方式为被动接收,采用网络协议技术实现,基于TCP/IP传输协议。其数据接收的流程图如图4-8所示: TCP/IP协议及Socket编程能耗数据接入服务以TCP/IP网络协议为基础,采用Socket编程开发。能耗数据接入服务部署在服务器上,开放约定的端口,提供网络地址给数据采集终端,用于接收报文数据。Tcp/Ip协议是应用于网络上的一种通讯方式协议,
18、具体在互联网上传输的快速性、准确性。该网络协议从分层模型来说可以分为四层:网络接口层,网络层,传输层,应用层。应用层:应用程序通过这一层来访问网络。能够想用户提供常用的应用程序,例如电子邮件系统,文件传输访问,远程登录访问等。应用层协议主要包括如下几个:FTP、TELNET、DNS、SMTP、NFS、HTTP。FTP(File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。HTTP(Hypertext Transfer Protocol)是超
19、文本传输协议,用于实现互联网中的WWW服务,使用端口80。传输层:提供两台主机之间的应用程序的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现可靠传输,传输层协议规定接收端必须发回确认,假如分组丢失,则必须重新发送,即耳熟能详的“三次握手”过程,从而提供可靠的数据传输。传输层协议包括两种,传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram protocol)。UDP对于可靠性不保证,不能保证数据准确的传输到达目的地,而TCP则是可靠的传输,应用也非常广泛。网络层:负责相邻计算机之间的通信。该层包括IP(
20、Internet Protocol)协议、ICMP(Internet Control Message Protocol)控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向地址转换协议。IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。网络接口层:模型的基层是网络接口层,又称为数据链路层,是负责IP数据包的接收与发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。Socke通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socke编程大部分都是使用系统提供的
21、API接口进行交互。Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。(3)连接确认:是指当服务
22、器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 能耗数据报文协议能耗监测系统定义了数据报文协议。协议用于能耗数据采集器与监测中心的数据接入解析服务之间的数据格式约定。为确保能耗数据的机密性,对报文设计了数据加密。加密方式主要通过AES加密,以及身份认证及MD5密钥等算法,加密的流程如图所示4-9所示。其具体加密过程如下:(1)TCP连接建立成功后,能耗监测及分项计量系统将本地存储的认证密
23、钥计算后MD5值和自身ECC算法公钥发送给数据中心,请求身份认证。(2) 数据中心将收到的MD5值和本地计算结果相比较,如果一致则认证成功,否则认证失败。(3)认证成功后,生成新的身份认证密钥和加密能源计量数据AES算法密钥,使用能耗监测及分项计量系统ECC算法公钥加密后传。输到能源计量系统。(4)能耗监测及分项计量系统使用ECC私钥算法解密身份认证密钥和AES算法密钥。更新本地身份认证密钥,并向数据中心发送身份认证密钥更新成功信息。(5)数据中心更新本地身份认证密钥信息,完成后向能耗监测及分项计量系统确认。(6)能耗监测及分项计量系统使用AES算法加密能源计量数据后传输。(7)数据中心使用A
24、ES算法解密能源计量数据。能耗数据传输协议设计规范主要包括:包体格式、身份认证、远程传输包等。其主要协议的具体设计如以下表。表4-8 能耗数据报文包体格式表Table.4-8 Energy consumption data packet format项目长度定义说明包头4字节0x68 0x68 0x16 0x16代表当前数据包中的“有效数据”的长度。有效数据总长度4字节“有效数据”为数据包的实体内容有效数据N字节(M+4)只对“有效数据”进行CRC 校验CRC 校验4字节0x55 0xAA 0x55 0xAA表4-9 身份认证数据包表Table.4-9 Identity authenticat
25、ion指令内容Type元素格说明采集器请求身份验Request元素名称:id_validate数据中心发送一串随机序列Sequence采集器发送计算的MD5Md5数据中心发送验证结果result表4-10 远程传输包表Table.4-10 Remote transmission packet指令内容Type元素格说明数据中心查询数据采集器query元素名称:data采集器对数据中心查询的应答reply采集器定时上报的能耗数据report采集器断点续传的能耗数据continuous全部续传数据包接收完成后,数据中心对断点续传的应答continuous_ack4.3.2 能耗数据计算设计能耗数据计
26、算是将已经存入Oracle数据库的测点原始数据,进行二次加工,生成小时、日、月、平均等以供直观分析的数据。能耗数据计算同样部署为windows系统服务,设置定时触发生成业务数据。能耗数据计算服务是由于在前端调用数据库数据时,由于直接读取原始数据,再实时计算的效率非常低下,从而设计了能耗数据计算服务。能耗数据计算服务的主要任务是定时将需要复杂计算的数据提前计算好,生成保存到对应的数据表中,提供给前端直接调用,从而达到大大减少前端数据压力的目的。能耗数据计算主要包括:测点分时计算、能耗分项分时数据计算。其中分时为小时、日、月的综合数据。测点分时计算相对单一,针对某测点,将该小时最后的数据减去上小时
27、最后的数据,形成该测点的小时能耗统计。对于日度和月度数据的统计计算同理。能耗分项分时数据计算,将所有测点该小时最后的数据取出来,再进行类别判断,将同类的相加,分别减去上小时同类的相加,然后将不同类别的数据分别对应存储数据表对应的字段,形成该小时的能耗分项分时数据。由于测点和类别都较多,所以实现的时候,一定要注意代码的可靠性。4.3.3 数据库访问设计数据库访问Oracle数据库,通过oracleclient访问。Oracle开发调试工具安装PLSQL,配置Oracle连接服务,用于可视化调试数据库。使用A访问数据库,引用System.Data.OracleClient.dll文件。这是.NET
28、forOracle组件的核心文件。使用时,开发人员可以通过安装oracle_net.msi来使用.NETforOracle组件,这时系统会将此组件作为一个系统默认的组件来使用,NETforOracle组件中用于组织类和其他类型的名字空间是System.Data.OracleClient。在此名字空间中,主要包含四个核心类,它们分别是:OracleConnection、OracleCommand、OracleDataReader、OracleDataAdapter。其数据库访问连接语句通过Web.config文件配置。数据库设计模式采用工厂模式,工厂模式能够很好的支持程序对不同数据库的访问,提高
29、程序的扩展性和代码的复用性。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。4.3.4 WEB界面展现设计能耗数据监测中心平台业务展示系统基于A平台开发设计,系统设计为B/S模式,运
30、行在WEB浏览器中,系统采用A经典三层架构设计。三层架构分别为:数据访问层(DAL),业务逻辑层(BLL),界面展示层(WEB)。其中DAL层负责直接与数据库交互,对数据库进行增删改查的操作,不涉及到业务层面,该层封装了数据库连接、数据库事物、存储过程调用及基础数据库操作等各种类库方法,为上层提供便捷的接口。而且模块独立,具有很好的复用性。BLL层结合了系统的业务,将逻辑程序编写在该层。该层起到承上启下的作用,对下与DAL交互,调用DAL的方法;对上与WEB层交互,为界面层提供数据。而WEB层则直接面对用户,人机交互来源此层,又称为UI层。对于现在的软件来说,UI显得极为重要,UI需要考虑操作
31、的人性化,界面的美观,展示的流畅度等。本系统UI层基于jQuery的框架设计。jQuery是当今世界上最为流行的JavaScrpit框架,提供了丰富的UI操作方法,jQuery的语法设计可以使开发者更加便捷。更重要的是jQuery对浏览器的兼容性做的很好,对于开发人员来说,基于jQuery框架开发,不用过度的考虑浏览器兼容性问题。对于B/S架构的系统,随着近年来浏览器的群雄割据,导致要兼容各个浏览器则显得非常的麻烦,大大增加了很多工作量,而采用jQuery框架,则在框架中已经将这些问题都解决了,极大的提高了开发效率。本系统前端的图表及列表等展示控件多采用基于jQuery封装的控件,例如:jQu
32、ery UI,jQuery axja, highchart等。第五章 系统实现与应用测试5.1 能耗数据接入解析计算实现过程5.1.1 能耗数据接入服务实现能耗数据接入服务采用的平台开发,.net已经封装了大量的socket的类库以供使用。在.net下网络编程主要的的类是System.Net.Sockets.Socket类,这个类提供了丰富的方法和属性,并且还提供了异步数据传输支持。类库中本文基于的使用的主要方法如下:public Socket Accept ():创建一个新的连接。 public void Bind (EndPoint localEP):让Socket 与本地终结点关联绑定。
33、 public void Close ():关闭 Socket 连接并释放所有使用的资源。public void Connect (EndPoint remoteEP):连接远程主机。public void Disconnect (bool reuseSocket):关闭当前连接。 public void Listen (int backlog):监听状态事件。 public int Receive (byte buffer):接收socket发送的数据内容。public int ReceiveFrom (byte buffer,ref EndPoint remoteEP):存储来源终点,接收
34、数据。public int Send (byte buffer):发送数据给socket。public void SendFile (string fileName):发送文件到socket连接。public int SendTo (byte buffer,EndPoint remoteEP):发送数据给指定的终结点。public void Shutdown (SocketShutdown how):禁止某连接上的数据通信。能耗监测系统实现一个服务器端的面向连接的Socket用于接收客户端的请求过程,有如下步骤:(1)首先根据IP地址和端口号实例化出一个Socket,注意端口要符合标准,大于1
35、024并且不要使用约定的系统特殊端口号,之所以大于1024是因为1024以下的端口号已经被系统使用了,而1433、1521、3306这样的端口号已经被许多知名大型应用:SQL Server、Oralce、MySQL的作为默认端口号,若指定为这些端口号,则容易发生端口冲突,而导致系统错误。(3)紧接着调用Bind()方法开始绑定,然后再调用Listen()方法启动监听,Listen()方法的参数用于设置监听的队列大小,也就是最多可接收的等待传入连接数目。(4)随后再调用Accept()方法,调用该方法之后,会将程序置于等待状态,等待客户端的连接。当有客户端连接桑以后,改方法会返回一个新的Sock
36、et实例,通过这个Socket实例与客户端开始通信。(5)使用Accept()方法返回的Socket实例中Send()方法,可以向客户端发送数据,还可以使用这个Socket实例中Receive()接收客户端的数据。(6)最后终止与客户端会话时,记得要使用ShutDown()方法将Socket连接关闭,并且调用Close()方法,将所有占用的资源释放。尽管平台提供了丰富的类库方法供我们使用,但是对于接入的效率,吞吐量等并没有完善的设计,我们在设计的时候,自然要考虑到这些问题,而这些问题往往会耗费我们大量的时间和精力,需要考虑多方面的因素和程序编写的逻辑性,而我们更希望把研究的重点放在监测上,而市
37、面上有很多开源的封装好的程序TCP协议的编程框架,我们只需要了解其原理,直接引用其类库,调用类库暴露的方法即可。这不仅为系统解决了许多精力,而且成熟的框架比我们自身去研究开发一套框架会更稳定,我们要做的是需要熟悉这套框架,并能够灵活的运用它。目前市面上比较流行的基于C#的TCP框架有EMTASS、ZYSocketSuper、Beetle、SuperSocket。经过综合分析,对这些框架做了一些了解,系统采用Beetle的框架。Beetle.Express是Beetle相应的免费版Tcp通讯组件,Beetle.Express提供基础的TCP通讯封装,在TCP吞吐上有着出色的性能.组件是通过队列的
38、方式处理控制TCP数据的发送和接收,在发送数据的时候你只关心操作即可,不必关心不停地调用发送方法会不会导致缓存区益出的情况。组件还提供了用于管理连接接入,断开和数据接收等事件,使开发人员对于连接的管理更方便。在网络吞吐能力方面组件继承了beetle出色的处理能力。在一台E1230V的PC上5000个长连接,每秒处理5W的请求应答其CPU使用率不到10%。Beetle框架使用十分简单,第一步在App.Config文件中配置服务端的监听信息。其主要内容为:<configSections> <section name="serverSection" type=&
39、quot;Beetle.Express.ServerSection, Beetle.Express"/></configSections><serverSection host="" port="8088" handler="HelloWorld.Program,HelloWorld"/>其中port为服务器开设的端口,handler根据实际情况填写项目的命名空间和类名。配置完毕以后,打开入口文件,在其中编写如下代码:class Program:IServerHandler public voi
40、d Connect(IServer server, ChannelConnectEventArgs e) Console.WriteLine("0 connected 1", e.Channel.EndPoint,server.Name); public void Disposed(IServer server, ChannelEventArgs e) Console.WriteLine("0 disposed", e.Channel.EndPoint); public void Error(IServer server, ErrorEventArgs
41、e) Console.WriteLine("0 error:1", e.Channel.EndPoint, e.Error.Message); public void Receive(IServer server, ChannelReceiveEventArgs e) string command = e.Data.ToString(Encoding.UTF8); Console.WriteLine("receive:0t1",command,server.Name); Data data = new Data(64); data.Write(serve
42、r.Name, Encoding.UTF8); server.Send(data, e.Channel); public void SendCompleted(IServer server, ChannelSendEventArgs e) 这里是框架的核心方法,是Beetle框架必须实现的接口,按照以上代码编写实现类库里的接口。其中:Connect为连接创建处理过程的实现;Disposed为连接断开处理过程的方法实现;Error为错误处理过程的方法实现;Receive为数据接收处理过程,此方法为处理解析数据的核心方法,在这个方法里,我们需要调用到后面的解析的入口方法,开辟多个线程处理数据;Se
43、ndCompleted为数据发送情况处理过程;以上是实现一个网络处理服务,对以上代码来说可以是一个TCP服务也可以是一个UDP服务。由于IServerHandler统一管理服务处理,因此这个实现是TCP或UDP服务取决于ServerFactory加载的配置信息。实际上可以N个TCP服务和UDP服务同时绑定到该Handler上。通过Beetle.Express可以非常方便就能构建TCP和UDP服务,而在购建的过程是完全不需要关心Socket相关细节,对于连接的处理和数据收发的细节对使用者来说都是完全透明的。组件还提供了基于LRU算法的连接清除对象,可以更方便地控制连接资源。能耗数据接入服务通过B
44、eetle.Express开发实现后,通过windows服务部署,设置监听接收端口,开启数据接入服务的工作。如图5-1所示。5.1.2 能耗数据解析实现能耗数据解析是将已经接入的报文,按照约定的格式进行解析,然后存储进入对应的数据表中。前面章节我们已经介绍过报文的主体格式,下面代码则是报文中有效数据正文的明文内容,采用XML标记语言编写,XML是一种可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。具体的明文如下:<?xml version="1.0" encoding="utf-8" ?><roo
45、t><common><building_id><!- 楼栋编号-></building_id><gateway_id><!- 采集器编号-></gateway_id><type>report</type></common><data operation="report"><sequence><!- 采集器向数据中心发送数据的序号-></sequence><parse><!-yes: 向
46、数据中心发送的数据经过采集器解析;no: 向数据中心发送的数据未经过采集器解析;-></parse><time><!- 数据采集时间-></time><!- 计量装置信息, 一个或多个 meter元素属性: id: 计量装置的数据采集功能编号 -><meter id="1" ><!-计量装置的具体采集功能,一个或多个function元素属性:id: 计量装置的具体采集功能编号coding: 能耗数据分类/分项编号error: 该功能出现错误的状态码,0表示没有错误-><funct
47、ion id="1" coding="abc" error="0" > <!- 具体数据-></function></meter></data></root>如上述代码所示,在XML前部定义了建筑编号、采集器编号、数据类型和时间。在XML中间数据内容区为测点的具体标号和数值,以及错误编码。<function id="1" coding="abc" error="0" >,其中function即为具体
48、的测点,唯一编号为ID,coding为能耗类别,error为错误编码。测点的编号在数据库中,通过数据配置功能事先录入配置完毕,在数据解析时,查询数据库看测点的编号是否一致,如果一致则进行下一步解析,如果不一致则忽略。错误编码0和192代表正确,其他值则为错误信号,采集的数据需要存储异常数据。A封装了解析XML标记语言的类库,本系统利用A中DataSet的ReadXml读取XML文件。其解析实现的核心方法代码如下:public void JieXi() XmlDocument configXml = new XmlDocument(); string fileNames = Directory.
49、GetFiles(xmlPath); foreach (string file in fileNames) try string houZhui = Path.GetExtension(file); if (houZhui = ".xml") DataSet ds = new DataSet(); ds.ReadXml(file); if (ds.Tables.Count > 0) string buildId = ds.Tables"common".Rows0"building_id".ToString(); string g
50、atewayId = ds.Tables"common".Rows0"gateway_id".ToString(); string time = ds.Tables"data".Rows0"time".ToString(); DateTime getTime = DateTime.ParseExact(time, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); DataTable meterDt = ds.Tables"meter" DataTable fun
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东省南方医科大学珠江医院三水医院第二批合同制工作人员招聘26人备考题库附参考答案详解(典型题)
- 2026湖南新五丰股份有限公司兽医管理岗招聘1人备考题库【真题汇编】附答案详解
- 2026北京大学艺术学院招聘劳动合同制人员1人备考题库重点附答案详解
- 2026四川天府永兴实验室上半年度实习生招聘备考题库往年题考附答案详解
- 2026广东佛山市顺德区乐从第一实验学校(教务文员)招聘1人备考题库及参考答案详解(b卷)
- 2026浙江事业单位统考丽水市松阳县招聘39人备考题库及完整答案详解【历年真题】
- 2026浙江温州市残疾人康复服务指导中心招聘编外康复教师2人备考题库附完整答案详解(考点梳理)
- 2026广东梅州市人民医院第2批招聘43人备考题库(预热题)附答案详解
- 2026江西赣州市全南县公用市政建设集团有限公司招聘1人备考题库【名师系列】附答案详解
- 2026内蒙古呼和浩特市玉泉区桃花乡卫生院招聘1人备考题库【预热题】附答案详解
- Q-JJJ 9002-2025 铁路建设项目安全穿透式管理实施指南
- 公共区域活动管理办法
- 2024湘教版七年级地理下册知识点清单
- 护理岗位职责及工作流程
- 高三二轮复习生物种群群落生态系统微专题课件
- 内蒙古鄂尔多斯市基础建设有限公司招聘笔试题库2025
- 2025年中考数学压轴专题汇编(江苏专用)压轴专题09定角定高模型(原卷版+解析)
- 2024年江苏省高中学生英语口语等级测试试卷(模拟试卷)
- 教学课件-积极心理学(第2版)刘翔平
- 包钢集团笔试题库2025
- 2025党支部班子成员问题清单及整改措施
评论
0/150
提交评论