西电星火杯作品展示

2010-11-27

西安电子科技大学

第二十二届 "星火杯" 大学生课外学术科技作品竞赛

软件类说明书

作品名称 : 智能手机学生助理

作品类别 : 软件开发和设计类

1一、项目背景及概述

1.11.1 项目背景

手机是每个人日常生活中不可或缺的一部分。手机的基本功能为通讯,而智能手机则 会用户提供更多的功能。自从苹果公司的 iPhone 出世后,各大手机厂商争相效仿, 这种大屏幕触摸屏的手机也成为未来手机的发展方向之一。

自从台湾联发科推出 MTK 系列手机芯片和配套系统后,手机的研发成本和研发难度大 大降低。这种被称为"山寨机"的手机以其低廉的价格,稳定的性能和虽然平庸但是很 全面的功能迅速席卷了整个中国,使手机真正得到了普及。

2008 年,谷歌推出了开源的 Andriod 系统,此举大大地降低了智能手机的软件成本, 高端手机价格不再高端,智能手机将会越来越便宜,拥有率也将越来越高。

这种大屏幕触摸屏智能手机可以称为类苹果 iPhone 手机,它的大屏幕以及滑动控制, 多点触摸的硬件特性以及开放,潜力巨大的软件特性给了手机上的软件应用以广阔的 舞台,使人们认识到手机除了基本通讯功用外,做别的事也可以做得很好,类 iPhone 手机的流行也使人们认识到了移动互联网产业即将崛起。

魅族公司是国内的一家较早认识到大屏幕触摸屏手机的价值的公司,它在 2009 年初发 布的魅族 M8 手机被称为国产手机的典范,因其低廉的售价和近似于苹果 iPhone 的体 验,受到了国内用户的喜爱。作者在一年前买了一部魅族 M8 RE 手机,而本软件是在 这部手机上开发的。

1.21.2 软件概述

本软件名称为学生助理,它专为学生群体而设计,功能丰富,运行快捷,具有许多同 类软件所不具有的特点。

本软件的主要功能有电子课程表,日程提醒,智能静音设定,网络日记及微博发布, 大学生涯与倒计时,桌面插件扩展等功能。

本软件基于 Window CE 6.0 平台,开发语言为 C++ ,使用了 MFC 以及魅族公司提供 的 SDK 辅助开发,使用的数据库为 SqLite 3.0,开发工具为 VS2008。

2二、用户界面及创新

2.12.1 综述

本部分介绍了界面,功能及创新之处,同时也包含了需求分析和可行性分析的讨论。 下面分各个功能依次介绍。

2.22.2 电子课程表

学生的生活是以上课为中心的,所以课程表对于学生的重要性不言而喻。但是大学的 课程表是很大的一张纸,携带不方便。因此,学生助理软件提供了电子课程表的功能。 这是本软件的基础功能和标志性功能。

课程表

课程表

由于本软件是在手机上运行的,可以随时携带,而且是按周显示的,学生可以随时查 看本周以及其他周的课程信息和教室信息。同时,在顶栏显示了今天正处于第几教学 周,让学生对本学期的进度有了直观的了解。

本软件可以通过点击上一周,下一周查询某一个课次在本学期所有周的课程情况。

本软件还可以查看教室。

同时,电子课程表作为本软件的主界面,提供了其他各个功能的入口。

2.32.3 日程提醒

每部手机都有日程提醒的功能,日程提醒功能可以告诉学生什么时候交什么作业,什 么时候谁过生日等等。但是一般手机自带的日程管理功能对于学生而言都有很多不便, 主要不便之处在于:一、添加新的日程提醒的过程很繁琐。二、无法快速直观地获得 日程信息,特别是对今天以后的日程无法了解。因为以上原因,手机的日程提醒功能 的使用率比较低。

作者发现,学生群体是对星期敏感,而对日期不敏感的,因为学生的生活是以周为单 位的。比如说老师告诉学生下周二交作业,学生可以迅速在脑海里迅速地对这一天形 成直观印象。而如果老师告诉学生 10 月 25 号交作业的话,学生会感到很迷茫。同 时,学生对于日程发生的时间精度要求较低,比如说,老师只要告诉学生下周二上午 交作业就可,而不必说下周二 8:30 交作业。

作者又发现,学生常做的事可以分为几个大类,如交作业,上机实验,与人约会,参 加会议等等,作者将这种大类的事件称为主事件。而每个主事件有可以分为若干个从 事件,例如“交作业”这个主事件可以根据本学期的课程情况再细分为“交高数作业”, “交软工上级报告”,“交大物练习册”等从事件。对于学生来说的话这类事件的发 生频率是非常高的,比如说每周就要交两次高数作业。

鉴于以上两点,本软件的日程提醒功能提供了以星期信息来确定日程时间的方法,只 需要用手指点六次就可以加入时间信息,再点击选择一个主事件和一个从属的从事件 就可以加入日程内容信息,全程只需要点九次就可添加一个日程提醒。相对一般手机, 本软件的日程提醒功能更加方便快捷。当然,本软件也提供了以日期确定日程时间的 功能和手动输入事件的功能,这种事件对于用户来说可能相对重要,作者通过将此日 程设为粉色来突出它的重要性。

日程提醒

日程提醒

本软件还附带一个桌面插件,桌面插件可以摆在手机桌面上,并且常驻内存。它的上 面显示了未来三周的日程列表(列表可以用手指上下拖动),用户一打开手机就可以 对未来三周该做什么事了然于胸。同时根据事件重要性的不同,可以分为绿色事件和 粉色事件,粉色的相对重要些。这个桌面插件提醒的功能是本软件的另外一个特色。 (见 2.7 节)

2.42.4 智能静音设定

由于学生群体的特殊性,每天都要上课,自习,他们的手机经常是要开启静音的。而 据我观察,我们班大部分同学为了省事,全天都将手机设置为静音。这样做浪费掉了 手机的响铃功能,而且经常漏接电话。本软件提供的智能静音设定功能则很好地解决 了这个矛盾,把这些繁琐交给软件。

静音设定

静音设定

因为学生对于一周内的每一天的静音需求不同,本软件提供了为每一天分别设置静音 的功能。同时,为了让用户更好地了解静音功能的使用,作者引入了静音区间的概念。 静音区间为一个时间段,比如说用户在星期一早上有两节课,用户就可以在星期一下 面加入两个静音区间:8:30~10:00,10:30~12:00。当现在时刻落在静音区间内的话, 自动开启静音,当时间过了 12:00,静音将会关闭,响铃开启,这样的话放学回宿舍 路上就不会漏接电话了。

作者引入静音区间而不是响铃区间等的原因是,学生更加确切地知道手机在时候不能 响(上课,自习)。同时,通过规划自习时的静音区间,还可以帮用户养成按时自习 的好习惯。

要实现本功能并不需开启主程序,只用开启本软件配套的桌面插件就可以,桌面插件 开机启动,常驻内存,判断现在时刻是否开启静音功能并执行。同时,桌面插件还提 示用户还有多少分钟进入静音区间或者还有多少分钟走出静音区间,给用户一个心理 准备。

2.52.5 网络日记与微博发布

写日记是人类的一种普遍行为。比如说,我们听了一首很好听的歌或者看了一部好看 的电影,会产生很美妙的感觉,但是时间久后回忆时,会发现这种感觉变淡了,变质 了,甚至无迹可寻,这是很可惜的一件事。而写日记的价值之一就在于记录这些感动, 记录自己的心路历程,让回忆有迹可循。

但是,我发现现在的人们特别是大学生,很少有人写日记了。原因在于:一、学生们 住在宿舍,很少有自己的私密空间,写日记不方便;二、学习繁忙,无法抽出时间来 写日记;三、写日记的传统载体--日记本,无法随身携带。鉴于以上三点,我想到为 学生助理软件加入写日记的功能。

因为手机是随身携带的,所以学生可以随时随地方便地写日记。日记写完后可以存到 手机上,也可以上传到网络。但是存在手机上风险较大,因为手机可能会丢失,手机 上的文件也可能被他人窥视,数据也可能丢失。鉴于此,本软件选择将日记上传到网 络的一些值得信任的载体。

本软件的网络日记的载体是新浪微博。作者认为,以实现写网络日记的功能为重,而 选择什么网络载体为轻,又恰巧新浪微博开放了 API,于是作者便选择了它。用户可 以在新浪注册一个不为人知的账号,在本软件上写完日记,点击发送,就可以将日记 传到网上。

日记微博

日记微博

手机上的 UCWEB 等浏览器也可以实现发布微博,上传日志的功能,但是本软件的日记 功能相对它们有独特的优点。一、快速。从打开软件到进入写日记界面只需不到两秒, 并且在写日记的同时,手机自动启动 Gprs 连接。而使用 UCWEB 的话,从开启浏览器, 连接 Gprs,再到进入写日记的界面要耗费 30 秒左右,这恐怕会影响到用户写日记的 心情。二、界面简洁。给了用户一个写日记的环境和氛围,而浏览器则会有广告等不 合时宜的东西。三、专门提供了文本编辑功能,还可以添加表情(与新浪微博的表情 一一对应),这是手机浏览器做不到的。

另外,本软件也可以作为微博发布工具,用户可以通过它快速发布微博,让你的朋友 即时了解你的状况,也可以让你拥有的一些有用信息可得到快速传播。

2.62.6 大学生涯与倒计时

我们的时间在一天天我流逝,我们的大学进度多少了?还有几天结束?我们是否正在 挥霍光阴?针对这个思考,作者在学生助理软件中加入了学生生涯及倒计时的功能。

倒计时

倒计时

用户需要在设定界面设定学生阶段(大学或者高中或者其他),本阶段开学日期,本 阶段毕业日期等,保存后就会在学生生涯界面显示出你的进度,还有多少天多少小时 多少分钟多少秒本阶段结束,比如说大学进度:67.38% 剩余时间 479 天 13 小时 45 分钟 34 秒。剩余时间是随时钟动态按秒更新的,它给我们学生以紧迫感,敦促学生 们抓紧剩余的大学时光,实现自己的阶段理想。

同样,学生生涯的信息也会在桌面插件上显示。

2.72.7 桌面插件扩展

以往手机的屏幕大小都在 2.4 寸以下,苹果的 iPhone 出世后,大屏幕触摸屏手机迅 速流行。大的屏幕为手机软件提供了更宽广的舞台,桌面插件也应运而生。一般桌面 插件是以美观炫目为目的的,而本软件附带的桌面插件则更注重实用,并且是主程序 不可分割的一部分。

本软件的桌面插件的主体部分为未来三周的日程列表,用户一打开手机就可以获得想 要的信息,不需要打开学生助理主程序。同时,日程列表中。主次分明,粉色事件重 要性大于绿色事件。

桌面插件

桌面插件

3三、技术层面

3.13.1 综述

本软件基于 Window CE 6.0 平台,开发语言为 C++ ,使用了 MFC 以及魅族公司提供 的 SDK 辅助开发,使用的数据库为 SqLite 3.0,开发工具为 VS2008。

Window CE 为微软开发的一款嵌入式操作系统,而 Win CE 6.0 版本是一个开源的版 本。国内的手机制造商魅族公司在 Win CE 6.0 的基础上进行了定制,界面优化,并 在 2009 年初推出了一款搭载此操作系统的智能手机,魅族 M8。而本学生助理软件也 正是在魅族 M8 上面开发的。

SqLite 3.0 为一款开源的轻量级数据库,因为占用内存小,运行速度快,所以在嵌入 式设备中被大量应用。鉴于此,我选用了此数据库,而事实上,它的运行速度确实令 人满意。

MFC 编程的显著特点是窗口类,本软件的类视图如下。

类图

类图

上图中方框表示各窗口类,圆形表示数据库,箭头表示数据的流向。各窗口类,各功 能模块之间保持一定的独立性,而维系它们之间关系的是数据库。

以下 3.2~3.7 节是各个功能模块的具体实现。

3.23.2 电子课程表

实现本功能的思路是在新建课程表时以本学期开学日期为起点,在数据库内插入 200 笔记录(一学期的天数不会超过 200),用着这 200 笔记录来表示本学期 中各天的日期,第几周,星期几,以及当天所有课程信息和教室信息。并且只在 新建课程表是才插入记录 (insert), 而在编辑课程表时,对数据库的操作为更 新记录 (update) ,这样避免了产生冗余数据。

数据库建表操作如下:

db.execDML(L"create table schedule   
             (date char(12),            //此天的日期  
             week int,                  //此天位于本学期第几周  
             dayweek int,               //此天是星期几  
             first_c char(20),first_r char(20),    //第一节课的课程名与教室   
             second_c char(20),second_r char(20),  //第二节课的课程名与教室   
             third_c char(20),third_r char(20),    //第三节课的课程名与教室   
             fouth_c char(20),fouth_r char(20),    //第四节课的课程名与教室   
             fifth_c char(20),fifth_r char(20));");//第五节课的课程名与教室

插入记录的操作如下:

wsprintf(szsql.C_Str(),L"%s%s,%d,%d%s",    
         L"insert into schedule    
         (date,week,dayweek,    
         first_c,first_r,    
         second_c,second_r,    
         third_c,third_r,fouth_c,    
         fouth_r,fifth_c,fifth_r)     
         values (",szdate.C_Str(),w,d,L",    
                 ' 休息 ',' ╱ ',' 休息 ',' ╱ ',  
                 ' 休息 ',' ╱ ',' 休息 ',' ╱ ',' 休息 ',' ╱ ');");    
db.execDML(szsql);  

为了获得这 200 天中每天是在在第几教学周,是星期几,我设计了一个日期类 m8Date, 在这个类中定义一个函数 m8Date NextDay(m8Date &mdate) ,因为 m8Date 的数据成 员包括日期,第几教学周,星期几,而这个函数的作用是根据某一天的 m8Date 返回下 一天的 m8Date,每插入一笔记录,这个函数运行一次,200 次后,数据库中的 200 笔记录都得到了正确的星期信息。

3.33.3 日程提醒

本功能数据库建表操作如下

db.execDML(L"create table agenda   
            (date_time char(50),  
            week_time char(50),  
            vague_time char(10),  
            remind char(100));");

其中 date_time 为日期 + 详细时间,week_time 为周次信息(比如说下周三,下下周 五),vague_time 为大略时间(比如中午,晚上等),remind 为日程提醒的内容。

由于功本能提供了快捷设定事件时间和详细设定事件时间两种设时途径,所以我 写了两个同步函数

void PreciseToVague() ;  
void VagueToPrecise() ;

每当点击上面的详细设时按钮设时后,就会执行 PreciseToVague() ,下面快捷设时 按钮上的数值会同步改变。每当点击下面面的快捷设时按钮设时后,就会执行 VagueToPrecise() ,上面详细设时按钮上的数值也会同步改变。

因为日程提醒功能与桌面插件是共享数据库中的同一笔数据的,而桌面插件对于算法 的时间空间复杂度要求较高(否则它会很卡),因此当日程数据插入数据库中,就需 要对数据进行预处理,使它被桌面插件读出后能够不经处理直接使用,以尽量减少桌 面插件的负担。

主事件和从事件也是本软件的特色功能,数据库为主从事件建立了一张表:

db.execDML(L"create table thing   
            (bigthing char(50),        //主事件  
            smallthing char(100));");  //从事件  

3.43.4 智能静音设定

静音设定功能中,数据库的建表操作如下:

db.execDML(L"create table silenceset   
             (dayweek char(20),  
             begintime char(20),  
             endtime char(20));");  

dayweek 表示了星期几,begintime 为静音区间的开始时间,endtime 为静音区间的 结束时间。

同日程提醒功能一样,本功能也是与桌面插件共享数据库的。桌面插件通过查询数据 库来判断现在时刻是否开启静音。

3.53.5 网络日记与微博发布

本功能涉及到网络编程,使用了 <Wininet.h> 头文件中的 http 传输功能。

http 传输的一般过程如下:

  1. 调用 InternetOpen 获得句柄
  2. 调用 InternetConnect 发起会话
  3. 调用 HttpOpenRequest 发送 http 请求
  4. 调用 HttpAddRequestHeaders 添加各个头部
  5. 调用 HttpSendRequest 发送请求
  6. 调用 HttpQueryInfo 查询请求

传输新浪微博的账号密码需要用的是 Base 64 Encode,传输日记正文需要用 urlEncoding_UTF-8 编码。不像 JAVA 和 PHP 直接提供转化函数,VC++ 在网络编程上 相对显得要 " 弱势 " ,所以要一步一步来,拿 urlEncoding_UTF-8 为例:

因为 Win CE6.0 中流通的字符为宽字符,所以要先将正文转化为单字符,再将 它由 GB2312 编码转换成 UTF_8 编码,再进行 urlEncoding:

WcharToChar(content_M.C_Str(),content_S);  
GB2312ToUTF_8(content_S_1,(char*)content_S.c_str(),content_S.length());   
string content_U=urlEncoding(content_S_1);  

然后加上数据包的头部,再将编码后的正文和 Base 64 编码后的账号密码连接上并 "POST" 到新浪的微博上。

在如何获知数据包头部的问题上,作者是通过 Sniffer 抓包工具,分析了电脑上的另 一款新浪微博发布工具所发送的数据包,然后我模仿此数据包为我的代码添加相应的 头部,尝试了多次后终于发送成功。

3.63.6 大学生涯与倒计时

实现这个功能的关键是计算日期差,思路利用系统提供的函数,将实际时间转化为文 件时间:

SystemTimeToFileTime(&sys_time,&file_time);

再将文件时间转化为 64 位整数 LARGE_INTEGER,再经转化相减后得到两个日期间差的 秒数,再将秒数除以 24*3600 即得到日期差。

3.73.7 桌面插件扩展

这里我自定义一个类 MyUiList,继承自列表控件 UiList,并且重写了它的 UiList 的 一个虚函数:

virtual void DrawItem (HDC hdcDst, int nIndex, RECT *prcItem, RECT *prcWin, RECT *prcUpdate);

重写的结果是,将列表分成几列,并且当新增的 Item 为重要日程提醒时,在事件的 底部画一个粉色的矩形;当增的 Item 为普通日程提醒时,在事件的底部画一个绿色 的矩形。

为了实现桌面插件显示信息的动态更新,我在加入了好几个 SetTimer 函数,其中一 个为

SetTimer(GetParentWnd(), GetID(), 5000, 0);  

它实现了每隔 5 秒钟查询一下数据库中的数据是否被改动,被改动的话,执行下面函 数。以实现即时更新

PrintAgenda();  
PrintSilenceSet();  
Invalidate();  
Update(); 

桌面插件与主程序之间的交互是通过数据库来进行的,它们共享一个数据库。不过桌 面插件只能读,不能写。

4四、用户说明书(在本文中略去)


说明:10 年写的文档,原来放到了 CSDN 上,现在把它转移过来。