任姝乐,李昱磊,杨 城,张志鑫,卫丹丹,刘金凤,荀亚玲,王 晓
(1.太原科技大学 计算机科学与技术学院,太原 030024;2.太原科技大学 华科学院,太原 030024)
随着社会信息化的飞快发展,传感器的发展也趋于微型化和智能化。基于传统的电子和集成技术的传感器在信息的获取、传输、处理和存储等方面已经无法满足要求。因光子没有静止质量、消耗能量低、散发热量小、运算速度快,信息存储容量大等优点,研究者将众多的光子器件(如光传感器、光滤波器、光开关、光调制器及光放大器)集成在微小的单片机上,以满足信息技术发展的需求。但是,如何引导光子的传输、局域等问题是研究光子技术中非常重要的问题。人工电磁微结构材料因其特殊的物理性质,能有效的控制电磁波在其结构中传播,为传感器技术提供很好的解决方案[1-4]。基于人工微结构光子石墨烯特殊的光路调控机制,前期设计了光子石墨烯结构安装于微波或红外传感器,便可实现平面内的多方位探测[5-6]。文章在已有硬件的基础上完成了相关软件系统的设计。
1 系统总体设计方案
本文所设计的系统工作流程为:将多方位探测装置在六个方位的探测结果经过处理,通过ZigBee将数据发送给协调器,使得用户可以通过PC、手机、平板电脑等设备访问本地服务器,对系统进行远程控制,使系统不只局限于局域网内[7-9]。总体框架如图1所示。
图1 系统总体设计框图Fig.1 The overall design block diagram of system
图2 Zstack软件流程图Fig.2 Zstack software flow chart
2 软件设计
整个Zstack的主要工作流程如图2所示。
2.1 Web端软件设计
Web部分的设计包括前端与后台的设计,前端包括静态页面与动态页面两个部分,前端部分的程序流程图如图3所示。
图3 前端部分程序流程图Fig.3 The flow chart of the front-end
2.1.1 Web前端静态页面设计
静态页面共设计了三个功能模块,包括串口选择模块、对射传感器信息展示模块以及用于串口数据展示的日志模块。
(1)串口选择模块
串口选择模块包括协调器的串口选择、声光报警器的串口选择和波特率的选择。该模块使用HTML的表单标签进行实现。
(2)对射传感器信息展示模块
对射传感器信息展示模块的设计方案是使用每个对射传感器占用一行,表明传感器类型与编号,使用背景色区分是否检测到障碍物,如果检测到则背景色为红色表示警告,如果无障碍物则背景色为绿色表示安全。
该模块的设计方案是采用实时刷新的方式,不断使用新的数据去覆盖旧的数据,保证数据的时效性。
核心代码如下:
if (data[i].type == '光子石墨烯红外对射传感器') {
if (data[i].state == '有障碍') {
zigBeeCard = zigBeeCard
+ ""
+ data[i].type + data[i].typeId + "";
} else if (data[i].state == '无障碍') {
zigBeeCard = zigBeeCard
+ ""
+ data[i].type + data[i].typeId + "";}}
$("#ZigBeeCard").html(zigBeeCard);
(3)日志模块
日志模块的设计方案为使用HTML的表单模块进行实现,表头包括日志编号、传感器类型、传感器同类型编号、传感器信息以及日志记录的时间,核心代码如下:
在日志展示模块中将其设计成固定高度的表格,实时生成最新日志,不覆盖原有日志,并保证表单滚动条总是处于底部,用来展示的最新日志内容。
2.1.2 Web前端动态页面设计
动态页面使用Ajax进行实现,共有4个方法,包括提交串口选择模块信息并打开串口的openPort方法,用于关闭所有已经打开的串口的closePort方法,用于向后台发送请求之后从后台接收串口数据的readFromPort方法,还有用于检测后台是否已经打开串口的checkConnect方法,前端页面所使用的重要函数的核心代码如下:
(1)openport方法
function openPort() {
$.post("openPort",$("#commForm").serialize(),function(data) {
if (data == "success") {
//alert(data);
$("#openPortBtn").attr("disabled","disabled");
$("#closePortBtn").removeAttr("disabled");
readFromPort();} else {alert(data);});}
(2)closePort方法
function closePort() {
$.post("closePort",function(data) {
clearInterval(interval);
$("#closePortBtn").attr("disabled","disabled");
$("#openPortBtn").removeAttr("disabled");});
(3)readFromPort方法
function readFromPort() {
interval = setInterval(function() {
$.post("readFromPort",function(data) {
data = JSON.parse(data);
if (data != null) {
templateShow(data);}});},1000);}
(4)checkConnect方法
function checkConnect() {
$.post("checkConnect",function(data) {
//alert(data);
if (data == "on") {
$("#openPortBtn").attr("disabled","disabled");
$("#closePortBtn").removeAttr("disabled");}
2.2 后台设计
后台部分的设计包括串口通信模块的底层实现以及处理页面请求与相应的控制层模块,后台部分的程序流程图如4所示。
图4 后台部分程序流程图Fig.4 The flow chart of the back-end
2.2.1 串口通信
串口通信通过使用Java语言调用RXTXcomm.jar进行实现,包括用于查找所有可用端口的findPort方法,用于将读取到的字节数据转换成十六进制字符串的encode方法。
(1)encode方法:
private static String hexString = "0123456789 ABCDEF";
public static String encode(byte[]str) {
if (null != str) {
// 根据默认编码获取字节数组
byte[]bytes = str;
StringBuilder sb = new StringBuilder(bytes. length * 2);
// 将字节数组中每个字节拆解成2位16进制整数
for (int i = 0;i < bytes.length;i++) {
sb.append(hexString.charAt((bytes[i]& 0xf0) >> 4));
sb.append(hexString.charAt((bytes[i]& 0x0f) >> 0));}}
(2)findPort方法:
// 查找所有可用端口
@SuppressWarnings("unchecked")
public static final ArrayList findPort() {
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
ArrayList portNameList = new ArrayList();
while (portList.hasMoreElements()) {
String portName = portList.nextElement().getName();
portNameList.add(portName);//生成可用端口号字符串列表
}
2.2.2 控制层
用于处理页面请求的控制层分为两个模块,一个是用于处理访问首页请求的HomeController模块,一个是用于处理Ajax请求的SerialController模块。
(1)HomeController模块
@RequestMapping(value = "/",method = RequestMethod.GET)
public String index(Model model) {
ListportNameList=SerialTool.findPort();
model.addAttribute("portNameList",portNameList);
return "index";}
(2)SerialController模块
用于从串口读取数据的数据解析模块,通过截取字符串的方式对串口数据进行解析,并将其转换为可读性更高的内容,具体设计如下:
if (null !=dataZigBee) {
for(int i=0;iid=dataZigBee.substring(i* 52+28,i* 52+28+4);
type=dataZigBee.substring(i*52+28,i*52+28+2);
typeId=dataZigBee.substring(i*52+28+2,i*52+28+4);
state=dataZigBee.substring(i*52+28+6,i*52+28+18);
sensorList.add(new Sensor(id,type,typeId,state));}}
if (null != dataAlarm) {
for (int i = 0;iid=dataAlarm.substring(i*28+4,i*28+8);
type=dataAlarm.substring(i*28+4,i*28+6);
typeId=dataAlarm.substring(i*28+6,i*28+8);
state=dataAlarm.substring(i*28+10,i*28+22);
sensorList.add(new Sensor(id,type,typeId,state));}}
for (Sensor sensor:sensorList) {
if (sensor.getType().equals("03")) {
sensor.setType("光子石墨烯红外对射传感器");
if (sensor.getState().equals("000000000000")) {
sensor.setState("无障碍");
} else if (sensor.getState().equals("000000000001")) {
sensor.setState("有障碍");
alarmNum++;}
} else if (sensor.getType().equals("0E")) {
sensor.setType("声光报警传感器");
if (sensor.getState().equals("000000000000")) {
sensor.setState("未开启");
} else if (sensor.getState().equals("000000000001")) {
sensor.setState("已开启");}}}
3 系统功能集成与测试
在完成了软硬件的结合之后,我们对系统进行了集成测试,试验环境如下:
硬件:操作系统Linux的PC机一台,多方位探测传感器一个,障碍物若干。
软件:Java、Xshell开发环境,Eclipse、谷歌浏览器、AR Embedded Workbench、 Serial Tool、Zstack等开发调试工具。
烧写完毕后将对射传感器分别与采集端的串口连接,使采集端可以获取传感器获取到的数据。打开PC端的STS工具,运行所设计的Web端程序,检测能否成功的从后台获取数据并在前端网页正确的显示,包括六个方位的对射传感器中每个接收端是否检测到障碍物,每个接收端的编号用来独特的标识所监测的方位。声光报警传感器的状态是开启还是关闭用来证明后台串口数据的发送是否正常以及准确,保证能够实时接收串口发送来的数据。
左侧选择ZigBee协调器与报警传感器所连接的串口部分,可以正确显示PC端中所有可用串口列表,点击“Open”按钮后通过Ajax异步提交表单将要打开的PC端相应串口的COM号发送到服务器后台,后台执行打开串口的相应程序,串口打开成功后调用Ajax异步请求后台返回从串口接收的数据,前端页面将接收到的JSON字符串正确解析并进行了数据的展示。
图5 系统测试结果1Fig.5 The system test results 1
图6 系统测试结果2Fig.6 The system test results 2
图7 系统测试结果3Fig.7 The system test results 3
图5为六个方位均有障碍时的探测结果,日志部分准确记录了传感器的类型、同类型传感器的id、是否有障碍物的状态信息以及探测的具体时间,同时ZigBeeMonitor模块也通过颜色标识显示出了传感器的探测状态。图6和图7则分别是个别方位有障碍物和没有障碍物时的测试结果,均正确的显示了红外探测传感器的类型、ID、探测时间以及结果等内容。
4 分析总结
系统测试结果表明,每个传感器的接收端均能够正常地感应有无障碍物,能够将获取到的数据经过采集端与协调器之间的ZigBee无线网络进行准确的传输,协调器能够正确处理六个采集端发来的数据,处理后的数据通过串口通信能够正常的在PC端进行获取与解析。同时服务器能够正常的扫描所有可用串口,能够正常的打开与关闭所选择的串口,能够准确的与选中的串口进行数据通信。声光报警传感器能够通过串口连接正确的发送传感器的状态信息,执行从串口发来的数据中所需要执行的命令。
PC端网络连接正常的情况下,本地服务器运转正常,本地服务器保持开启状态后,即可保证域名与本地外网IP绑定以便DNS服务器能够正常解析,保证在接收的来自ZigBee协调器的数据后,能够解析到检测到障碍物的信息,随后能够立刻向声光报警传感器所连接的串口发送打开声光报警的命令。在所有对射传感器均未检测到障碍物时或原来检测到障碍物的那个对射传感器接收端变更为未检测到障碍物的情况下都能够立刻向声光报警传感器所连接的串口发送关闭声光报警的命令,声光报警传感器从串口接收到来自上位机所发出的打开或关闭声光报警的命令后能够立即响应命令并正确执行。
通过测试与分析,该系统已经实现了预期基本的功能,可以在实践中得到应用,接下来可以进一步实现检测障碍物与发射端距离的需求,更加符合生产和生活的需求。