1、dianzi yuanqijian yu xinxijishu 电 子 元 器 件 与 信 息 技 术114|树莓派开关监控软件的实现与教学示范汪文彬,陈德祥,马玉春(通信作者)海南热带海洋学院计算机科学与技术学院,海南三亚,572022摘要:Python语言功能强大,树莓派也广泛应用于高校学生的扩展学习和各种竞赛。本文利用继电器扩展板实现了一个基于树莓派的可视化开关监控软件,灵活应用Python的列表表达继电器及其状态,综合应用了多线程和定时任务,软硬结合,具有一定的趣味性和实用性,既可用于Python的教学,也可用于树莓派的扩展学习。关键词:树莓派;Python;多线程;定时任务中图分类号
2、:TP311.5文献标志码:ADOI:10.19772/ki.2096-4455.2023.1.027 0引言Python语言跨平台,简单易学,具有独特的数据类型,开发环境种类较多,第三方类库也比较丰富,安装方便,广泛应用于大数据处理和人工智能等领域。在Python程序设计教学中,主要讲授基本的数据结构和程序语法,很少涉及多线程和定时任务的处理,以及对硬件的监控。树莓派是一种卡片式计算机,只有信用卡大小,现在的4B版本已经内建8G内存1。树莓派具有40个引脚的排针,可以进行各种硬件扩展,从而用于多种环境下的监控。树莓派内建Python开发环境,本文使用微雪电子生产的RPiRelayBoard(
3、树莓派继电器扩展板),结合第三方Python类库对扩展板的继电器开关进行监控,从而实现对Python扩展学习。1引脚定义树莓派的排针用于“通用输入与输出”(generalpurposeinputoutput,简称GPIO),允许对树莓派进行扩展,可以方便地通过RPi.GPIO类库对GPIO引脚进行控制(高电位或低电位),但是,有两种引脚编号方式,第一种按照排针顺序,引脚从1至40进行编号;第二种根据连接到BCM2835CPU的逻辑来编号,序号又有差别,例如,BCM2835CPU的GPIO16引脚对应树莓派的第36引脚2。树莓派有两个5V引脚、两个3.3V引脚、8个GND引脚,控制GPIO电位时
4、,可以用来驱动发光二极管。如果需要通过树莓派来控制市电开关,则可以使用微雪电子生产的继电器扩展板,如图1所示。图 1树莓派继电器扩展板图1所示的继电器可以控制220V/5A的设备,继电器使用GPIO25、GPIO28和GPIO29引脚,分别对应树莓派排针的37、38和40引脚,通过跳基金项目:本文系 2021 年度海南省高等学校教育教学改革研究项目(项目编号:Hnjg2021-86);2019 年三亚市院地科技合作项目(项目编号:2019YD18)作者简介:汪文彬,男,硕士,教授,研究方向:进化计算与软件测试。通信作者:马玉春,男,博士,教授,研究方向:移动应用与计算机监控技术。电 子 元 器
5、 件 与 信 息 技 术|115软件和信息技术服务线将这些引脚分别连接到扩展板的CH1、CH2和CH3通道,即所标示的三个继电器(从左到右),每个继电器外接两个开关(见接线端子),左侧为常闭开关,右侧为常开开关。2类库安装与编程实现RPi.GPIO类库一般预装在新版树莓派中,如果没有发现该类库,可以在命令行下通过系统权限安装,如下第一条命令更新系统索引,第二条命令更新系统软件,解决依赖问题,第三条命令安装RPi.GPIO类库,重新启动后即可生效。sudoapt-getupdatesudoapt-getdist-upgradesudo apt-get install python-rpi.gpi
6、opython3-rpi.gpio一般通过命令“importRPi.GPIOasGPIO”导入GPIO类库,相对于图1所示的继电器扩展板,一个典型的开关操作函数switchOnOff如下所示,第一个参数为GPIO编号,如果对应继电器CH1,采用树莓派引脚顺序为37;如果采用BCM编号,则CH1定义为常量25即可;第二个参数status表示需要控制的状态。GPIO类库函数setmode用来设置引脚编号方式,BOARD采用排针顺序,BCM则采用CPU编号;函数setup用来设置指定引脚的工作方式,OUT表示输出控制,IN表示读取开关状态;函数output用来控制输出引脚,LOW表示低电位(使得继电
7、器扩展板的常开开关闭合),HIGH表示高电位(使得继电器扩展板的常开开关断开)。defswitchOnOff(relay,status):GPIO.setmode(GPIO.BOARD)#GPIO.BCMGPIO.setup(relay,GPIO.OUT)#GPIO.INGPIO.output(relay,status)#GPIO.LOW/HIGHGPIO.HIGH可以用True或1来表示;同理,GPIO.LOW也可以用False或0来替代。读取开关状态通过input函数来完成,使用relay作为参数,返回True或者False表示电位的高或低。完成对开关的操作后,需要调用cleanup函数(
8、无参数)来释放资源。3多线程与定时任务多线程可以提高程序运行效率,增强用户体验效果,避免程序假死。文献3对某开关量模块进行输出测试,逐个闭合输出开关,最后统一关闭,恢复初始状态。这里也采用类似的方式对图1所示的开关进行测试,在函数testThread中启动多线程,对开关进行测试。只需使用threading模块的Thread类生成多线程对象,然后调用start方法启动多线程。多线程对象中的target参数指明实际需要执行的程序,args参数可以给出元组形式的参数列表,kwargs参数可以给出字典形式的参数列表,args和kwargs可以省略。fromthreadingimport*deftest
9、Thread():threadTest=Thread(target=testSwitch,args=(),kwargs=)threadTest.start()在函数testSwitch(定义略)中调用上一节介绍的switchOnOff函数,通过一个循环,间隔1秒逐个闭合开关;然后再通过另一个循环,逐个断开开关(延迟为0秒)。循环元素通过序列CH1,CH2,CH3来实现,逐个枚举,元素中的具体数值根据GPIO.setmode方法设定的编号方式进行调整。开关闭合以后,需要延迟断开,用于定时操作,这可以通过scheduler对象来实现,该对象需要提供一个时间函数用于计时,另外一个函数用于延时。如下所
10、示的schedOnOff函数中即生成了一个scheduler对象s,通过enterabs方法设置定时函数,其中第一个参数是未来时间,以秒为单位,这里通过time.time()函数获得当前时间(以秒为单位),加上需要间隔的分钟数(nMinutes)乘以60即可;第二个参数为优先权,这里为1;第三个参数是需要在nMinutes分钟以后执行的函数,这里为开关函数switchOnOff;dianzi yuanqijian yu xinxijishu 电 子 元 器 件 与 信 息 技 术116|最后一个参数是一个元组,代表所需要执行函数的参数。定时函数设置完毕,即可调用run方法启动scheduler
11、对象。importsched,timedefschedOnOff(relay,status):s=sched.scheduler(time.time,time.sleep)s.enterabs(time.time()+nMinutes*60,1,switchOnOff,(relay,status,)s.run()文献4中的漂流浮标用来记录河流或洋流变化,每过5分钟将轨迹发送到电子信箱,即是通过该定时方法将轨迹文本打包发送的,这样,即使浮标丢失,数据也可得以保存。4软件测试将图1所示的继电器扩展板通过排针与树莓派连接,利用Python自带的tkinter模块完成GUI布局。创建一个表达开关状态的
12、Frame框架,其中放置Status标签,三个Entry文本输入框(只读),用于表示三个开关的状态;再创建一个开关操作的Frame框架,其中放置【Test】按钮,用于测试三个开关,一个Entry文本输入框,用于输入需要闭合开关的分钟数,下拉框用于选择一个通道(即继电器或开关),【Charge】按钮用于闭合所选择通道,并在时间到时断开开关。如图2所示,点击【Test】按钮后,三个开关间隔1秒逐个闭合,最后统一断开;点击【Charge】按钮,对通道2充电2分钟后断开,并显示消息框(略),提示结束时间。图 2树莓派开关测试效果5VNC远程控制VNC(virtualnetworkconsole)是虚拟
13、网络控制台,树莓派4B嵌入了VNCServer功能,在【RaspberryPiConfiguration】系统配置菜单的Interfaces(接口)页签下,可以使用VNC功能,这样,运行开关软件的树莓派即可当作VNCServer使用,默认使用TCP/5900端口,防火墙必须先开放此端口,服务器才能接受客户机的连接请求。VNCViewer软件可以充当VNC客户机的功能,用以连接VNCServer,连接成功后,可以在客户机上操作服务器上的软件,就像本地操作一样。但是,客户机与服务器必须位于同一个网段,可以通过Wi-Fi连接到同一个TP-LINK无线路由器上,并进行地址绑定。打开VNCViewer,
14、输入VNCServer的IP地址,连接成功后输入用户名和密码,选择自动保存密码,下次启动即可完成自动连接。可以从文献5下载VNCViewer,其中既有树莓派使用的Linux版本,也有PC机上可以使用的Windows版本。使用VNC服务器和客户机,可以在没有显示器、键盘和鼠标的情况下,远程操控树莓派,在教学实践中有很好的便利性。另外,还可以对树莓派开关软件进行扩展,不使用VNCServer,而是在软件中嵌入SocketServer代码,而在PC端设计SocketClient软件,直接与树莓派开关软件建立连接,从而实现远程监控。6防火墙的处理为了增强操作系统的安全性,一般默认关闭所有端口,然后按需
15、开启。但是,Linux防火墙的iptables过于烦琐,使用ufw防火墙工具可提高效率。可以在命令行状态下,通过命令(1)安装ufw防火墙,命令(2)使能或者禁用防火墙,命令(3)缺省将所有端口关闭,命令(4)开放(下转第127页)电 子 元 器 件 与 信 息 技 术|127人工智能与智能制造报,2022,44(05):1694-1703.2 方宏远,马铎,王念念,等.基于融合卷积神经网络的多种类管道病害检测方法J.北京工业大学学报,2022,48(06):561-571.3 吕成戍.基于双重欠采样代价敏感学习的推荐系统虚假用户检测方法J.系统科学与数学,2021,41(12):3548-3
16、558.4 王巍.网络用户对虚假社会新闻的态度及行为:基于ELM模型的实证分析J.情报科学,2021,39(12):126-132+145.5 李颖,陈龙,黄钊宏,等.基于多尺度卷积神经网络特征融合的植株叶片检测技术J.智能科学与技术学报,2021,3(03):304-311.6 马立新,豆晨飞,宋晨灿,等.基于特征融合卷积神经网络的绝缘子无损检测J.电子科技,2021,34(07):26-30.7 潘顺莉,吴训成,张伟伟.基于传感器融合和方向可调卷积神经网络的车道检测算法研究J.计算机与数字工程,2021,49(05):925-929+941.8 谭侃,高旻,李文涛,等.基于双层采样主动学习的社交网络虚假用户检测方法J.自动化学报,2017,43(03):448-461.(上接第116页)VNC默认端口5900,命令(5)查看防火墙状态,即打开了多少端口,用以查看端口是否开启。sudoapt-getinstallufw(1)sudoufwenable/disable(2)sudoufwdefaultdeny(3)sudoufwallow5900(4)sudoufwstatus(5)7