3.2 设备驱动程序
设备驱动程序可以被看作操作系统的一部分,对于某个特定的硬件设备来说,其对应的设备驱动程序是不同的。操作系统本身是没有各种设备驱动的,但是它留下了扩展设备驱动的接口。本终端系统中的设备驱动程序主要包括GPIO驱动、USB接口驱动、视频设备驱动和GSM/GPRS串口驱动。
GPIO驱动是针对GPIO输入/输出端口进行的驱动程序开发,主要的部分是GPIO端口的初始化和配置,经过测试终端采用GPIO总线中的GPG6口以输入模式来接收红外监测模块传入的高电平信号。USB接口驱动由三部分组成:主机控制器驱动程序(HCD)、USB驱动(USBD)、设备端驱动程序(Slave Device Driver),它主要是为支持USB接口的图像采集设备的使用。GSM/GPRS串口驱动是字符设备驱动,系统中选用的串口2对应的设备文件为/dev/tts/1,初始化串口2的波特率为115200 B/s,8位数据位,无奇偶校验,1位停止位,实现了GSM/GPRS模块的连接。
本系统中使用的视频设备驱动为SPCA5XX,它是面向该ZC301p芯片的,其实现是按照标准的USB VIDEO设备的驱动框架编写的,整个源程序由三个主体部分组成:设备的初始化模块和卸载模块、上层软件接口模块、数据传输模块。此视频设备驱动程序的设计,能够取到应用程序所需要的jpeg流。在此不能不提到ioct1的作用。为了补充设备读写操作的功能,例如控制硬件等,最常用的通过设备驱动程序完成控制动作的方法就是实现ioct1方法。ioct1系统调用为驱动程序执行"命令"提供了一个设备相关的入口点。与read和其他方法不同,ioct1是设备相关的,它允许应用程序访问被驱动硬件的特殊功能一配置设备以及进入或退出操作模式。在本设计中用到的,是通过ioct1截取jpeg流和配置图像采集设备的参数。
3.3 PPP拨号脚本
本设计中,对于处理器而言,GPRS模块就相当于一个调制解调器,处理器通过串口发送
AT命令控制GPRS模块工作情况和得到GPRS模块相关信息。中国移动在GPRS网中建立了相当于ISP的GGSN,以连接GPRS网与外部的Internet网络。要使用GPRS功能首先要登录GPRS网络中的GGSN,这个工作可以通过相关
AT命令完成。同时,为了能够进行IP数据包的传输,就必须首先实现数据链路层PPP协议。
PPP是简单链路设计的链路层协议。设计目的主要是用来建立点对点连接,进行数据收发。PPP协议中主要任务有链路建立、维护、拆除、上层协议协商和认证等。在GPRS网络中一般用到的有LCP(链路控制协议)、PAP(密码验证协议)、CHAP(挑战握手验证协议)和IPCP协议(PPP IP控制协议)。为了建立点到点连接,PPP连接时的两端开始都必须发送LCP数据包来配置和测试数据连接;在连接建立后,对等实体还有可能需要认证;然后,PPP必须发送NCP数据包来选择一种或多种网络层协议来配置。一旦网络层协议被配置好后,该网络层的数据包就可以被封装在ppp 帧中在链路上传送了。PPP链路将保持可配置的状态,直到有LCP数据包和NCP数据包终止连接。在GPRS模块拨号成功后,就要进行LCP协商配置。交互过程完成后,终端将主动进行PAP认证,发出PAP数据包,进入认证鉴权阶段。
PAP认证主要进行用户名和密码认证,其数据包仍然封装在PPP6帧内,格式和LCP一致。进入PAF认证阶段,终端主动发出Authenticate-Request数据包,由于中国移动使用的GPRS可以设置任意的用户名和密码,因此本设计中使用的用户名和密码都为"lab"。接下来进入IPCP设置阶段。
在IPCP配置过程中,可以设置网络连接中的网络环境,主要包括协商分配IP地址、IP压缩协议和DNS服务器地址等。由于不需要进行域名的解析和IP压缩,因而只进行IP地址的配置。
经过上述PPP协议数据交换过程,数据链路已经建立,但是要进行数据的传输,还要进行IP协议和TCP/UDP协议的实现。由于Linux内核已经支持TCP/IP协议,并且在内核配置时选中支持PPP协议,就可以完成上述的协议支持。为了完成上述的PPP协议实现过程,需要在文件系统的/et c文件夹下添加拨号脚本文件,并且在/usr/bin文件夹下添加应用程序pppd和chat。chat程序定义了计算机和modem之间的对话交互,完成拨号动作。pppd后台程序则同内核ppp驱动一起建立并维护与另一端的ppp连接,并确定连接两端的IP地址。
3.4 应用层程序
应用层程序中包括红外监测模块、图像采集模块、GPRS无线传输模块及GSM短信息发送模块。下面主要介绍图像采集模块与GPRS无线传输模块的实现。
3.4.1 图像采集模块
在Linux环境下,编写获取视频音频的应用程序,都使用V4L标准,V4L(Video for Linux标准是Linux中通行的音频视频流采集标准。它为内核、驱动和应用程序的交流提供了统一的接口。在应用程序中利用V4LAPI获取视频图像按以下几个步骤进行:打开视频设备、设置设备的属性(图像的亮度、对比度、设定传输格式和传输方式)、开始传输数据,最后关闭设备。
首先,定义与设备相关的结构体如下:
struct vldeo_capabil i ty capabi li ty; //视频设备的属性
struct video_window captureWindow; //包含获取到的图像的长和宽
struct video_picture imageProperties; //包含获取到的图像属性
结构体struct video_capabi lity包含视频设备的属性有:视频设备的规范名称、接口类、所能获取的最大图像的宽和长、所能获取的最小图像的宽和长。其次,要使用ioctl系统调用,ioctl系统调用的功能是通过打开的文件描述符对各种文件,尤其是字符设备文件进行控制,完成特定的I/O操作。V4L支持的ioctl命令大约有二十多个,在应用中主要用的是下面几个命令:
ioctl(fd,V IDIOCGCAP,&capability); //获取视频设备的基本功能信息
ioctl(fd,VIDIOCGPICT,&picture); //设置和获取采集图像的各种属性
ioct l(fd,VIDIOCGMBUF,*mbuf); //获取缓冲区信息
ioctl(fd,VIDIOCMCAPTURE,&mmap); //捕捉图像,获取图像信息
ioctl(fd,VIDIOCSYNC,&frame); //等待捕获完成的图像
本设计中主要设置的参数有:捕获的图像大小为320×240像素,图像帧的调色板palette值为21,图像色彩深度为8位。
最后,使用read方法实现图像的获取,read方法则可以直接读取设备文件来获取一帧数据保存到缓冲区中。通过convertframe()函数将pFramebuffer中的数据转成完整的jpeg格式的数据保存到ptframe缓存中去,再调用fwrite()函数将pt-frame缓存中的jpeg式数据写入到指定的文件中去,即得到一幅jpeg格式的图像。另外要提到的是本设计中为了方便服务器端读取上传的图片,将图像文件重名为系统时间格式。这时需要调用Linux系统函数time和1ocaltime。综上,图像采集模块已经实现。
3.4.2 GPRS无线传输模块
本设计中使用socket(套接字)编程技术来实现GPRS网络中FTP文件的传输,它是网络通信中应用进程和网络协议之间的接口。在Linux操作系统中,socket属于文件系统的一部分,网络通信就像文件读取一样方便。并且socket用IP地址加上端口号来唯一地标志一个进程。利用socket实现通信就像网络上大部分通信一样,是在客户机/服务器(client/server)模式下进行的。这种模式下,将请求服务的一方称为客户端,将提供服务的一方称为服务器端。和大多数的应用程序一样,客户端和服务器端使用传输协议进行通信。应用程序通过传输协议进行交互时所用的接口称为应用程序接口(Application Program Interface,API)。一个API定义了应用程序与协议软件进行交互时可以使用的一组操作。本设计中使用了FTP协议来传输图像数据文件。一次完整的FTP文件传输需要建立两种类型的连接,一种为文件传输下命令,称为控制连接,另一种实现真正的文件传输,称为数据连接。
本系统中使用socket编程技术实现GRPS网络中无线FTP传输图像的具体步骤是这样的;首先,建立socket客户端的部分,用来发送FTP命令等参数。调用socket()创建了套接字,返回了该socket的描述符。接着,将服务端的IP地址、端口号和网络地址类型(本设计中是PF INET,表明该socket在Internet域中进行通信)填充到该socket结构体中。然后建立刚创建的套接字的连接,通过此套接字发送登录该FTP服务器的相关命令:发送登录名和密码;使用TYPE命令设置文件的传输类型为I。接着,建立作为socket服务器端的部分,用来发送数据文件。与socket客户端不同的是需要先创建socket,然后绑定本地地址(也就是由GPRS系统DHCP分配的IP地址)到该socket上。接着是监听这个socket,当监听到与socket客户端(也是FTP服务器端)连接上时,开始请求发送图像数据文件的命令。这部分实际也充当了FTP的客户端工作。在监听到连接后,使用PORT命令监听等待连接的端口,接着使用STOR命令发送上传文件的请求。