测震台站产出的观测数据是地震速报与相关地震数据分析研究工作的基础,其运行质量好坏将对后续各项工作产生直接影响。在测震台站运维工作中,保障台站数据正常传输是其中一项重要工作内容。北京市测震台站通信状态监视通过JOPENS系统集成的Monitor软件实现。当台站通信中断时,Monitor软件发出报警,值班人员记录中断台站信息,并告知运维人员。现阶段,人工方式已不能满足自动化运维工作需求,有必要加以改进。
目前,微信在个人社交网络中占据着举足轻重的位置,2017年第二季度腾讯财报显示,微信和WeChat的合并用户数已达9.63亿,且八成用户在微信上有工作行为(腾讯科技,2017)。随着微信活跃用户的增多,微信已成为重要的沟通工具。基于微信公众号平台的地震信息服务系统、台站运维服务系统等(叶佳宁等,2014;徐丹等,2016;魏艳旭等,2016;贾宁等,2016)相继开发,在信息发布、运维管理和运维经验总结等方面取得一定成效。但是,基于公众号的开发需要一系列认证、开发经验及较高的编程语言开发水平(如PHP语言、MySQL数据库、计算机网络通信、HTTP/XML/CSS/JS等),且公众号软件系统的移植需要软硬件支持,如服务器、http地址申请等。因此,对于期望实现简单的台站监视、小范围信息发布的需求而言,公众号开发的实现成本相对较高。
Python是一种解释型的、面向对象的高级程序设计语言,模块丰富,可以根据需要轻松实现目标功能。根据地震台站运维工作的实践和需求,笔者使用基于Python的itchat、APScheduler、telnetlib、xlwt等模块进行开发,实现对地震台站通信状态的监视,以及对监视结果的存储和发布,改善运维人员对地震台站通信状态信息的获取方式。该服务只需个人用户扫码登录认证,无需考虑复杂的接口编程问题。本服务功能定位明确、易于扩展,无需硬件服务器、http地址申请,使用Python及其模块即可快速实现目标功能。
1 服务结构测震台站通信状态监视与信息发布服务的各项功能由APScheduler进行调度管理,在预定时间对台网全部台站进行巡视。具体而言,在运行时,通过Telnet到JOPENS 0.5.2的5000端口获得台站通信状态。如果台站通信正常,状态为1,反之为0。对于状态为0的台站进行ping测试,确认是延时过大还是通信中断,并根据ping结果进行分类。将巡检返回结果进行规范化,存入台站通信状态表格,并将状态信息组合为简练文字,通过微信发送给相关人员。服务结构见图 1。
为了实现本服务的预期目标,需要多个模块的分工配合。该服务涉及telnetlib模块、itchat微信接口模块、xlwt电子表格模块、APScheduler调度模块等4个模块,各模块需要进行安装并通过import导入才能使用。
2.1 telnetlib模块使用Telnet工具可以对JOPENS 0.5.2中台站通信状态进行检查。采用telnetlib模块可实现该功能。telnetlib模块提供一个执行Telnet协议的Telnet类及有关方法。通过构建Telnet类的对象(需提供待连接服务器IP、端口等)与服务器建立连接,并通过类中的read_*和write等方法与服务器进行交互,即可获得服务器返回的有关信息(Finer,2017)。
2.2 itchat微信接口微信用户活跃数量大,本应用采用微信作为信息发布的主要方式。itchat是一个开源的个人微信号接口。模块安装后,通过Python可以简单地调用微信接口,使用手机扫码登录即可实现信息发布。模块可处理文本、图片、小视频、地理位置、语音等信息,满足信息发布需求。
2.3 xlwt创建电子表格库电子表格作为数据分析的重要工具,在台网运维工作中发挥着重要作用。采用xlwt库创建excel文件(xls格式电子表格文件),与微软Excel 95至Excel 2003兼容(Machin,2017)。
2.4 APScheduler调度框架为了实现定时巡视台站的功能,采用APScheduler框架进行工作任务调度。APScheduler(Advanced Python Scheduler的缩写)是Python的一个库,实现了在预定时刻或以周期性方式执行任务,且可根据需要轻松添加新的任务或删除旧任务。APScheduler有3种内置调度方式,即cron风格、周期性和一次性方式(Melentev,2017)。
3 功能实现 3.1 台站状态获取为了获得台站通信状态,使用telnetlib库构建与JOPENS 0.5.2系统的连接,通过执行“stat monitor”命令获得被监视台站的状态信息。具体实现步骤如下:导入telnetlib库后生成Telnet对象,使用该对象的open方法打开主机及端口,等待主机做出响应,而后由程序自动输入用户名、口令、命令,从而获得命令的查询结果。
import telnetlib
tn = telnetlib.Telnet()
tn.open(HOST, PORT) #打开服务器HOST的PORT端口
tn.read_until(‘ready.’)
tn.write(‘user ‘ + USER + ‘\n’) #输入用户名
tn.read_until(USER + ‘.’)
tn.write(‘pass ‘ + PASS + ‘\n’) #输入口令
tn.read_until(‘logged in.’)
tn.write(COMMAND + ‘\n’) #输入检查命令
checkresult = tn.read_until(‘211 End’) #返回检查结果
3.2 微信发布实现微信发布需要3个步骤:①导入itchat模块;②登录,即执行itchat_auto_login(),系统弹出二维码,用户扫描二维码以个人身份实现网页版微信登录;③发送信息。部分代码如下
import itchat
itchat.auto_login(hotReload=True)
itchat.send_msg(‘待发送信息’, ‘监测中心’)
特别要注意的是,需要将“监测中心”这个发送对象在个人微信通信列表中置顶,否则itchat可能找不到该发送对象,进而导致发送失败。
3.3 监视结果保存通过微信可查阅监视结果,见图 2。为便于统计分析地震台站通信状态,使用excel电子表格保存数据(图 3)。为使表格更具可读性,对其适当进行格式化:①增加表头——由检查时刻和台站名称构成;②对单元格做样式处理,通过颜色区分不同通信状态的台站。具体实现步骤如下:导入xlwt模块,生成workbook对象,在用add_sheet方法添加sheet后,对表格中相应单元格进行写入操作,保存即可。
import xlwt
#设置表格样式
styleRedBkg = xlwt.easyxf(‘pattern: pattern solid, fore_colour red; ‘)
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet()
#对(1,1)单元格写入‘通信中断’,并应用样式
worksheet.write(1, 1, ’通信中断’, styleRedBkg)
workbook.save(‘result.xls’)
3.4 定时任务为了实现对台站通信状态的自动巡视,尽可能缩短运维人员的响应时间,采用以1小时为周期的主动检查,即采用周期性任务调度方式开展服务。具体实现步骤如下:导入BlockingScheduler调度器,生成一个调度对象,为该对象添加需要调度的任务,并确定任务调用的方式,启动调度对象。之后,添加的任务就会在APScheduler的调度下按时执行。
from apscheduler.schedulers.background import BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(SendChatRoomsMsg, ’cron’, hour=’0, 8, 17’, kwargs={‘name’:’监测中心'.decode(‘utf8’)})
scheduler.start()
4 结束语地震台站通信状态监视服务的实现,使北京市测震台站通信状态的监视工作初步实现自动化。采用微信作为发布媒介,有效改善了台站通信状态信息获取方式;借助excel的强大功能,通过自动保存的通信状态表格,可以为台站工作状态的进一步分析处理提供可能。此外,随着JOPENS 6.0的发布,基于http协议的接口使得从JOPENS系统获取信息更为便捷,有利于运维人员对地震台站运行质量开展进一步监视工作,提高工作效率,改善台站运行质量。为了使本文述及的软件可以更好地服务于测震台网运维工作,欢迎读者索取源程序并给予批评指正。
感谢北京市地震局白立新副研究员、王占英高级工程师对本文撰写提出的宝贵意见。
贾宁, 孙哲, 韶丹. 地震速报微信自动推送系统设计[J]. 地震地磁观测与研究, 2016, 37(2): 165-170. | |
腾讯科技. 腾讯2017年上半年总收入1061. 58亿元同比增长57%[EB/OL]. [2018-01-03] http://tech.qq.com/a/20170816/043852.htm. | |
魏艳旭, 刘晓丹, 贾军鹏, 等. 河北地震官方微信公众服务平台[J]. 地震地磁观测与研究, 2016, 37(2): 171-176. | |
徐丹, 韩艳杰, 张诺男, 等. 地震信息微信公众平台服务开发[J]. 地震地磁观测与研究, 2016, 37(1): 146-150. | |
叶佳宁, 何霆. 地震信息微信自动发布系统的设计与实现[J]. 华北地震科学, 2014, 32(4): 23-28. DOI:10.3969/j.issn.1003-1375.2014.04.005 | |
Finer S. telnetlib-Telnet client-Python 2. 7. 16 documentation[CP/OL]. 2017-12-30[2018-01-03] https://docs.Python.org/2/library/telnetlib.html. | |
Machin J. xlwt PyPI[CP/OL]. 2017-08-22[2018-01-03] https://pypi.python.org/pypi/xlwt. | |
Melentev N. Advanced Python Scheduler[CP/OL]. 2017-12-13[2018-01-03] http://apscheduler.readthedocs.io/en/latest/. |