陈 科,苏鲁阳,杨笔锋,
(1.成都信息工程大学,四川 成都 610225;2.中国气象局大气探测重点开放实验室,四川 成都 610225)
近些年,对于不少在校大学生而言,度过了高考大关,似乎已经厌倦了课堂学习和思考问题。即使是一名优秀的高校教师也难以彻底摆脱课堂的沉闷气氛。如何让更多人参与到知识探索中成为当前高校教育面临的一个问题。教师的教学水平对课堂固然有一定影响,但是恰当的多媒体支持能让课堂更具有活力。
本文基于ZigBee以及Z-stack协议栈对协调器、终端节点、路由器进行了程序设计,设计了一套应答系统。将整个ZigBee网络的协调器作为教师端模块,用于建立网络、引导其他模块加入网络以及管理学生端,并通过串口与上位机进行交互操作;将ZigBee网络的终端节点作为学生端,无线发送来自学生的输入信息,无线接收来自教师端的信息;将ZigBee网络的两个路由器分别作为指纹识别模块以及副协调器,前者传输指纹信息,后者接收来自主协调器的状态信息,当主协调器异常时,副协调器将对其进行替换,保证系统稳定。上位机同步来自服务器的课程信息,对各个终端节点进行组网配置,避免教室之间的错误入网现象。
系统整体流程如图1所示,每间教室都有一个主协调器用于搭建网络并与上位机进行通信,备份协调器用于异常处理[1]。当一堂课快要开始时,教师登录上位机软件,学生进入教室,并通过指纹模块进行签到。在学生签到后,指纹ID信息通过无线发送给协调器。协调器接收到指纹ID后,通过串口反馈给上位机[2]。上位机软件会显示学生的实时签到信息。
签到完成后,学生用学生端模块,在确保成功连入ZigBee网络的情况下,用学号进行登录。上位机对登录信息进行识别,若发现输入有误或者这堂课上没有该生信息,立即反馈给学生端错误信息,并不予登录;反之,学生端模块将进入答题界面,准备答题或是表决。
图1 系统总体流程
当课程结束时,上位机软件下达下课指令,所有终端节点切换自身的个域网地址并重启,为下一堂课做好准备。
TI的Z-Stack协议栈从总体上来看主要由三部分组成:硬件抽象层(Hardware Abstraction Layer,HAL)、操作系统抽象层(Operating System Abstraction Layer,OSAL)和ZigBee协议各层。
在整个Z-Stack系统运行时,主函数主要完成两个任务。其一,整个系统的初始化,其中涉及HAL中各个硬件模块的初始化;其二,系统进行网络配置和任务优先级的划分。
图2所示为系统启动流程,首先屏蔽所有中断,在经历底板、IO、硬件驱动、非易失存储器等硬件相关的初始化后,通过OSAL的初始化函数进行系统初始化操作,这包括存储器、定时器等;之后通过任务初始化函数进行网络配置和任务分级,并对系统任务和用户任务进行初始化操作[3];最后通过OSAL启动函数进入轮询状态,不停地监听任务事件的触发,并跳转至任务执行函数。所有用户想触发的事件必须要注册登记,以此绑定事件与用户任务,这样当事件触发时,比如按键按下时,系统才能从轮询中正常跳转至用户的执行函数[4]。
图2 协议栈系统流程
整个系统的软件部分包括上位机、协调器、路由器以及各个终端节点的程序设计[5]。本文主要在ZigBee2007版协议栈的基础上对后三者的流程进行讲解,对其中涉及的液晶屏、按键、指纹传感器等模块只做简略介绍,并不深究其控制代码。
为了方便管理,本系统对每一个设备设置了一个8位ID,协调器设置为0x00[6]。整个软件流程如图3所示,协调器上电后,在完成协议栈的各项底层初始化操作后,开始组建网络[7]。主协调器搭建起了整个网络,以2.4 GHz作为此方案的通信频段,选用16号信道,引入节点和路由器,构建树型网络。2.4 GHz频段下,在一个教室内部进行无线通信,其通信质量是可以得到保证的[8]。
之后,系统进行所需模块的初始化,主要有以下3点:
(1)完成液晶屏的初始化界面显示。协调器现阶段几乎不会用液晶屏和按键,因此对于协调器而言,液晶屏目前仅仅为其显示连接状态,按键也仅仅留出硬件接口,以便后续功能补充。
(2)进行端点描述、地址类型结构体的参数配置。对于端点,一个设备上可以拥有多个端点,它的作用主要是将不同的无线任务进行分类。当某个设备在接收数据包时,首先匹配短地址,成功后再由底层解析并分发给对应端点,如端点不匹配则直接丢弃。在本项目中,所有设备的端点号都设为8。
图3 协调器软件流程
而地址类型结构体,即afAddrType_t,是对端点、目的地址、发送模式、个域网地址的一种包装。在配置好这样一个结构体之后,用户在使用无线传输函数进行无线数据发送时,可以很方便地调用。为了让整个网络的无线传输数据分类更加清楚,本项目定义了三个这样的结构体,对应三种传输情况,协调器用到了两种:广播(教师端向所有学生端发送信息,便于题目的下达)和单播(教师端向单个学生端发消息,便于单独抽问)。
(3)进行串口的初始化与注册。对于串口,本项目利用协议栈中的调试层,对串口进行简单快捷的处理。因为调试层中有许多调试接口能与各层进行直接通信,利用串口,联系上位机与用户任务显得更加方便。
在完成初始化之后,系统将进行轮询状态。但本项目中加入了定时触发事件,主协调器将对副协调器定时每10 s发送一次状态信息,当副协调器连续3次未收到数据时,系统将认为主协调器工作状态异常,副协调器将执行切换操作。
如果系统收到无线数据,也将跳转执行函数,并根据预先设置好的帧标志位,判别接收信息的类别,然后对信息进行加工,并通过串口向上位机上传;同理,如果收到来自上位机的串口信息,也将判别指令类型,然后再控制各个学生端进行操作[9]。
具体而言,上位机通过云端同步更新上课信息和指令信息。如图3所示,上位机目前有7种命令格式传递给协调器,协调器接收3种来自其他节点的信息。
在提问环节中,上位机目前支持的操作大致为:允许答题、禁止答题、单独抽问、随机分组、开启答题倒计时,基本满足课堂应答的所需。
登录认证是为了对学生端的登录信息进行校对并及时反馈。
下课指令不仅为了清除当前课堂的残留数据,也更新了学生端的内在组网配置,为下一次连接做准备,避免设备错误入网。
与协调器一样,为了方便管理,对每一个终端节点设置了一个8位ID,从0x01开始命名,最大0xfd。整个节点软件流程如图4所示,节点上电后,在完成协议栈的各项底层初始化操作后,开始根据当前个域网地址值搜索网络并加入,同时初始化用户任务函数。之后,节点将进行重连检测。若在之前设备未登录,则进行正常的登录操作,进入答题界面答题并准备执行教师端所发指示;若在之前设备异常断电,则将跳过登录操作,并恢复一些数据。
图4 节点软件流程
节点上主要使用的两个硬件模块是液晶屏和矩阵键盘。液晶屏采用SPI接口接入协议栈,将一直引导用户进行相应的操作。协议栈本身针对几个独立按键进行了定义,本设计用到了其中两个独立按键,其中一个作为整个矩阵键盘的扫描启动开关,学生在输入前需要先按下此键才能正常输入;另外一个则作为手动复位的按钮,按下后,可以清除所有信息,包括Flash中保存的内容。但根据项目的需求,硬件上又加入了4×4矩阵键盘,占用P1口共8个端口,支持16种字符的输入,包括:0~9十个数字,A~D四个字母,*和#两个功能按键。
3.2.1重连检测
在初始化完成后,实际上因节点设备入网状态的变化(从未组网变为终端节点),系统将退出轮询去处理执行函数。系统判定入网设备的类型,如果是终端节点,则会进行重连检测。具体而言,用接口函数读取Flash中的重连标志位。
如果其值为1,则表示该设备之前已入网,需进行界面恢复。该设备将恢复到之前答题界面,并且读取Flash,然后将分组信息、倒计时信息也复原;如果其值为0,则表示上次是正常断电。系统将进行正常登录操作,等待学生信息的录入。
3.2.2显示界面
主要设计的界面是登录界面和答题界面,当然还有一些其他反馈界面。
在登录界面,本项目需要学生首先按下矩阵键盘的启动按键,再通过矩阵键盘输入自己10位学号信息,以*键作为退格键,#键作为确认键。发送后,等待协调器进行认证反馈。认证成功,则液晶屏显示“登录成功”,进入答题页面;反之,则液晶屏显示“登录失败”,重新进入登录页面。为防止误发送,在软件后台进行了发送限制,当输入位数少于10位或包含其他字符,#键将失效。
在答题界面,节点将向协调器发送答题信息。但首先需要接收来自协调器的答题指令,当节点收到允许答题指令时,节点内置的答题开关(一个布尔型的变量)将开启;同理,当收到停止答题指令时,此开关将关闭。用户需要在这段时间内根据投影仪或PPT所示的题目,键入答案并发送。这是节点最主要也是最基本的输入界面,答案长度最大16个字符。
3.2.3其他指令的操作
除了允许答题和关闭答题这两个基本操作外,系统还有其他指令。
当协调器收到上位机的随机抽问命令,则会随机开启某一个节点答题开关,让其答题。当然,这个过程会有相应的蜂鸣器和LED闪烁进行提醒。
随机分组指令让所有在场学生平均并且随机地分成几个小组,小组编号将在节点的答题界面上进行显示。
开启倒计时是让答题者在限定时间内答题,时间一到,节点便会停止作答,倒计时也将显示在节点的液晶屏上。倒计时功能采用协议栈的事件定时触发函数进行操作,时间参数为1 000,即1 s触发一次,事件每次触发将更新液晶屏上的显示时间,基本实现了时间同步。
对于下课指令,上位机可以向云端同步信息,从而得知班级下一个上课地点的网络地址。这样上位机就可以通过协调器控制所有节点软切换其网络配置,从而达到切换教室的效果,避免教室之间可能出现的误组网问题[10]。
其具体切换流程为:各个节点从协调器获取到新的网络地址,然后调用接口函数写入并更新自身的网络地址,再清空重连标志位和分组信息,避免再次链接时出现问题,最后进行软件重启。
在本设计中,路由器充当两个重要模块,自定义的8位ID分别是0xfe和0xff。下面分别讲解这两个模块。
3.3.1副协调器软件流程
副协调器要想替换主协调器,自动组建和维持ZigBee网络,并让之前网络中的其他节点继续工作,必须复制网络的关键参数,这些参数包括个域网地址、信道信息和网络邻居表。其中个域网地址和信道信息相对简单,为了让网络邻居表也简单一些,此项目中副协调器将不引导其他节点加入网络。
由于副协调器一开始就和主协调器在一个网络中,因此个域网地址和信道与主协调器一样,不用处理。主协调器定时向副协调器发送状态信息。实际上,这个信息就是主协调器通过系统接口函数获取到的邻居表,经过包装之后得到的信息帧。副协调器将该信息存储在Flash中,一旦发生异常,则将Flash中存储的设备间关系信息通过内置函数进行恢复,用副协调器重新启动网络。
如图5所示,副协调器在进行一系列初始化后进入轮询。正常情况下只需要接收状态信息,并且计算与上一次接收的时间差。若超过30 s未收到数据,则进行协调器的切换。
图5 副协调器软件流程
3.3.2指纹模块软件流程
本项目通过串口将指纹传感器和ZigBee模块联系起来,组成一个指纹采集模块[11]。
指纹录入时,ZigBee模块发送读取图像指令,然后传感器开始读取检测到的指纹图像,一段延时之后,再发送生成指纹特征指令,传感器进而将生成指纹特征。二次录入时,也将生成一个指纹特征。接着ZigBee模块发送模板特征比对指令。如果比对成功,则生成指纹模板,分配ID并存储;若失败则重新录入。
检测指纹时,与指纹录入时一样。ZigBee模块同样需要发送读取图像指令和生成指纹特征指令,从而获取指纹特征。ZigBee模块发送搜索指纹图像指令。若比对成功,则向协调器发送指纹ID;若失败,则重新录入。
在上课之前,ZigBee模块通过云端同步学生的指纹信息,并对指纹库进行更新。所以当学生进行签到时,只需比对相应信息,若比对成功,将无线发送特征指令。
如图6所示,指纹模块也需要加入到整个网络,所以也要初始化协议栈。之后,模块等待学生的指纹录入,当检测到指纹图像时,向传感器获取指纹特征。与库信息进行比对后,获得其指纹ID,无线转发给协调器,等待下一次的指纹签到。
图6 指纹模块软件流程
本文基于ZigBee设计了一套教学应答系统,主要说明了其中ZigBee软件部分,对其中多个模块的运作进行了分析。目前该系统已有一些基本功能,能够基本满足课堂需求。在实际使用中,上位机与协调器的通信无异常,能够正常收发指令。各个教室内的ZigBee网络通信顺畅,且没有错误入网现象。对于后续的扩展,可以考虑从手机入手,让手机与云端相连,从而在课下为学生提供查漏补缺的机会。