智慧养老系统中间件设计与实现第4章上.docx
- 文档编号:5236001
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:10
- 大小:161.67KB
智慧养老系统中间件设计与实现第4章上.docx
《智慧养老系统中间件设计与实现第4章上.docx》由会员分享,可在线阅读,更多相关《智慧养老系统中间件设计与实现第4章上.docx(10页珍藏版)》请在冰豆网上搜索。
智慧养老系统中间件设计与实现第4章上
第4章系统中间件详细设计与实现
在智慧养老系统中,为了实现系统各个部分的数据交互和业务处理,需要对系统中间件网络通信协议、数据库表、通讯I/O、数据库操作、进程间通信、数据处理、数据挖掘、日志记录等各个功能模块进行详细设计和实现。
4.1网络通信协议设计与实现
在智慧养老系统中,中间件部分需要与信息管理系统、手机App、感知层智能终端设备等进行通信,相互之间的数据传输主要是通过网络数据包的方式实现。
因此,网络通信协议的制定对于实现系统功能,提高系统效率是非常重要的。
4.1.1协议设计分析
在智慧养老系统中,数据通信采用基于TCP/IP协议的通信网络来实现,系统通信协议在TCP/IP应用层进行设计,在传输层选择TCP(TransmissionControlProtocol,传输控制协议)提供可靠的数据传输[31],以满足系统可靠性的需求。
在设计基于TCP的应用层协议时,通常采用基于XML(ExtensibleMarkupLanguage,可扩展标记语言)、JSON(JavaScriptObjectNotation,JS对象标记)、字符串和二进制结构体的方式[32]。
XML和JSON都是一种数据交换格式,使用结构化方法来标记数据,两者都具有很好的可读性和扩展性,不同点是XML具有更严格的格式,可解析的数据量更大,JSON则属于“轻量级”应用;结构体占用空间小,传输效率高,可以节省系统带宽资源,但是对通信双方具有严格的定义,处理过程更加复杂;字符串的方式使用灵活方便,在通信双方定义好通信协议后,发送方和接收方根据协议对发送和接收的数据进行解析,开发难度小,执行效率高。
本文中在设计数据帧时,使用结构体规范数据格式,在传输时,对结构体执行序列化操作,转换为JSON格式进行传输,以提高与智慧养老信息管理系统、手机App等之间的兼容性。
4.1.2数据帧设计
在TCP/IP模型中,网络互联层是以数据帧为单位传输数据的。
在实际应用中,发送方发送一帧,接收方可能需要N次才能读取完成,而且有可能读取到下一帧的数据。
针对上述问题,通常有两种处理方法:
基于终结符(Delimiter)和基于长度(Length)。
(1)基于终结符是使用如“\r\n”等作为终结符,其处理流程为:
读数据
在读取的数据中定位终结符
没找到,将读取数据缓存
继续读取,定位终结符
找到终结符,将终结符之前的数据作为一帧进行处理。
(2)基于长度是在帧前先发送帧的长度,一般使用固定长度的字节来发送,其处理流程为:
读取固定长度字节
解析出帧长
读取帧长字节
处理帧。
基于长度不需要每次读取都定位终结符,具有更高的执行效率,且本系统中不同业务数据的长度是已知的,因此本文选择基于长度的帧避免数据帧读取错误。
本文设计的数据帧分为消息帧和应答帧两种,消息帧是系统中间件接收到的消息或主动发到客户端的消息,应答帧是系统中间件或客户端返回的消息处理结果。
为了统一规范,消息帧和应答帧采用同样的帧结构,如图4.1所示:
图4.1数据帧结构图
帧结构的详细说明如下:
Structwp_packet
{
publicstringnSyn;//同步码
publicintnLen;//帧体长度(数据域)
publicstringnCmd;//命令码
publicstringpdata;//帧体数据域,长度可变
}
在系统中,下层数据网关将需要发送的消息按照帧结构体格式封装,对封装后的数据执行序列化操作,然后将序列化为JSON形式的数据发送到服务端中间件应用程序,中间件应用程序在接收到业务数据后将数据存储在Dictionary<[key],[value]>形式集合中,判断同步码是否符合系统定义,对不符合系统定义的数据抛弃,否则获取命令码和帧体长度,判断数据域数据长度是否与帧体长度相同,如果相同就按照系统协议对数据域数据进行规定的业务逻辑处理。
表4.1列出了系统中部分通信业务。
表4.1智慧养老系统部分通信业务
名称
命令码
描述
血压记录上传
BloodPressure
设备检测用户血压信息上传
血糖记录上传
BloodGlucose
设备检测用户血糖信息上传
网关实时状态
GW_Status
网关实时状态消息
文件上传
FileUpload
网络故障恢复或用户上传或下载文本数据
网关控制
GW_Control
信息管理系统对网关及网关连接设备的控制
用户信息查询
UserInfo
管理员或用户获取用户基本信息
健康百科查询
HealthEncyInfo
用户获取系统监控百科信息
4.2数据库设计与实现
数据库设计是在综合考虑系统应用场景的基础上,通过概念模型设计、物理结构设计等阶段,完成数据表结构的具体设计和优化,满足系统对数据的存储和操作需求。
本节主要完成智慧养老系统数据库表结构的设计和数据库操作模块的设计与实现。
4.2.1数据库表结构设计
本文使用MySQL数据库存储系统数据,在MySQL数据库中,数据是以表的形式进行存储的,因此根据系统应用需求合理设计数据库表结构是数据库设计的关键。
1.数据库概念模型设计
数据库概念模型设计主要是通过信息数据的方式,将现实事物中的关系和属性进行抽象和概括。
在本系统数据库设计中,通过概念模型设计,不仅可以直观的表达智慧养老系统数据的复杂结构,而且可以明确系统各个业务数据之间的联系。
结合智慧养老系统中间件应用程序功能需求和应用场景,本文设计系统的E-R(EntityRelationshipDiagram,实体关系模型)模型[33]如图4.2所示:
图4.2智慧养老系统数据库E-R图
2.数据库表设计
数据库表设计是对数据库进行物理结构设计,在设计中,通过转换E-R实体关系模型,结合系统特性,确定数据库存储类型,各个数据表的名称、属性、约束、默认值等信息。
在数据库表结构设计中,采用规范化的设计步骤构造数据库的关系模式,可以避免数据操作中插入、删除和更新时问题的产生,减少数据库中的冗余数据[34]。
本文数据库按照数据库设计范式[35]要求,结合系统E-R模型,对数据库表进行设计。
由于系统数据表较多且表结构设计方法相似,因此本文只列出部分使用频率较高的数据表,如表4.2所示:
表4.2智慧养老系统部分数据表信息
编号
数据库表名
数据库表描述
1
wps_user_info
存储用户基本信息
2
wps_gw_control
存储数据网关控制指令
表4.2智慧养老系统部分数据表信息(续)
编号
数据库表名
数据库表描述
3
wps_admin_info
存储系统管理人员信息
4
wps_blood_pressure
存储老人血压检测信息
5
wps_blood_glucose
存储老人血糖检测信息
6
wps_take_medicine
存储老人用药记录信息
7
wps_health_warn
存储老人健康等级信息
8
wps_gateway_state
存储数据网关状态信息
9
wps_user_facility
存储老人智能终端设备信息
10
wps_health_examin
存储老人体检记录信息
11
wps_doctor_visit
老人就诊记录信息
12
wps_doctor_appoint
老人预约挂号信息
本文以用户血压检测记录表4.3为例对数据库表格的结构进行说明。
表4.3用户血压记录表wps_blood_pressure
中文属性
字段名
字段类型
长度
允许空
约束
默认值
用户id号
user_id
varchar
8
PK
收缩压
bp_systolic
smallint
6
舒张压
bp_diastolic
smallint
6
脉搏
bp_pulse
smallint
6
是
状态
bp_state
char
2
检测时间
test_time
datetime
current_time
用户血压记录表用于记录用户血压测量信息。
该表共有7个属性,其中用户id号是表的主键,系统可以通过用户id号快速查询到特定用户的血压检测信息,bp_state是老人血压的状况,共有01/02/03/04四个值,分别表示正常、轻度、中度和重度,系统根据不同的等级提供相应的健康监护,主动为老人提供服务。
在对表的各个属性进行设计时,需要保留一定的冗余,便于系统后期的扩展。
4.2.2数据库操作模块设计与实现
1.数据库连接池设计与实现
通常应用程序建立数据库连接对象需要较长的时间,当系统并发访问量较高时,连接的频繁建立和释放会消耗过多的系统资源,损害系统性能。
为了解决这一问题,本节使用资源池(resourcepool)技术[36-37],通过数据库连接池管理连接对象。
本系统数据库连接池的创建包括三个部分:
(1)创建连接池。
由于连接池主要用于管理数据库连接对象,因此创建连接池时,首先需要建立一个存放数据库连接对象的数据结构。
本系统使用c#中的List集合来存放连接对象。
(2)管理连接池。
对于数据库连接池来说,管理策略的好坏是决定其性能优劣的关键。
本系统采用独立的线程管理数据库连接池,在对其初始化时,使用ConnectionCreate线程创建指定数量的连接对象,通过ConnectionCheck线程检测池中的连接对象是否小于最小连接数,如果小于则调用ConnectionCreate线程创建指定数量的新的数据库连接对象。
(3)关闭连接池。
在系统正常运行期间,由于服务端需要一直提供服务,因此不需要关闭连接池资源。
如果需要暂时关闭服务,需要在程序运行结束之前,释放池中所有的连接对象,然后关闭连接池,释放连接资源。
2.数据库操作模块设计与实现
使用SQL(StructuredQueryLanguage,结构化查询语言)语句对MySQL数据库执行增、删、改、查等操作的流程如图4.3所示:
图4.3数据库操作流程
本文通过定义Mysqlmanager类,实现对MySQL数据库操作的封装,应用程序通过调用公共函数实现其业务逻辑,而不需要关心数据库具体执行步骤。
Mysqlmanager的组成结构如图4.4所示:
图4.4Mysqlmanager组成结构图
4.3通讯I/O模块设计与实现
4.3.1通讯I/O模块通信原理分析
作为智慧养老系统中间件,提供通信服务,对应用层和感知层数据进行处理是其最基本的功能。
本节通过通讯I/O模块的设计与实现,为上层提供具体的业务数据。
本文选择基于TCP/IP的Socket通信作为系统的通信方式。
在使用Socket发送数据时,其过程如图4.5所示:
图4.5Socket发送数据示意图
从图中可以看出,数据不是简单的直接在两个端口之间传递,而是需要先存入缓冲区,然后再发送。
数据的发送方式主要有两种:
同步和异步,采用同步发送方式时,线程需要执行I/O等待,异步方式则直接返回,不需要等待,不过每次发送之前需要设置数据缓冲区,等数据发送完后对缓冲区重新进行初始化。
为了设计一个高性能的Socket模块来处理多而繁杂的客户端连接请求,本节使用.net的SocketAsyncEventArgs,采用异步I/O方式,同时结合连接池技术和数据缓存区来保证服务的并发性和高效性。
4.3.2通讯I/O模块具体设计与实现
本节在综合考虑通讯I/O模块在系统中间件中应用场景的基础上,运用资源池技术和数据缓存区,对通讯I/O模块中的关键类进行了详细设计,各个类的详细组成结构和相互之间的关系如图4.6所示:
图4.6通讯I/O模块主要类结构和相互之间关系
1.Service类
Service类派生于System.ServiceProcess.ServiceBase类,需要重写该类的OnStart方法和OnStop方法来控制服务的启动和停止。
在OnStart方法中,为SocketListener类配置最大连接数(numConnections)和数据缓冲区(buffersize),然后调用SocketListener的Start方法启动SocketListener监听指定的服务器IP和端口号上的套接字(Socket)连接。
2.SocketListener类
SocketListener类用于监听用户的连接请求并执行初始化操作,包括配置最大连接数(numConnections),初始化连接资源池(SocketAsyncEventArgsPool)等。
当检测到连接请求后,Service类从SAEA池中选取一个对象分配给连接,记录连接信息,监听并处理连接发来的数据。
3.BufferManager类
该类是一个管理连接缓冲区的类,它为每一个连接维持一个接收数据缓冲区。
本文通过提前建立一定数量的内存区域并将其地址压入栈中,在需要发送或者接收数据时,从栈中pop出一块区域来给SocketAsyncEventArgs对象作为Buffer,用完之后将其push入栈,从而提高缓冲区的使用效率。
4.SocketAsyncEventArgsPool类
该类是一个SAEA对象池,是通讯I/O模块的核心。
该类为用户提供一个可靠的连接并且维持这个连接直到用户断开,然后将释放后的连接放回连接池中。
SAEA对象对IOCP(I/OCompletionPort,I/O完成端口)操作进行了封装,可以为系统提供较高的并发连接能力。
5.UserToken类
该类使用Connection属性获取客户端的Socket连接和业务数据,通过ProcessData方法对数据进行分析并根据数据的命令码由指定的业务处理模块处理。
图4.7通讯I/O模块实现流程图
上面介绍了通讯I/O模块主要的类及其结构,下面对各个类的综合运用完成通讯I/O模块的具体实现,其流程如图4.7所示:
模块首先通过重写的OnStart方法完成服务的启动和初始化,主要包括端口初始化和数据缓冲区初始化,在初始化完成后,将端口号和数据缓冲区参数传给SocketListener实例化对象,由该实例化对象调用Start方法开启监听线程,并创建套接字监听连接对象,分配数据缓冲区。
当线程监听到用户的连接请求后,调用OnAcceptCompoleted为新建的连接分配一个可用的SAEA对象,并在该SAEA对象上投递一个数据请求,然后等待下一个连接的到来。
在SAEA对象上投递的数据请求使用OnIoCompleted函数判断该请求是接收请求还是发送请求,如果是接收请求则将数据交给业务处理模块进行处理,否则将发送数据投递给下一个接收数据请求。
在设计该模块时,为了避免业务请求突然增加进而导致数据丢失的情况发生,提高系统并发处理业务请求的能力,系统设置一个缓冲队列,并对数据接收和数据处理采用不同的线程进行处理。
当有数据请求到来时,首先判断队列的状态,如果队列未满,则将接收的数据放入队列中,然后等待下一个数据包;如果队列已满,则等待队列中数据被处理后再投递数据包。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智慧 养老 系统 中间件 设计 实现