基于Python的多媒体教室管理系统设计
2019-05-24张喜红王玉香
张喜红 王玉香
(亳州职业技术学院, 安徽 亳州 236800)
随着计算机技术的发展,多媒体教室的应用逐渐普及[1]。计算机、投影机是学校多媒体教室必备的基础性硬件设备,这类设备大多使用寿命有限、配件价格较高。如,普通投影机灯泡的使用寿命仅4 000 h左右,激光投影机灯泡的使用寿命仅20 000 h左右,且使用时若操作不当极易导致灯泡损坏[2]。在学校多媒体教室设备日常管理中,规范使用,按需开关机,有助于延长设备使用寿命。目前,大多学校采用多媒体教室外配专属中控设备的方式来实现统一管理。亳州职业技术学院即采用此种方式在实际使用当中发现存在以下问题:中控设备的配置增加了建设成本;中控设备的接入增加了系统施工、布线的复杂程度;后期维修、维护相对困难。为了避免这些问题,我们基于Python语言重新设计了一套多媒体教室管理系统。Python语言具有模块丰富、语法简洁、跨平台性能较好等优势[3],因此基于Python的系统稳定性良好,使用成本不高。
1 系统硬件及工作流程
1.1 系统硬件组成
多媒体教室管理系统的硬件由总控计算机、路由器、各教室计算机、投影机等组成(见图1) 。教室的多媒体设备包括教室计算机和投影机,各教室计算机支持网卡唤醒启动,教室计算机与投影机之间通过RS232串行总线连接,教室计算机可通过串行总线向投影机发送控制指令,最终实现投影机的开启与关闭。每台教室计算机和总控计算机通过路由器连接,形成局域网。
图1 多媒体教室管理系统硬件组成结构
1.2 系统工作流程设计
开始管理系统设计之前,首先需确定以下问题:(1) 采用什么方式控制各教室计算机的自动开启和关闭;(2) 确定课表分析功能是由教室计算机实现,还是由总控计算机实现;(3) 如何控制投影机按需、按时完成开启和关闭等操作。
现有管理方式是通过外配中控硬件来实现教室计算机的自动开启和关闭等操作。对于教室计算机,是通过断电器联接计算机电源开机触发线实现计算机的开关机控制,长期使用对硬件的损伤较大。对于投影机,是通过单片机模块的串口通信实现控制,且大多采用无应答检查控制方式,可靠性低。因此,省去中控设备,并实现自动控制是系统改造的重点工作。
当前各教室计算机支持网卡唤醒功能,因此,在不额外增加设备的情况下,各教室计算机的开机操作可通过网卡远程唤醒来实现。如果由总控计算机完成所有课表的分析,并有针对性地实时唤醒各教室计算机,将导致总控计算机的运算分析工作量过大。为了保证实时性,总控计算机应满足较高的硬件配置要求。为了控制改造成本,课表分析任务、投影机的开关机控制都由当前各教室计算机来完成。
基于以上考虑,确定系统工作流程:
(1) 总控计算机依据当前季度的作息时间,在每节课上课前5 min内向全校多媒体教室发送网络唤醒开机指令,开启各多媒体教室计算机。
(2) 各多媒体教室计算机开机后,运行程序,读取并分析本地存放的本教室课表文件。若当前未安排课程,则执行计算机的关机指令,立即关闭本教室计算机。
(3) 若当前时段安排有课程,则通过串口开启投影机,并以一定的时间间隔周期性检查是否已到下课时间。若下课时间到,就先通过串口向投影机发送关机指令,关闭投影机,然后执行计算机关机指令,立即关闭本教室计算机。
2 系统软件设计与实现
2.1 总控计算机程序
总控计算机的主要任务是依据当前季度的作息时间,在每节课前通过网络唤醒技术提前启动多媒体教室计算机。实现这一功能,应首先确定开机时间节点的获取方式,然后完成网络唤醒功能的程序设计。开机时间节点通过读取Excel文件得到,以适应上课时间的变化。首先,将各节次上课时间与提前开机时间设置值按图2所示格式存放于Excel文件中,待总控端程序启动后,通过Python语言中xlrd模块的相应函数将Excel 文件中的开机时间列表文件读入;接着,程序驻留于后台保持运行,其间按照一定的时间间隔,通过Python语言中time模块的time.localtime()方法,周期性提取系统时间,并与从Excel文件中读入的时间安排进行比对,若相符即可通过网络唤醒技术远程启动多媒体教室计算机。通过Python语言中xlrd模块读取图2所示Excel文件,以获取上课时间节点。
图2 上课时间安排
函数代码如下:
def Read_Class_time(class_path):#读取本季度各节的上课时间
# class_path为表格文件的存放路径
data=xlrd.open_workbook(class_path)
table=data.sheets()[0]#读取表格文件的Sheet1表
# 获取Sheet1表的第2列数据,得到开机时间节点数据
Class_time=table.col_values(1)
# 获取Sheet1表的第3列的第1个数据,得到提前开机时间值
Difference_time =table.col(2)[0].value
# 计算开机时间,并把开机时间转化为以“时”为单位的时间列表
value_list = []
for t in range(0,10):
h=int(24*3600*Class_time[t]/3600)#时
m=int(24*3600*Class_time[t]%3600/60)#分
#以“时”为单位整合时间列表,便于与系统时间比较
value=h+m/60.0-Difference_time/60.0
value_list.append(value)
return value_list #返回开机时间列表
通过Python语言time模块获取总控计算机系统时间,其函数代码如下:
def get_current_time():#获取当前电脑时间
current_time=list(time.localtime())#获取总控计算机系统时间
hour=current_time[3]#提取“时”
minute=current_time[4]#提取“分”
value=hour+minute/60.0#统一变换为以“时”为单位的数据,以便后续比较
return value
网络唤醒启动,是由总机通过网络对各分机传送规定内容的编码包来实现,编码包用16进制格式表示为:“FF FF FF FF FF FF +16次目标机MAC地址”。同时,网络唤醒具有明显的广播特征,通常采用UDP协议来实现[4-5]。通过Python提供的socket模块,简单配置参数后便可实现UDP网络通信[6]。采用Python设计网络唤醒功能,其函数代码如下:
import socket#导入模块
import binascii
#ip参数为主机IP地址,PORT为通信端口号,MAC_List为各目标机MAC地址列表
def UDP_Broadcast_Tx(IP,POTR,MAC_List):
#初始化“套接字”为UDP连接
my_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
my_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
#广播各目标机唤醒数据包
for i in mac:
#构造各目标机的开机魔术数据包
data=binascii.unhexlify(′FF′ * 6 + i * 16)
#发送数据包
my_socket.sendto(data,(ip,port))
my_socket.close()#关闭网络连接
2.2 教室计算机程序
教室计算机程序的功能是,依据本教室的课表按时开关投影机。具体的实现过程如下:
(1) 将本教室的课表按图3所示模板来设计,存放于教室计算机本地磁盘中。
辛迪·舍曼(Cindy Sherman)、杰夫·昆斯(Jeff Koons)和托恩·霍克斯(Teun Hocks)亲自步入镜头前;霍埃尔-彼得·威特金(Joel-Peter Witkin)和乔·甘茨(Joe Gantz)则创造出不时使人震惊的叙述体场景。阿瑟·特雷斯(Arthur Tress)和戴维·莱维索尔(David Levinthal)长于缩微场景;卡鲁姆·科尔万(Calum Colvin)和维克托·施勒格(Victor Schrager)则擅长静物摄影。
(2) 教室计算机被唤醒启动后,自动启动教室计算机端的程序,通过Python的datetime模块,首先获取系统的当前日期与时间,并提取分解出当前周次与时间。
(3) 通过xlrd模块的相关函数,读取课表文件中的节次时间安排,并与当前时间作比对,得到当前时间对应节次。
(4) 以周次与节次为行、列索引读取课表信息。若当前单元格为空,则将课程标记变量置为‘0’,代表无课,于是执行关闭计算机指令;若当前单元格不为空,则将课程标记置为‘1’,代表有课,于是执行开启投影机指令。
(5) 程序在后台驻留,并以一定的时间间隔周期性地比较系统时间与课表文件中的下课时间。若下课时间到,则依次执行关闭投影机和关闭计算机的指令。其中,计算机的关机操作通过os模块的os.system(“shutdown -s -t 0”)方法实现。
图3 教室课表模板
2.3 开关投影机程序
鉴于原有教室计算机与投影机已布设有串行连接线,本次设计中教室计算机对投影机的控制将通过RS232串行总线来实现。通常,投影机在出厂时标配RS232串口,并提供串口控制指令码及参数表。如日电NP-CR3125X投影机的通信波特率为38 400,串行口开、关机指令码分别是02-00-00-00-00-02、02-01-00-00-00-03,且控制成功后会返回应答码,开、关机的应答码分别是22-00-01-20-00-43、22-01-01-20-00-44。
Python语言中实现串口控制的模块是serial模块。应用serial模块设计串口控制程序,主要内容包括串口的初始化和串口的发送与接收。
(1) 串口的初始化。串口的初始化内容主要包括端口号及波特率、位长、停止位等参数的设置。
初始化与指令发送函数代码如下:
#串口初始化函数
def serial_init(COM,Baudrate,ByteSize,Stopbits,Timeout):
serial_COM = serial.Serial(COM)#设置端口号,如:COM=′COM1′
serial_COM.setBaudrate(Baudrate)#设置波特率,如:Baudrate=38 400
serial_COM.setByteSize(ByteSize)#设置位数,如:ByteSize=8
serial_COM.setStopbits(Stopbits)#设置停止位,如:Stopbits=1
serial_COM.setTimeout(Timeout)#设置接收超时,如:Timeout=0.5 s
print serial_COM.portstr
time.sleep(1)#等1 s稳定
returnserial_COM
#串口开、关机指令发送函数
def serial_Tx(serial_COM,Command):
for i in range(1,3):#最多发3次,未收到应答提示控制失败
# 通过串口发送控制命令
serial_COM.write(Command)#开机指令:Command=″x02x00x00x00x00x02″.encode(′utf-8′)
#关机指令:Command=″x02x01x00x00x00x03″.encode(′utf-8′)
if(serial_COM.read(6)!=″ ″):#接收投影机返回的6字节应答信号
print(″投影机控制成功!″)
return 1
print(″投影机控制成功!″)
showinfo(title=′提示′,message=′程序控制可能出错,请您用遥控器操控投影机′)
return 0
3 系统程序测试
在Pycharm 2016.3.3开发环境下,采用python 2.7版本设计、调试总控计算机与教室计算机程序;然后,再借助py2exe将所设计程序编译打包成exe可执行文件[7],安装对应的总控计算机与106台教室计算机。总控计算机与教室计算机的CPU型号为Intel(R) Core(TM) i3-4160 3.6GHz,内存大小为4 GiB,操作系统为Win7-64位。通过Windows系统自带任务计划程序安排功能,将总控计算机与教室计算机的exe程序设为开机自启动模式。最后,进入教室计算机的BIOS系统,开启允许网络唤醒功能。在为期1周的运行测试过程中,总控计算机能够实时唤醒106台教室计算机。其中,有105台计算机能够按照课表实时开启和关闭投影机;有1台计算机,因其系统时间设置有误,未能按课表安排的上课时间正常开机。
4 结 语
我们以亳州职业技术学院现有多媒体教室布设结构为基础,针对外配中控管理方式维护不便的问题,设计了基于Python的多媒体教室管理系统。在该系统中应用了Python的datetime 、xlrd 、socket等模块,使总控计算机可以依照Excel文件中预设的时间节点唤醒各教室计算机;同时,应用了Python的serial等模块,使教室计算机可以通过串口按照Excel课表安排完成按时开关机的工作。在实际测试中,系统运行良好,在一定程度上减少了教室管理员的工作量。所设计的软件是以本地计算机系统时间为操控设备的基准时间,因此在实际应用中需注意主板电池、系统时间设置的匹配性。