智慧养老系统信息监管软件的设计与实现第4章上.docx
《智慧养老系统信息监管软件的设计与实现第4章上.docx》由会员分享,可在线阅读,更多相关《智慧养老系统信息监管软件的设计与实现第4章上.docx(17页珍藏版)》请在冰豆网上搜索。
![智慧养老系统信息监管软件的设计与实现第4章上.docx](https://file1.bdocx.com/fileroot1/2022-11/24/89c88539-dbe3-467e-a37e-13fb1fed5526/89c88539-dbe3-467e-a37e-13fb1fed55261.gif)
智慧养老系统信息监管软件的设计与实现第4章上
第4章智慧养老系统信息监管软件的详细设计与实现
围绕信息监管软件的需求和开发方案,结合隐性异常行为识别算法的研究,本章首先对软件各功能模块进行详细设计,然后根据需求明确了数据逻辑,设计并实现了信息监管软件数据库,在此基础上详细阐述了隐性异常行为识别算法和基于角色的访问控制技术的实现方法,最后对重要功能模块进行了具体论述。
4.1信息监管软件功能模块设计
根据前文需求分析,本文采用层次化和结构化的设计思想,将软件分解为多个功能模块。
图4.1为软件功能模块结构图,信息监管软件分为账户信息、老年人信息、实时定位、医疗健康、主动关怀、生活服务、娱乐活动、紧急事件、智能分析和系统管理十个功能模块。
图4.1软件功能结构图
1.账户管理:
包括信息管理、密码修改和退出登录三个子模块。
信息管理提供账户基本信息的查询和修改操作;密码修改提供登录密码的修改操作;退出登录提供软件功能页面的退出操作。
2.老年人信息:
包括审核信息、基本档案两个子模块。
审核信息提供审核信息的添加、查询和修改操作,并提供待审核状态信息的同意申请和拒绝申请操作;基本档案提供老年人基本信息的查询和修改操作,系统管理员允许进行删除操作,此处的删除操作将清空该老年人所有的相关信息。
3.医疗健康:
包括患者信息、在线咨询、在线回答三个子模块。
患者信息提供老年人健康档案、服药记录、体检记录和就诊记录四种健康相关信息的查询和修改操作,系统管理人员允许对患者信息进行删除,其中服药记录提供服药信息下发功能;在线咨询提供医务人员信息的查询和选择操作,选择完成后老年人可向医务人员进行留言;在线回答提供留言回复操作。
4.实时定位:
包括定位信息和电子围栏两个子模块。
定位信息提供老年人地理信息查询操作和地图显示;电子围栏提供电子围栏的显示、开启、修改和删除操作。
5.关怀计划:
包括关怀管理、计划工单、历史记录三个子模块。
关怀管理提供关怀信息的查询、修改、添加和删除操作,并提供关怀计划的添加操作,关怀计划添加成功以后会生成计划工单;计划工单提供关怀计划的查询、修改和删除操作,此处的删除操作将导致计划工单取消;历史记录提供已完成关怀工单的查询操作。
6.生活服务:
包括服务管理、服务选择、服务工单和历史记录四个子模块。
服务管理提供服务信息的查询、修改、添加和删除操作;服务选择提供服务信息的查询和选择操作,系统管理员允许帮助老年人进行服务信息的选择,服务选择成功以后会生成待审批服务工单;服务工单提供工单信息的审批、查询、修改和删除操作,此处的审批操作通过以后将生成待执行服务工单,删除操作将导致服务计划取消;历史记录提供已完成状态的服务工单查询操作,老年人允许对工单进行评价。
7.娱乐活动:
包括活动管理、活动参与、活动工单和历史记录四个子模块。
活动管理提供活动信息的查询、修改、添加和删除操作;活动参与提供活动信息的查询操作,并提供活动的选择操作,系统管理员允许帮助老年人进行活动的选择,活动选择成功以后会生成活动工单;活动工单提供待完成状态的活动计划的查询、修改和删除操作,老年人的删除操作将导致自己退出活动计划,系统管理员的删除操作将导致活动工单取消;历史记录提供已完成活动工单的查询操作,老年人允许对工单进行评价。
8.紧急事件:
包括事件管理、救援工单和历史记录三个子模块。
事件管理提供紧急事件信息的查询、修改、添加和删除操作,并提供救援计划的添加操作,救援计划添加成功以后将生成救援工单;救援工单提供待救援计划的查询、修改和删除操作,此处的删除操作将导致救援计划取消;历史记录提供已完成救援工单的查询操作。
9.智能分析:
包括人员管理、状态管理和参数设置三个子模块。
人员管理提供参与预测人员信息的查询、修改、添加和删除操作;状态管理提供预测状态的暂停和恢复操作;参数设置提供数据分析进程的工作参数下发操作。
10.系统管理:
包括用户管理、角色管理、等级管理、黑名单管理、知识库管理、投诉管理和系统日志七个子模块。
用户管理提供用户信息的查询、添加、修改、删除操作,此处的删除操作将清空该人员的所有相关信息;角色管理提供角色属性的查询、添加、修改、删除操作,此处的删除操作只允许在目前角色无人担任的情况下进行;等级管理提供紧急事件等级的查询、添加、修改和删除操作;黑名单管理提供黑名单人员信息的查询、添加、修改、删除操作;知识库管理提供知识库数据的管理操作;投诉管理提供投诉信息的查询、添加、修改、删除操作;系统日志提供每种角色的操作记录的查询操作。
4.2数据库的设计与实现
4.2.1数据库设计
1.实体-联系模型设计
实体-联系模型又称E-R(Entity-Relationship)模型[44],它提供了实体类型、属性和联系之间的表达方法。
在信息监管软件中,通过建立E-R模型,可以清晰表达各实体之间的联系,明确角色与业务之间的关系,为数据库表格的设计提供了逻辑支持。
结合软件功能模块的划分,本文设计系统的E-R模型如图4.2所示。
图4.2E-R模型图
2.数据库表格设计
根据E-R模型,参照关系型数据库设计三范式[45],确定表格字段的数据类型、名称、约束、缺省值和字段说明。
本文采用MySQL数据库管理系统创建数据库wps_infomonitor,共设计91张数据库表格,出于篇幅限制,下面只列出主要的12张数据库表格,如表4.1所示。
表4.1信息监管软件主要信息表汇总
编号
数据库表名
数据表描述
1
wps_user_info
存储账户基本信息
2
wps_elder_info
存储老年人基本信息
3
wps_med_info
存储老年人健康信息
4
wps_med_messege
存储在线咨询信息
5
wps_pre_data
存储老年人预测数据
6
wps_location
存储老年人定位信息
7
wps_activecare
存储主动关怀工单
8
wps_service
存储生活服务工单
9
wps_leisure
存储娱乐活动工单
10
wps_urgent
存储紧急事件工单
11
wps_active_data
独居老年人行为数据
12
wps_pre_data
独居老年人预测数据
本文以老年人基本信息表和生活服务工单表为例说明数据库表格的结构设计。
表4.2为老年人基本信息表wps_elder_info,表4.3为生活服务记录表wps_service。
表4.2老年人基本信息表结构
字段
字段类型
为空
约束
缺省值
字段说明
elder_id
char(7)
no
主键
—
老年人编号
name
varchar(32)
no
—
—
姓名
age
tinyint(4)
no
—
—
年龄
gender
varchar(8)
no
—
—
性别
ethnicity
char(20)
no
—
—
民族
maritalstatus
tinyint
(1)
no
—
—
婚姻状况
identity
char(18)
no
—
—
身份证号
tel
char(11)
no
—
—
手机号码
address
varchar(128)
no
—
—
家庭住址
adlongitude
char(11)
no
—
—
家庭地址经度
adlatitude
char(11)
no
—
—
家庭地址纬度
iserail
tinyint
(2)
no
—
0
电子围栏标识
radius
int(11)
no
—
0
电子围栏半径
preflag
tinyint
(2)
no
—
0
行为预测标识
servicegrade_id
tinyint(3)
no
外键
0
服务等级
servicestatus
tinyint(3)
no
—
0
服务状态
sibname
varchar(32)
no
—
—
亲属姓名
sibtel
char(11)
no
—
—
亲属联系方式
sibaddress
varchar(128)
no
—
—
亲属家庭地址
chronic
varchar(128)
no
—
无
慢性病状况
disablestats
varchar(128)
no
—
—
失能状况
checked
tinyint
(1)
no
—
0
是否已经审核
user_id
int(11)
yes
外键
—
审核人编号
checkedtime
datetime
yes
—
—
审核时间
remark
text
no
—
无
备注信息
createtime
datetime
no
—
当前时间
创建时间
wps_elder_info表存储老年人基本信息,包括姓名、性别、证件类型、证件号、电话、服务等级等字段。
其中elder_id为表格主键,用以标识老年人身份,servicegrade_id和user_id为表格外键,用以关联服务等级信息和审核人信息等相关信息。
表4.3生活服务工单表结构
字段
字段类型
为空
约束
缺省值
备注
service_id
int(11)
no
主键
—
服务工单编号
info_id
smallint(6)
no
外键
—
服务信息编号
表4.3生活服务工单表结构(续)
字段
字段类型
为空
约束
缺省值
备注
elder_id
char(7)
no
外键
—
老年人编号
server_id
char(7)
no
外键
—
服务人员编号
address
varchar(128)
no
—
—
服务地址
time
datetime
no
—
—
服务时间
status_id
tinyint
(1)
no
外键
0
工单状态编号
remark
text
yes
—
—
服务备注说明
evaluate_id
tinyint
(1)
yes
外键
—
评价等级编号
createtime
datetime
no
—
当前时间
工单创建时间
reviewedtime
datetime
yes
—
—
工单审批时间
feedbacktime
datetime
yes
—
—
工单反馈时间
wps_server表存储老年人基本信息,包括服务工单编号、服务类型编号、老年人编号、服务人员编号等字段。
其中service_id为表格主键,用以标识服务工单,info_id、elder_id、server_id、status_id、evaluate_id和为表格外键,用以关联服务信息、老年人信息、服务人员信息、工单状态和评价等级。
4.2.2数据库连接与操作
信息监管软件的开发框架为CI框架,其提供了一个简单的数据库访问接口。
该接口采用ActiveRecord模式,能够以精简的代码完成对数据库的多种操作。
在使用访问接口之前,需对连接属性进行配置,包括数据库地址、数据库账号、密码、数据库名等,配置文件路径为application/config/database.php。
用户访问数据库时,控制器通过调用database()载入数据库类,获取连接属性,完成数据库连接操作,然后即可调用Model类文件完成数据库读写操作。
在实际研发过程中,为了避免重复的数据库SQL语句编写,通过自定义模型的方式封装常用数据库操作。
封装完成以后,控制器只需调用自定义模型,即可实现数据库的复杂操作。
4.3独居老年人隐性异常行为识别算法实现
独居老年人的隐性异常识别是通过数据分析进程来实现的。
由于异常识别是一种需要长期循环执行的数据分析任务,而且用户不关心算法的具体运行过程,只关心执行结果的输出,因此在信息监管软件中,数据分析进程以Windows服务[46]的形式运行。
考虑到研发难度和熟练度的问题,数据分析进程采用C++语言进行研发,研发工具为VisualStudio2012。
信息监管软件与数据分析进程的关系如图4.3所示。
图4.3信息监管软件与数据分析进程关系
由上图可知,数据分析进程中存在如下三种工作任务:
1.行为预测:
从数据库获取历史数据和天气数据,完成行为预测,将预测数据添加至数据库中。
2.异常识别:
获取预测数据、实测数据和天气数据,进行异常识别。
根据异常等级添加风险警报。
3.指令接收:
接收信息监管软件的控制指令,完成指令解析,执行控制指令。
在本节中,将主要阐述数据分析进程的工作流程,其中将重点阐述行为预测和异常识别的具体实现方法。
4.3.1数据分析进程实现
图4.4为数据分析进程的整体业务流程图。
在整体业务流程中,共创建了主线程、服务线程、指令接收线程、行为预测线程和异常识别线程五种线程执行不同的任务。
下面将逐一介绍每个线程的主要任务。
其中行为预测线程和异常识别线程的具体实现将在4.3.2节进行阐述。
图4.4数据分析进程的整体业务流程
1.主线程
与其他类型的程序不同,Windows服务程序的主线程一般情况下不负责业务流程的执行。
其主要任务是初始化一个SERVICE_TABLE_ENTRY分派表结构体的对象数组,然后将对象数组的首地址作为形参传入StartServiceCtrlDispatcher()。
StartServiceCtrlDispatcher()负责把程序主线程连接到服务控制管理器,完成服务入口点函数注册。
StartServiceCtrlDispatcher()执行成功以后,服务控制管理器将为分派表结构体中的每个非空元素创建一个新的线程,即服务线程,执行分派表中的服务入口点函数。
服务线程创建成功以后,主线程结束。
2.服务线程
在Windows服务程序中,服务线程是控制业务流程的核心线程。
在服务线程中,主要有以下两个任务:
(1)完成Windows服务的初始化工作。
进入服务线程以后,调用RegisterServiceCtrlHandler()通知服务控制管理器,完成控制处理函数的注册。
控制处理函数是一个回调函数,它的主要功能是接收服务控制管理器发出的控制指令,通过控制指令去改变服务状态。
每个服务线程必须配备一个相应的控制处理函数。
RegisterServiceCtrlHandler()执行成功后,获得SERVICE_STATUS_HANDLE类型的句柄,服务控制管理器使用该句柄来标识数据分析进程。
将该句柄和SERVICE_STATUS结构体对象作为形参传入SetServiceStatus(),更新服务控制管理中数据分析进程的状态信息,完成Windows服务的初始化工作。
(2)完成工作任务的流程控制。
在三种工作任务中,行为预测和异常识别为定时执行的任务,其工作线程在规定时间创建,完成任务后工作线程退出;指令接收为循环执行的任务,其工作线程在创建后会以“等待连接-建立连接-结束连接-等待连接”的方式工作,不会主动退出。
所以,工作任务的流程控制可分为以下三步:
第1步:
从wps_pretime表中获取行为预测线程创建时间stringpT1和异常识别线程创建时间stringpT2;若返回的结果集为空,则默认pT1=“2:
00:
00”和pT2=“0:
30:
00”。
第2步:
调用_beginthreadex(),完成指令接收线程的创建工作。
第3步:
进行流程控制。
判断队列容器queueQue中是否存在控制指令,控制指令格式为“CommandHeader/time/end”。
在若存在控制指令,则根据“CommandHeader”字段和“time”字段的具体内容对pT1或pT2进行修改;若没有控制指令,则进行下一个步骤。
获取当前时间stringsT。
判断sT和pT1、pT2是否拥有相同子串。
若有相同子串,则创建工作线程执行相应工作任务,创建完成后延时1秒防止下一轮循环中再次触发相同条件;若没有相同子串,则直接进入下一轮循环。
值得注意的是,队列容器queueQue是全局对象,在服务线程和指令接收线程中均涉及到Que的操作。
为了防止多个线程同时对Que进行操作,在程序中使用了关键代码段CRITICAL_SECTION对象cs对Que的访问权进行了保护。
在对Que进行操作之前,调用EnterCriticalSection()进行加锁,判断是否能得到cs的所有权,若无法得到所有权,则线程会一直等待,直到获取cs的所有权;若得到所有权,则进入关键代码段中访问Que。
访问完成后,调用LeaveCriticalSection()释放cs所有权,即解锁,此时其他线程就可以得到cs的所有权,从而完成对Que的操作。
3.指令接收线程
指令接收线程是数据分析进程与信息监管软件的主要通信接口。
其业务流程如图4.5所示。
图4.5指令接收线程业务流程
其中指令接收线程为通信服务端,信息监管软件为通信客户端。
所以,在指令接收线程中需实现以下两个主要功能:
(1)命名管道服务端的创建。
命名管道服务端的创建流程如下:
第1步:
创建命名管道:
CreateNamedPipe()。
第2步:
等待客户端连接:
ConnectNamedPipe()。
第3步:
读取客户端发送数据:
ReadFile()。
第4步:
向客户端回复数据:
WriteFile()。
第5步:
关闭连接:
DisconnectNamedPipe()。
第6步:
关闭管道:
CloseHandle()。
在步骤3中,如果客户端连接以后未发送数据,ReadFile()会以同步的方式等待接收数据,导致线程阻塞。
所以应使用异步方式进行方法调用,在规定时间内接收客户端数据。
具体实现步骤如下:
第1步:
调用CreateEvent(),创建初始状态为无信号的事件对象hEvent;初始化规定时间intnum=500,单位为毫秒。
第2步:
初始化OVERLAPPED结构体对象OV,将hEvent赋值给OV.hEvent。
第3步:
将OV作为形参传入ReadFile(),即使用异步方式调用ReadFile()。
第4步:
将hEvent和num作为形参传入WaitForSingleObject(),获取该函数返回值intResult。
第5步:
判断Result值,若Result==WAIT_OBJECT_0,则说明hEvent处于有信号状态,即接收到数据;若Result==WAIT_TIMEOUT,则说明hEvent在设定的500毫秒内均处于无信号状态,即500毫秒内未收到数据,此时向客户端返回数据接收错误标识“ERROR”。
(2)进行控制指令的初步解析,将控制指令存放于队列容器Que中。
在Result==WAIT_OBJECT_0的条件下,解析接收数据,若为预定义控制指令,则将控制指令存入Que中;若不为预定义控制指令,则向客户端返回数据接收错误标识“ERROR”。
与服务线程中一样,此处也通过加锁和解锁保护全局对象Que的访问权。
4.行为预测线程
行为预测线程是实现独居老年人行为预测的核心线程。
其业务流程如图4.6所示
图4.6行为预测线程业务流程
进入入口点函数,获取当前日期stringDate;从wps_prelist表中获取待预测老年人编号,存入vectore_buff;从wps_pause_prelist表中获取暂停预测老年人编号和暂停日期区间,存入vectorp_buff。
p_buff数据成员格式如下:
PauseID/DateStart/DateEnd/end,其中DateStart标识暂停起始日期,DateEnd标识暂停结束日期。
获得e_buff和p_buff以后,首先遍历p_buff,按顺序进行如下两种判断:
(1)判断Date是否大于p_buff成员DateEnd字段。
若大于,则说明此条暂停预测记录已经过期,调用p_buff.erase()删除此条记录,同时删除wps_pauseprelist表相应记录。
(2)判断Date是否小于p_buff成员DateStart字段。
若小于,则说明此条暂停记录还未到执行时间,调用p_buff.erase()删除此条记录。
完成上述两个步骤以后,遍历e_buff,判断p_buff与e_buff中是否有相同ID的元素,若存在,则说明此老年人暂时不参与下一周的预测任务,调用e_buff.erase()删除此条记录,同时将wps_pre_data表中该老年人当天的预测值均更新为-1,表示该老年人未参与行为预测。
此时e_buff中元素即为参与当天预测的老年人编号,再次遍历e_buff,获取老年人的历史数据,完成行为预测。
行为预测任务的具体实现将在4.3.2节论述。
5.异常识别线程
异常识别线程是实现独居老年人异常识别的核心线程。
其业务比较单纯,只需从数据库获取数据进行异常识别,输出识别结果。
异常识别任务的具体实现将在4.3.2节论述。
4.3.2行为预测和异常识别具体实现
行为预测线程和异常识别线程是具体实现独居老年人隐性异常行为识别算法的线程。
在具体实现中,共涉及5张数据库表:
wps_active_data、wps_weather、wps_weather_weight、wps_pre_data和wps_active_type。
wps_active_data负责存储独居老年人每天5种活动的活动时长;wps_weather负责存储每天的舒适度等级和降雨量等级;wps_weather_weight负责存储独居老年人的舒适度权值序列和降雨量权值序列;wps_pre_data负责存储独居老年人5种活动的预测数据;wps_active_type负责存储活动类型和对应编号。
由于篇幅所限,本节只给出wps_active_data和wps_weather_weight两张表的表结构设计,如表4.4和表4.5所示。
表4.4wps_active_data表结构
字段
字段类型
为空
约束
缺省值
备注
id
char(7)
no
外键
—
老年人编号
date
date
no
—
—
日期
sleep
int(11)
yes
—
—
睡觉时长
siesta
int(11)
yes
—
—
午休时长
toilet
int(11)
yes
—
—
上厕所时长
meal
int(11)
yes
—
—
吃饭时长
beout
int(11)
yes
—
—
外出时长
表4.5wps_weather_weight表结构
字段
字段类型
为空
约束
缺省值
备注
id
char(7)
no
外键
—
老年人编号
type_id
tinyint
(2)
no
外键
—
活动类型
create_date
date
no
—
—
权值序列生成日期
ssdmfour
decimal(6,2)
no
—
—
-4级舒适度权值
ssdmthree
decimal(6,2)
no
—
—
-3级舒适度权值
ssdmtwo
decimal(6,2)
no
—
—
-4级舒适度权值
ssdmone