首先,系统需要初始化,如获取用户终端(手机)号码, MMS发送过程所需的MMS网关、端口、MMS中心地址,这些信息都保存在系统配置文件中,另外还需要初始化一些相关的数据结构。初始化之后系统进入到一个超级循环当中,随时准备接收来自用户终端的命令短信息。目前,命令短信息有两个,其中最重要的是“Get”命令,用以获取 MMS信息;还有一个“Set”命令用以设置用户终端号码,该命令由于流程图的尺寸问题在图 4中省略了。收到“Get”命令之后,系统依次调用JPEG采集模块、 MMS制作模块、GPRS拨号、MMS发送模块。这些模块的调用,除了MMS制作模块,都遵循一个基本原则,我们称之为三次尝试原则。如果某模块调用不成功,将重复三次,三次都失败,将发送错误报告短信到用户终端。比较特殊的是GPRS拨号,在3次拨号失败后将对GPRS模块进行复位,再尝试拨号。该原则符合无线通讯自身的特殊性,可以有效提高程序的效率和稳定性。另外有一点需要注意,在 GPRS状态下是无法发送短信的,因此,拨号登陆成功之后需要断开 GPRS连接才能发送短信。这也是为什么无论 MMS发送是否成功,都必须先断开 GPRS,再发送报错或成功报告短信的原因。
3.2 JPEG图像采集
JPEG图像采集模块通过串口控制 C328 JPEG摄像头直接获取 JPEG图像,这种选择大大降低了处理器的负担。关于该摄像头的硬件信息见参考文献 [1]。该软件模块大部分为顺序过程,后面的过程都建立在前一个过程正确执行的基础上。总体上可以分为三个步骤:初始化 S3C44B0串口、初始化摄像头、获取图像,详细过程如下:
1.初始化 S3C44B0串口,包括: O_RDWR | O_NOCTTY | O_NDELAY方式打开 UART1也就是“/dev/ttS1”[2],设置波特率 57600,8位数据位,1位停止位,无奇偶校验,读写超时设置为 1秒,初始化 jpeg_picture结构体:
struct jpeg_picture
{
int fd; //串口的文件描述符
unsigned char resolution; // 图像分辨率代码
long jpeglength; //图像长度24位表示
unsigned char *pjpeg; // 图像存储地址
};
1 JPEG摄像头,包括:发送 SYNC命令与摄像头建立连接,,发送 Initial命令设置输出 JPEG格式图像、分辨率 640X480,发送 Set Package Size命令设置数据包的大小为 512字节。
2 获取图像,包括:发送 Snapshot命令捕获图像快照并压缩,发送 Get Picture命令获取 Snapshot类型图像,接收 Data命令确认数据类型为 Snapshot以及图像数据大小,并为图像分配对应空间,之后开始接收数据包,每收到一个数据包后发送带有数据包 ID的 ACK命令给摄像头,直到最后一个数据包 ID为 F0F0,数据接收过程结束。
通讯协议采用一种如图 4的应答方式, ACK代表上一个命令或操作成功,NACK则说明失败,确保了通讯稳定。 C328定义的命令是统一的 6个字节长度,起始为固定的 0xAA,然后是命令字节,后 4个字节是与命令相关的参数字节。
3.3 MMS制作
MMS 可以包含静态图像、语音、动态图像等多种多媒体信息 [3 4]。图 5左侧为一个通用 MMS结构,由 MMS信息头、 MMS信息体构成。 MMS信息头包含如何从发送终端将数据发往接收终端的信息[5]。MMS信息体是 MMS的实质内容,可以由多个部分多种类型媒体。本系统中目前仅有 JPEG的图像数据,不需要支持所有格式的多媒体信息,因此可以实现针对多幅 JPEG图像的简化版 MMS制作模块。我们使用了最简化的 MMS信息头,包括:消息类型、事务 ID、版本号、From、To等,详情见表 1。