张 继 平,崔 洪 亮,项 伯 阳,于 忠 得
(大连工业大学 信息科学与工程学院,辽宁 大连 116034)
传统的数据采集网络是基于现场总线技术和单片机应用技术的有线网络,底层节点和上层节点设备之间的通信,需要通过现场施工布线实现,设备移动困难,尤其在需要增删底层节点设备时,必须通过现场的改线、布线施工才能完成,十分不便。随着计算机技术、网络通讯技术、传感器技术的发展,最近几年推出一种新的网络——无线传感器网络,用于工业领域的数据采集系统的底层网络。
无线传感器网络在工业领域中的应用难点在于保证数据传输的实时性。Zigbee无线传感器设备搜索时延一般为30ms,休眠激活和活动设备信道接入时延分别为15ms。由此可见,Zigbee网络节点间的数据传输时延在100ms以内,通过采用短帧数据传输、改变网络结构可进一步降低传输时延,保证数据传输的实时性[1]。
为了解决传统的基于现场总线技术的传感器网络的布线困难、设备难于移动、设备节点增删带来的高难度布线施工等问题,本文提出了一个由3层节点设备、二级网络组成的无线数据采集系统方案,其中底层传感器节点和中间层数据采集节点之间,利用Zigbee无线技术,实现数据通信,避免了组网、改网过程的布线施工,节省人力物力。中间数据采集节点的设计,采用了嵌入式技术,在ARM处理器和Linux操作系统的支持下,不仅实现一般数据采集节点的功能,而且具有很好的人机交互界面和网络浏览功能。中间层数据采集节点与上层之间采用以太网连接,实现了数据的远程浏览。
硬件结构如图1所示,采用3层网络结构,分传感层、数据采集层、Web层。
图1 系统框架图Fig.1 System diagram
传感层由数据采集模块(传感器检测电路、放大电路、A/D转换器)、数据处理和控制模块(微处理器、存储器)、通信模块(Zigbee无线收发器)构成。实现将传感器检测的物理参数变成数字信号,经过处理后,通过Zigbee无线收发器发送到上层的采集节点。
处于网络中间的数据采集节点设备,是系统的核心设备,硬件由ARM9微处理器、存储器、彩色LCD显示器、串口控制器,以太网控制器、Zigbee无线收发器等部件组成,在Linux操作系统的支持下,编程实现向下通过Zigbee无线收发器实现与传感器节点的通信,采集其检测的数据;向上通过以太网和Web服务器,支持Web层的数据浏览;数据采集节点设备,通过彩色LCD显示屏,可以实现采集数据的实时显示和其他的人机交互功能。
Web层主要是PC机等网络显示操作设备。通过访问数据采集层提供的域名,实现数据的远程访问[2]。
软件部分的设计主要包括:传感器节点软件设计和数据采集节点软件设计。
传感器节点软件设计采用传统的前/后台(超循环)系统设计,利用中断服务程序(前台行为)保证数据采集的实时性。主要实现传感器数据采集、数据处理和无线传输数据的封装及响应网络上层节点的调度命令四部分功能。
数据采集节点通过Zigbee模块、接收传感器节点的数据,在本地存储,并提供web端的远程访问功能。
数据采集节点设计主要包括:Linux操作系统移植、Linux设备驱动开发、GUI(GTK)移植及应用程序开发四部分。
2.2.1 Linux操作系统移植
获取Linux内核源代码,根据目标板硬件对系统进行裁剪与移植。
2.2.2 Linux设备驱动的开发
基于input子系统与平台总线结合的方式开发触摸屏驱动。
Linux内核提供了平台设备注册函数platform_device_register()和平台驱动注册函数platform_driver_register().驱动模块初始化的时候,调用平台设备probe方法完成对驱动程序IO内存申请与映射、中断号注册、硬件IO初始化、设备结构初始化与注册[3]。
Linux输入子系统为输入设备提供统一的编程接口,驱动设计的核心工作是向系统报告触摸屏输入事件。Linux内核提供input_report_xxx()函数用于报告事件的发生和按键的坐标等[4]。
驱动完成后,将驱动加入内核中进行驱动模块的编译,将编译好的驱动模块转入目标系统中,在串口终端下加载模块后,查看驱动模块信息如图2。
图2 Touchscree.ko模块信息Fig.2 Touchscree.ko model message
2.2.3 GUI(GTK)移植及应用程序开发
(1)移植GTK图形开发库,采用GTK实现数据本地显示,主要提供实时曲线,历史曲线,参数设置界面等。
(2)Zigbee数据采集程序开发,利用GTK提供线程接口,建立一个数据采集线程,此线程负责读取Zigbee模块上传的数据,并根据底层设备生成的id生成realtime数据文件。
gtk_init(&argc,&argv);
gtk_creatdisplay();
g_thread_create(getzigbeedata,FALSE,NULL);
上面是一段gtk初始化及线程启动程序,gtk_init(&argc,&argv)用于初始化GTK环境,gtk_creatdisplay()函数用于生成并维护所有显示界面,通过g_thread_creat()启动一个数据采集线程。getzigbeedata()为数据采集程序,主要实现读取串口数据。在Linux下设置串口的参数被包含在struct termios结构中[5]。
根据实际应用进行参数设置完成后,通过readdatafromtty函数读取串口数据,并检测数据的有效性。在程序设计中,底层设备id为唯一的设备标识,通过这个标识来区别不同设备传输的数据,传输的数据格式为:
paranum用于表示设备所要上传的参数数量,struct para用于描述上传的参数,指示参数编码及对应参数的数据。
图3 Zigbee数据采集流程图Fig.3 Zigbee data acquisition flow chart
在Linux下移植Boa服务器,利用C语言开发CGI动态脚本程序,通过客户端浏览器来访问,实现数据的远程显示[6],如图4。
图4 实时数据Fig.4 Real-time data
本课题在实验室环境下,采用传感器节点与18B20温度传感器结合的方式,采集温度数据,将数据封装后通过Zigbee通信模块发送出去,接收端采用Zigbee模块,利用接收程序,读取上传数据,并写入文件。在学校局域网范围内,通过移植的Boa服务器结合移植的Linux端花生壳软件,实现了通过域名访问本地服务器的功能。
通过以上工作,完成了无线传感器网络检测系统硬件平台和软件开发环境等关键技术的初步研究工作。提出在保证数据传输实时性的基础上解决传统传感器网络布线困难、设备难于移动的问题。将无线传感器网络、ARM处理器、Linux操作系统引入到检测系统中,提高了系统运行速度和稳定性,使系统拥有良好的人机界面和以太网接口,方便远程参数设置和数据查看。Linux系统和GTK的使用,使软件的开发更容易。
[1]陈丹,郑增威,李际军.无线传感器网络研究综述[J].计算机测量与控制,2004,12(8):701-704.
[2]车飞锋,孟开元,曹庆年.基于ARM的嵌入式 Web服务器的研究与实现[J].微计算机信息,2008,24(9-2):86-88.
[3]于忠得,林敏,申华.嵌入式系统基础教程[M].北京:国防工业出版社,2009:1-14.
[4]张子石.一种Linux嵌入式系统的中断处理机制[J].微计算机信息,2009,12(2):82-83.
[5]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008:76-114.
[6]蔡奇玉,连振汉,张志强.CGI编程指南[M].北京:机械工业出版社,1997:56-73.