郑红党, 刘灿斌, 孙彦景, 李 松
(中国矿业大学 信息与控制工程学院, 江苏 徐州 221116)
随着“三网融合”的提速,手机、数字电视、信息家电、网络电话、汽车电子、医疗电子等行业成为嵌入式系统的重要应用领域[1-3]。尽管高校开设了嵌入式系统课程,但学生的软件开发能力仍显不足[4-5]。因此,相关实验教学需更具直观性和实用性[6],使学生能够掌握嵌入式软件开发的方法,具备计算机网络、图形界面设计、嵌入式服务器等技术的研发能力[7]。
常用嵌入式操作系统有Linux、Windows Mobile、VxWorks等。Linux开放源代码,有GNU下的各种开源软件的支持,且支持几乎所有的嵌入式CPU,具有低开发成本、高开发效率的优势,是目前应用最为广泛的嵌入式操作系统[8]。本文基于Linux操作系统设计了远程控制系统综合实验。下位机的应用软件基于Linux操作系统开发,搭建了可外网访问的Web服务器和简单的图形界面;上位机应用软件基于Web和Electron技术开发,构建了桌面应用程序。
远程控制系统综合实验的功能为:用电脑或手机对嵌入式开发板中的LED灯、蜂鸣器和电位计进行远程控制和状态显示,嵌入式开发板也可通过操作本地LCD面板界面控制设备和显示设备状态。设计包括上位机和下位机两部分,如图1所示。
图1 系统设计
上位机提供桌面应用程序,对下位机中的LED灯和蜂鸣器进行远程控制,并显示下位机的状态以及辅助性说明等内容。
下位机硬件采用三星Exynos4412嵌入式平台,软件设计选用Linux操作系统,运用QTE技术设计LCD面板的图形用户界面(GUI)。用户可通过GUI操作,实现对下位机中LED灯、蜂鸣器的控制,实现电位计的数据采集,并在LCD面板中显示各设备状态。下位机还需搭建Boa Web服务器并使用内网透传技术实现上位机的远程访问。
综上,实验内容具体包括:
(1) 嵌入式Linux开发环境的搭建及操作系统移植;
(2) 设备驱动程序的开发;
(3) 嵌入式图形界面的设计;
(4) 嵌入式Web服务器的搭建;
(5) 内网透传技术的实现;
(6) 上位机软件设计。
有关嵌入式Linux环境的搭建、移植及设备驱动设计方面的文献较多,本文不再赘述,重点介绍上述(3)—(6)项内容的实现。
采用QTE(Qt/Embedded)平台设计面板的图形界面。QTE是Qt平台专门针对嵌入式Linux提供的API,可在嵌入式环境下构建GUI图形界面。Qt Creator是跨平台的Qt集成开发环境(IDE),有良好的图形界面,通过“所见即所得”的开发方式,放置好控件并进行参数设定,即可生成Qt界面的XML文件[9]。
QMainWindow控件是窗体控件,是图形界面的载体。根据开发板平台显示面板的分辨率,设置窗体的长宽为480×272像素,并且删除无关的标题栏、信息栏、选单栏、达到简约的效果。
下位机布置了3个Check Box控件:checkBox_led1、checkBox_led2、checkBox_beep,Check Box控件有“勾选”和“未勾选”两种选择,分别表示2个LED灯和蜂鸣器运行与否。
QLCDNumber控件是一个类似数码管显示效果的数字显示控件,它支持配置显示样式以及数字的位数。该实验中,能实时显示电位计的AD采样值,实例化为LCDNumber。
Label控件是可以显示图片、文字的标签控件。在完成上述主要控件布置后,需要对软件名称、按键操作、显示数字进行指引,故添加了若干Label控件。
信号和槽是Qt自行定义的一种通信机制,应用于对象之间的通信[10]。当某个信号对其客户或所有者的内部状态发生改变,信号则被对象发射,和其相关联的槽将被即时执行,就像一个正常的函数调用。信号和槽的关系如图2所示。
图2 信号与槽
设计中一共有3个控制控件及1个数字显示控件,信号与槽的设计见表1。为实现电位计数值的动态变化,采用Timer定时器每隔500 ms触发一次timerEvent事件。
表1 信号与槽函数对应关系
在MainWindow.cpp窗体对象中,进行Signal和Slot的连接:
connect(ui->checkBox_led1,SIGNAL(toggled(bool)),
this,SLOT(LED1_Toggle()));
connect(ui->checkBox_led2,SIGNAL(toggled(bool)),
this,SLOT(LED2_Togg,le())); connect(ui->checkBox_beep,SIGNAL(toggled(bool)),
this,SLOT(BUZZER_Toggle()));
startTimer(500);
对应的check_Box_ledx发出toggled信号,将执行LEDx_Toggled()函数:
LEDx_Toggled()
{LEDx=~LEDx;
if(LEDx==0)
{ioctl(fb_led,1,1);}
else
{ioctl(fb_led,0,1);}
}
为实现上位机(本地计算机或手机)的远程控制,搭建了BOA服务器。BOA是一个小型的嵌入式Web服务器,可以有效减少资源的占用,提高Web服务器的稳定性与可靠性,支持CGI编程和单线程处理用户的访问[11]。
为实现上位机与下位机不在同一局域网内的远程控制,设计中搭建了NGROK服务器,使用内网透传技术实现局域网内的服务器被外网访问。NGROK是一款开源的软件,内网透传的原理为反向代理。服务端要求有公网的IP地址,内网设备有相对固定的访问接口,内网与公网NGROK服务端之间建立通道,进行反向代理,实现对客户端的动态域名解析[12]。
从NGROK官方网站ngrok.org可以得到免费的NGROK服务,下载对应平台的客户端并运行,就可以通过域名访问内网的资源。设计中将本地的80端口映射为test.ngrok.cucb17.cn。
下位机软件包括BOA服务器和QTE的GUI软件。模拟Linux设备驱动程序的方法,使用了共享文件的方式实现两者的通信,程序流程如图3所示。
图3 程序流程图
使用Web技术设计上位机界面,再用Electron构建一个桌面应用程序。Electron是使用Web前端技术开发跨平台桌面应用的开源库,它将Chromium和Node.js整合为一体,由Chromiun负责渲染前端界面,Node.js负责后台的数据处理,并支持将Electron环境下运行的程序打包为Mac,为Windows和Linux系统下无环境依赖的桌面应用程序[13]。
上位机界面包括控制操作以及下位机状态显示。根据需求,将上位机界面划分为几个区域:
(1) 标题信息区:用于显示基本的标题和信息;
(2) 控制操作区:用于显示控制界面;
(3) 数据接收区:用于接收下位机返回的数据;
(4) 时延显示区:用于显示连接时延;
(5) IP配置区:用于进行远程IP地址的配置。
使用属性,添加了访问设备地址的选择区域。访问设备地址IP有2种选项:(1)本地控制,上位机与下位机在同一局域网内;(2)远程控制模式,NGROK服务器主机位于纽约。
根据手机和PC端的两种应用场景,分别进行界面布局。以手机为例,手机通常是屏幕较小的手机,竖屏显示,其典型的显示分辨率为360×640像素,界面设计如图4所示。
图4 手机控制界面
桌面应用程序实际运行方式为命令行,输入eletron main.js执行,main.js为主程序。配置窗体信息以及进行数据处理的主要代码如下:
function createWindow() {
mainWindow = new BrowserWindow({width: 360, height: 640})
mainWindow.loadURL(url.format({
pathname:path.join(__dirname, ′index.html′),
protocol: ′file:′,
slashes: true
}))
……}
基于Linux远程控制系统的综合实验内容既有Linux系统移植、驱动开发基本实验,也有应用层软件嵌入式图形界面、Web服务器以及上位机应用程序的开发实验。通过LCD面板界面和上位机软件可同时控制LED灯和蜂鸣器并显示其状态,实验结果具有直观性。