GPRS模块完成无线上网功能,选用SIE-MENS公司的MC39I,其稳定性以及性价比较高。该模块需要自行设计外围电路。通过ZIF为用户提供SIM卡、RS-232及语音等接口。MC39I是双频GSM/GPRS无线模块,它支持标准ITU-T的AT命令集。支持全双工的数据通信,其具有低功耗、接口简单并支持GPRS CLASS 10以及SMS功能[3]完成上网功能还需用户提供SIM卡以及天线。
下图是MSP430FG4619单片机和MC39i的硬件接口图
4软件设计
4.1视频采集和压缩驱动
视频A/D转换模块首先通过设置SAA7113H的配置寄存器对其进行初始化。设定输入的视频信号为PAL制式,每秒25帧,一帧图像的分辨率为720×576。视频压缩模块首先对IME6400进行初始化。IME6400由其片上RISC CPU控制工作,芯片上电复位之后,RISCCPU首先执行位于片内SDRAM中的代码,根据代码的的内容,对内部各功能模块进行初始化设置并协调各功能模块的行为。对IME6400的初始化可由ARM通过主控制接口向IME6400的SDRAM发送固件程序。使芯片接收SAA7113H的视频信息开始视频压缩工作。在压缩芯片工作的过程中。视频转换后的MPEG-4码流存放于数据库中,等待进一步的发送处理。
4.2网络接口协议
数据是通过GPRS网络传输到因特网服务器上的,所以在由单片机和GPRS Modem组成的发送端所发送的数据,要被封装成能被GPRS网络所接受的协议,而且要把数据正确地传送到接受方,则GPRS网络需要对接受方和发送方的协议进行转换。
OSI(International Standard Organizations)针对抽象/复杂的网络功能,以不同层次的概念,系统地呈现网络功能的开放系统互连(open system interconnection,OSI)网络参考模型,将整个网络所需的软/硬件结构,按照不同的功能将其分为七层,即ISO7层协议。这七层从下到上分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。数据的发送主要涉及到物理层,数据链路层,网络层和传输层,其网络通信分层结构如图所示:
TCP IP PPP GPRS 传输层
网络层
链路层
物理层
采集终端
GPRS网络 Internet 主站
物理层:利用AT指令通过GPRS Modem拨号,正确反馈及应答后,一条物理通道即GPRS信道就在系统中的GPRS Modem和GPRS网络之间建立起来。 数据链路层:PPP协议将原始的GPRS物理层连接改造成无差错的数据链路,系统将远程登录Internet,并得到GPRS网关分配的IP地址。 网络层:采用IP协议作为网络层协议。IP协议将接入Intemet的具有不同IP地址的终端都联系起来。经过IP路由选择,可以实现系统与连在Internet上的任一IP终端进行数据交互。 传输层:选择TCP作为传输层协议,为数据传输提供连接可靠地服务。[4] 4.3视频监测终端网络接口软件设计
LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、操作系统、编译器相关的部份都独立出来,放在/src/arch目录下。 LwIP在μC/OS-II上的实现就是要修改该目录下的文件,其它的文件一般不应该修改,主要的工作包括以下几部分。
(1)相关的include文件
在/src/arch/include/arch目录下的cc.h、cpu.h、perf.h中有一些与CPU或编译器相关的定义,如数据长度、字的高低位顺序等,这应该与用户实现μC/OS-II时定义的数据长度等参数一致。一般情况下C语言的结构体struct是4字节对齐的,但是在处理数据包的时候,LwIP是通过结构体中不同数据的长度来读取相应数据的,所以,一定要在定义struct的时候使用_packed关键字,让编译器放弃struct的字节对齐。
(2)sys_arch操作系统相关部份
sys_arch.[ch]中的内容是与操作系统相关的一些结构和函数。μC/OS-II实现了消息队列结构OSQ及其操作,但没有对消息队列中的消息进行管理,因此不能直接使用,必须重新实现。对队列本身的管理可利用mC/OS-II自己的OSQ操作完成,然后使用μC/OS-II中的内存管理模块实现对消息的创建、使用、删除回收,两部分综合起来即可形成LwIP的消息队列功能。
(3)sys_thread_new 创建新线程
在μC/OS-II中,没有线程(thread)的概念,只有任务(Task)。它已经提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,就可以实现sys_thread_new。需要注意的是LwIP中的thread并没有μC/OS-II中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。
(4)lib_arch中库函数的实现
LwIP协议栈中用到了8个外部函数,这些函数通常与用户使用的系统或编译器有关,因此应由用户自己实现。
LwIP的设备驱动程序接口
LwIP与PPP的程序结构简要描述如下:
#define NTHREADS 3
#define STACKSIZE( CYG NUM_HAL_STACK_SIZE_TYPICAL + 4096 )
#define NTHREADS 3
#define STACKSIZE ( CYG NUM_HAL_STACK_SIZE_TYPICAL + 4096 )
err = cyg_io_lookup( "/dev/ser1", &handle1 );
if (ENOERR == err)
{middleblink();}
Else
{leftblink();};
pppInit();
pppSetAuth(PPPAUTHTYPE_ PAP," pppuser","pppassword");
pd=pppOpen(handle1,ppp LinkStatus Callback,NULL);
void pppLinkStatusCallback (void * ctx, int errCode, void * arg)
{skipblink();}
4.4 MC39i模块的驱动程序
单片机通过串口和GPRS模块交换数据,所以首先要编写串口驱动程序,包括串口初始化(Init_Comm)、写串口数据(PrintChar)等函数。读串口数据是通过中断来完成的。由于篇幅所限,只给出串口初始化的代码:
void Init_Comm(void)
{
TMOD=TMOD&0x0F;
TMOD=TMOD|0x20;//定时器1采用方式2,用于产生串口1的波特率
TL1=0xFD,TH1=0xFD;//32MHz-57600bps
WDCON=0x80;//SMOD1=1
SCON1=0x50;//串口1采用方式1
TR1=1;//启动定时器1*/
}
在这些串口函数的基础上编写GPRS模块的驱动函数。单片机通过AT命令进行拨号后,GPRS模块就转入在线模式,此时通过PPP协议取得一个IP地址,就可以连接到互联网了。
5 关键技术
5.1 MC39i模块的初始化
主要包括启动MC39I和驱动modem工作。启动MC39I主要是利用微处理器的I/O口控制MC39I的启动输入引脚IGT,微处理器通过模拟IGT脉冲时序触发MC39I启动。