杨琳,王东东,王树超
(商洛学院电子信息与电气工程学院,陕西商洛 726000)
随着物联网技术的迅速发展,在智慧城市的建设潮流当中,智能仓库是一项核心技术,受到很多高科技研发公司的青睐。将物联网[1]、Linux[2]、Uinx[3]等新技术应用到仓库的智能管理中,是大势所趋。国内外学者对仓库的管理、调度、码垛、查询等问题展开大量研究。Tinelli[4]用多准则工具来解决仓库产品位置优化问题;Herbert[5]研究了节约成本的仓库智能存储方法;曹建刚[6]、张焕国[7]在嵌入式环境下建立了的智能仓库网络;陈传军[8]、杨文强[9]实现了立体仓库的调度算法;童晓渝[10]分析了智能家居的发展与智能仓库的联系;刘士立[11]、周星君[12]分别在 Linux环境和Android环境下完成了智能仓库的引导系统和设计;熊宗接[13]设计了远程粮仓控制系统;李素敏[14]、王明[15]、王海涛[16]分别研究了智能仓库、智能监控系统、智能仓库对象的管理技术;刘瑞龙[17]、周燕[18]分别完成了STC单片机和STM32环境下的智能仓库车和智能寻物算法的设计。在国内外的研究中,各种智能仓库都有着各自的优势和不足,但是也存在着技术规范不统一,功能不齐全,系统不简洁的特点。本文针对目前智能仓库没有统一的技术规范,设计的智能仓库存在系统上的不简洁,扩展性不强的缺陷,设计了一个基于Linux的智能仓库控制系统,构建的Linux系统模型,实现了仓库的自动监控、报警、控温等功能,解决仓库货物存储过程中的拥堵问题,尤其是改善了时间与能源浪费的问题。
本系统利用无线wifi做为局域网络,将其boa服务器运行在S3C2440核心控制板上,用来接收和处理WEB网页数据,同时在S3C2440开发板上也运行着视频流服务器,用来处理监控视频数据,并将视频监控图像数据通过网络传递给网页,在S3C2440开发板的周围也以GPIO的形式,外围电路用以模拟整个仓库电路,其智能仓库控制系统结构功能框图如图1所示。
图1 智能仓库控制系统结构功能原理框图
本系统选择S3C2440A作为核心控制芯片,这种芯片通常用于嵌入式应用的集成系统中;采用 16/32-位RISC(精简指令集)架构和以ARM920TCPU为核心的强大的指令集;拥有增强型ARM架构的MMU支持可以支持 WinCE,EPOC32和 Linux等操作系统。
本系统的人体感应模块选用HC-SR501人体感应模块,这是一种热释电红外的传感器模块,能检测人或动物发射的红外线而输出电信号,仓库中有人和无人的两种状态会被这种模块检测出来。
步进电机是将电脉冲信号转变为角位移或线位移的元步进电机组件,本系统中步进电机主要用于的门,窗控制。本系统选择的步进电机驱动芯片是ULN2003。
硬件系统的设计,以高内聚为出发点,采用S3C2440ARM芯片来作为控制核心,利用USB摄像头来采集视频数据,同时利用LCD液晶屏来显示图形数据,通过控制GPIO引脚来控制报警器,仓库灯光,人体红外传感器等外围硬件模块,其硬件模块组成如图2所示,其中箭头方向是指控制信号的流向。
图2 硬件模块组成
如图3所示,J11排座直接与电平转换芯片的输出端口相连,P8排座直接和进电机相连,只需要通过控制编写程序控制1~5口的TTL电平,就可以直接控制步进电机的转速和旋转角度。
图3 步进电机控制电路图
LCD控制器外围电路如图4所示,其中VD[23:0]为像素数据线,用来传递图像数据;VFRAME用来发出一帧图像数据的开始信号;VLINE引脚用来控制一行图像数据的开始;VCLK用来控制打点时钟频率;LED+和 LED-用来控制 LCD液晶频的背光。
图4 LCD控制器外围电路
作为一个嵌入式系统的软件,其中uboot,Linux内核,根文件系统,底层硬件驱动程序,上层应用程序缺一不可。其中uboot在系统一上电就开始运行,主要负责硬件的一些初使化工作,最为主要的工作是启动内核,内核则负责对设备,处理器,内存,文件,作业进行管理,当然在本系统中它主要负责为驱动程序提供运行环境,驱动程序向下直接操作硬件,向上给用户层提供接口,内核挂接根文件系统,根文件系统之中存放着应用程序。对于本系统而言它主要存放底层驱动对应的应用程序,以及boa服务器和视频流服务器。将底层驱动程序,上层应用层程序,及BOA服务器和视频流服务器在程序中的实现方法和原理逐一进行分析。
本系统通过JZ2440开发板4.3寸液晶屏来显示视屏监控动态图像,本软件的设计主要利用了http语言实现对客户端网页界面的设计,同时也对boa服务器进行了移植,使得运行在根文件系统中的boa服务器能够接收客户端的请求数据,并根据其表单数据调用相应的cgi程序,cgi程序调用应用程序,应用程序利用系统调用函数操作设备节点触发底层驱动程序,从而达到对硬件的操作和整个仓库设备的控制。软件总体框图如图5所示。首先会对log日志文件进行初始化,用来记录系统的运行状况,以便在智能仓库控制系统出现故障时,通过查阅log日志文件就可以获知系统出现的故障所在,从而为每个功能模块创建独立的线程,其创建线程的流程图如图6所示。
图5 系统软件总体框图
图6 创建线程的流程图
需要为每个功能模块创建独立的线程,软件利用了消息队列机制接收来自cgi程序发送过来的消息,相应的功能线程首先判断是否是它的消息,若是则调用对应的设备应用程序,对设备进行硬件操作,接下来以智能仓库控制系统中的开换气扇为例介绍整个智能仓库控制系统的控制机制。其开风扇机制框架图如图7所示。
图7 开风扇机制框架图
用户在客户端利用手机或PC机连接到局域网时,通过点击开风扇按钮,这时会通过TCP/IP网络通信协议将表单数据传递给核心控制模块端的BOA服务器,BOA服务器会调用相关目录下的cgi程序,cgi程序会创建消息队列,发消息给事先创建好的开风扇对应的线程,该线程接收到与之匹配的消息之后,会通过系统掉用库函数来通知内核层所对应的驱动程序,该驱动程序首先将GPIO的输出引脚设置成风扇对应的引脚,根据应用层传递给内核层的数据,来输出高低电平,从而达到对换气扇的开关控制。
Linux操作系统支持 httpd、Thttpd和 BOA三种服务器,本系统选择的Boa服务器是一个在智能仓库领域非常受欢迎的Web服务器,它可以支持认证和cgi,而且最终可执行代码相当小,只有60 K左右,是其他的Web服务器无法相比的。
当客户端在WEB网页上点击“打开小换气扇”按钮,这时客户端会执行action动作,submit指的是执行提交动作,表示将"/cgibin/fan/fan_cgi.cgi"这一字符串数据提交给BOA服务器,BOA服务器会解析这个字符串的数据,接下来就会到根文件系统下的/www/cgi-bin/fan目录中去执行名为fan_cgi.cgi的cgi程序。
用户(客户端)通过WEB网页将数据传递给WEB服务器,WEB服务器中运行着一个守护进程,当接收到客户端的一个请求之后,会调用进程创建函数fork,为cgi创建出一个新的进程。该子进程将cgi请求的有关数据设置成环境变量(该子进程将要完成的主要工作是将与请求相关的数据),并启动URL指定的cgi程序(这时URL会指定相应的cgi程序,并启动它),cgi程序会从之前指定的环境变量中读取所需的数据,如图8所示。
图8 CGI程序工作原理
现就fan_cgi.cgi的源码程序为例分析cgi程序在该智能仓库控制系统中的作用,当用户在WEB客户端点击“打开小换气扇 ”按钮时,BOA服务器就会调用该CGI程序,其代码如下所示:
printf("%s%c%c","Content-Type:text/html;charset=gb2312 ",13,10);
system("/www/cgi-bin/fan/app/fanopentest");
printf ("<META HTTP -EQUIV ="REFRESH"content="0;url=../../main.html">");printf("</HEAD>");
本研究中选用一个扩展的GPIO口,GPA口作为风扇的数据线。对于风扇的控制就是设置GPA口为输出端口,以及设置I/O口的模式来完成的,把风扇抽象成了一个字符设备,将其风扇控制程序写成一个字符设备程序,这样在用户空间就可以直接以open,read等系统调用来访问底层硬件,达到对底层硬件的控制。其风扇驱动控制程序如下所示:
即用户层通过调用ioctl函数,系统会通过软中断的方式陷入内核,内核会调用到内核态的ioctl函数,将用户态的指令传入内核态以此来控制风扇的开与关。编写Makefile,把上述程序编译为一个fan.ko模块。这个cgi程序,将由BOA服务器调用。当客户端点击开风扇的按钮时,会通过htttp通信,将表单数据传递给BOA服务器,BOA服务器将根据表单数据,调用fan.cgi,在fan.cgi程序中将调用相关目录下的应用程序,达到客户远程通过网页对仓库中风扇的控制。
其驱动程序的编写相对而言比较复杂,故在此对其作出相应的分析。对于linux下驱动程序的编写作者对此作出总结,首先编写驱动时要明确目的,即驱动程序向下驱动硬件,向上给应用层提供标准的接口,屏蔽硬件细节,使得写应用程序的工程师在无需参考硬件手册的情况下,只需利用系统调用函数结合相应的业务逻辑使其硬件工作起来;同时硬件驱动程序的编写之前首先需参考Linux内核现有的驱动程序,弄清楚其架构;在该架构的基础之上,参考相应的控制器手册和硬件外设手册编写驱动程序,使得编写的驱动程序能够融合到该架构之中,所以驱动程序的编写重点是弄清架构和看懂芯片数据手册,一般脱离不了的步骤是分配一个结构体对象,并对该结构体进行初始化,向内核注册该结构体,最后依据芯片手册对硬件进行相应的操作。
那么针对LCD驱动程序的编写,首先需要弄清LCD的工作原理,该4.3寸液晶屏控制器结构如图9所示。
LCD驱动程序流程图如图10所示。
图9 S3C2440LCD控制器结构图
图10 驱动程序流程图
即编写LCD驱动程序时首先需要分配一个fb_info结构体;然后就是对该结构体的设置,设置包括固定参数的设置,可变参数的设置,像素元素的设置,以及操作函数,显存虚拟地址方面的设置;对LCD硬件的操作,首先得配置GPIO用于LCD,根据LCD手册设置LCD控制器,比如VCLK的频率等。
本系统中采用UVC摄像头采集图像数据,通过MJPEG-STREAMER视频流服务器将视屏数据传递给网页客户端,达到视屏监控的目的。如图11所示,MJPEG-STREAMER视频流服务器可以看作一个码头,可以将图像数据比作货物,那么需要一个仓库将数据保存起来,在视屏流服务器中的用一个全局变量来表示;同时也涉及到如何从摄像头中把数据取出来,即如何往仓库中放货物,在代码中首先是利用面向对象的思想,将摄像头的信息用结构体(struct vdin)来加以描述,例如,对所采集图片宽高,以及图片所对应的格式进行了描述等,摄像头的初始化是将这个结构体写入驱动之中。这个操作通过ioctl完成,涉及到的命令 包 括 VIDIOC_QUERYCAP,VIDIOC_S_FMT,VIDIOC_S_PARM,VIDIOC_REQBUFS,VIDIOC_QUERYBUF,并通过mmap完成内存的映射。将图像数据输出到网页客户端,在视屏流服务器中是通过TCP/IP网络编程模型来实现视屏图像数据的传输,当每有一个客户端连接到本视频流服务器时,就创建一个线程单独和这个请求通信,本文涉及到的函数包括 socket、bind、listen、accept和 write。这里涉及到的函数包括pthread_create、pthread_detach、pthread_cond_init、pthread_cond_destroy、pthread_mutex_init、pthread_mutex_destroy。
图11 MJPEG-STREAM抽象图
当USB摄像头采集到图像数据时,V4L2驱动程序会将图片数据上报给用户层的视频流服务器的采集模块Input_uvc.so动态库程序,Input_uvc.so主要完成的工作是分配临时缓存和做一些清理工作,同时判断视频图像数据是否是MJPEG格式,若不是需要将该视屏图像数据转换MJPEG格式,然后将图片数据存入全局的*buf缓存中,通过simplified_jpeg_encoder将图像数据进行压缩,最终通过Output_uvc.so动态库程序将图像数据通过socket通信将图像数据传递到网页客户端。
本系统实现了将摄像头采集来的图像数据在LCD液晶屏上显示,其工作流程如图12所示,当应用层程序获取到底层驱动程序采集来的图像数据时,首先将图像数据放入VideoBuf缓冲区中,接下来需要判断数据格式是否为RGB格式,若不是需要进行格式转换,因为LCD控制器只支持RGB格式的像素,同时由于LCD液晶屏的大小有限,所以在必要时必须进行图像的缩放,最后将视频图像数据放入FrameBuf帧缓存之中,供LCD控制器的使用。
系统上电之后,首先启动bootloader并初始化相关的硬件,bootloader加载内核并执行,内核启动起来会挂接根文件系统,在这时BOA服务器和视频流服务器启动起来。主控电路板和wifi局域网络处于同一网段,只要客户端通过手机或PC机连接入这个局域网,在浏览器上输入主控开发板IP地址,就会在客户端刷出WEB网页。如图13和图14所示,分别给出了在PC机客户端和手机客户端同时实时的显示仓库现场状况的视频监控状况。
图12 在液晶屏上显示视屏的基本流程
图13 PC机客户端的视频监控状况
图14 手机客户端的视频监控状况
当用户点击上开启摄像头时,就会将USB摄像头采集来的视频监控图像通过视频流服务器传到客户端的网页上达到视频监控的目的,当用户点击开启LCD监控时就会将监控视频数据显示到LCD液晶屏上,如图15所示,达到多角度,多场景监控的目的。同时也实现了通过客户端网页实现对卧室灯的开关控制,开关报警器,和开关门窗的功能。
图15 在LCD液晶显示屏上显示仓库监控视频
本系统实现了基于Linux的智能仓库控制系统,实现了智能多方位监控、自动开关门窗、自动报警等功能。本文对硬件原理进行分析,设计了整个智能仓库控制系统的软件架构,对其中的关键技术做了详细的分析与论证。
1)经过不断的测试表明该智能仓库控制系统运行稳定,没有出现系统突然死机或重启的现象,各个模块间的工作互不影响。同时解决了现有的智能仓库控制系统存在系统上的不简洁,扩展性不强的缺陷。
2)受仓库局域wifi网络覆盖面积小的影响,使得用户无法远距离的操纵仓库设备和监控室内的相关情况。所以在此智能仓库控制系统的基础之上将局域网络扩展为广域网,使其用户无论在何处都能对仓库设备进行操作与监控。
3)智能仓库的大规模应用将很大程度地节约人力劳动和资源成本,提高工作效率和管理水平,为研发高性能、高安全性的智能仓库打下了基础。
参考文献:
[1] 刘建周.物联网的概念及发展[J].中国科技术语,2011,13(5):56-58.
[2] 刘文峰,李程远,李善平,等.嵌入式Linux操作系统的研究[J].浙江大学学报(工学版),2004,38(4):447-452.
[3]RICHARD STEVENS W.Advanced Programming in the UNIX Environment[J].agricatural systems,2014,39(4):23-26.
[4] TINELLI L M,LIVIALDINI K C T,BECKER M.Intelligentwarehouse productposition optimization by applying a multi-criteria tool[J].Communications in Computer and Information Science,2013(371):137-145.
[5] HERBERT S B.Method used to salvage warehouse subjected to severe settlement and practice[J].Periodical Structure and Construction,1997,2(2):131-136.
[6] 曹建刚,王鸣.基于嵌入式系统的智能仓库网络实现[J].安徽工程科技学院学报,2006,21(4):43-47.
[7] 张焕国,李晶,潘丹铃,等.嵌入式系统可信平台模块研究[J].计算机研究与发展,2011,48(7):1269-1278.
[8] 陈传军.自动化立体仓库智能调度系统研究[D].北京:机械科学研究总院,2006:5-16.
[9] 杨文强.基于智能方法的自动化立体仓库系统优化研究及应用[D].上海:上海大学,2014:3-16.
[10]童晓渝,房秉毅,张云勇,等.物联网智能家居发展分析[J].移动通信,2010,34(9):16-20.
[11]刘士立.基于Linux的智能仓库引导系统[D].苏州:苏州大学,2012:13-21.
[12]周星君.基于Android的智能仓库管理平台的设计与实现[D].郑州:解放军信息工程大学,2013:5-17.
[13]熊宗接.粮仓远程智能监控系统的应用研究[D].武汉:华中科技大学,2013:3-13.
[14]李素敏.智能仓库的设计[J].电子世界,2014,21(12):140.
[15]王明.基于物联网的仓库智能监控系统设计与实现[D].成都:电子科技大学,2015:5-17.
[16]王海涛.基于智能对象的仓库作业管理关键技术研究与实现[D].重庆:重庆大学,2016:5-14.
[17]刘瑞龙.基于STC单片机智能仓库车的设计[D].济南:齐鲁工业大学,2015:4-13.
[18]周燕.基于STM32的智能仓库寻物系统设计[J].科技风,2017,11(14):26-27,29.