1、 I 的 智能手机通信 功能 的 设计 与实现 摘 要 本文介绍以 UP-TECH S2410 作为核心开发板, UP-GPRS 作为无线收发模块,嵌入式Linux 作为操作系统, Qt4.5 作为编程开发环境的 智能手机系统不同的实现方式。结合实践,实现 了 智能手机语音通话 .短信收发等 主要 功能 ,分析了作为一个可收发系统,多线程和定时器两种实现方案 的不同实现过程 ,进而 总结 归纳 了两种方案 各自的优缺点 。 关键字 智能手机 Qt 多线程 定时器 多线程通信 Design and implementation of smart phone communication syste
2、m Abstract This article introduces the UP-TECH S2410 as a core development board, UP-GPRS as the wireless transceiver modules, embedded Linux as the operating system, Nokia Qt4.5 as a development language, different smart phone system implementations. With practice, through the realization of intell
3、igent mobile voice calls, text messaging and other basic functions of the system as a transceiver, the implementation process of multi-threading and timers and their respective advantages and disadvantages are analyzed. Keywords smart phone Qt multi-threading timers Multi-thread communication 0 概 述
4、自从上世纪末叶,手机巨头摩托罗拉推出 第一款名为天拓 A6188 的智能手机后, 智能手机 行业 蓬勃发展, 时至今日, 已是 百家争鸣 , 各 有所长 。 各大厂商 针对智能手机的 投入也逐步增大 , 导致 在 该 研究领域 ,从嵌入式平台的搭建、 操作系统和 GUI 应用程序开发框架的选择,到嵌入 式软件的设计与开发,每一个方面都 炙手可热 。 与其它操作系统相比 , Linux 具有二个其它操作系统无法比拟的优势。其一, Linux具有开放的源代码,能够大大降低成本。其二,既满足了手机制造商根据实际情况有针对性地开发自己的 Linux 手机操作系统的要求,又吸引了众多软件开发商对内容应用
5、软件的开发,丰富了第三方应用 。越来越多的厂商加入了基于 Linux 操作系统的智能手机的研发中 。 Qt 是诺基 亚开发的一个跨平台的 C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的功能。 Qt 是完全面向对象的,很容易扩展,并且允许真正地组件编程。它具有优良的跨平台性,面向对象,丰富的 API,支持 2D/3D图像渲染,支持 OpenGL 等众多优点。 图 1 为智能手机系统的 三层结构。 底层 为操作系统层,中间层为服务程序层,上层为用户界面层。 设计 智能手机 系统 的关键在于各项功能的实现 即服务程序层的 编写 ,如接 /打电话,接 /发短信, 收
6、发 电子邮件, 运行 游戏等 。 图 1 智能手机软件系统结构 用户界面层( GUI Interaction) 服务程序层 (function Server) 嵌入式操作系统( embedded OS) 移植 经过裁剪的 Linux 操作系统, 可以方便的构建嵌入式操作系统层。 而用户界面层 则采用 Qt Designer 设计应用程序界面并绑定到 qtopia 下。 本文 重点 阐述 了采用多线程和定时器两种 方 式设计和实现服务程序层 的 方法 。 1 采用 Qt 多线程实现服务程序层 1.1 服务线程的设计与实现 手机功能的实现(接 /打电话, 收 /发短信)涉及到 对 GPRS/GSM
7、 模块串口的读 /写。 通过 AT指令,应用程序可以很方便的和 GPRS/GSM 模块进行交互,如拨打电 话: ATD;( 为被叫电话号码)。 对于手机用户的主动操作( 如 对手机界面的切换,打电话,发短信等), 通过 建立一个QAServer 线程 进行响应。而对于手机的被动操作( 如 有电话呼入,有短信到来等), 通过建立一个 QLServer 线程,用于对 gprs 模块的串口进行监听,并根据从串口中读取的不同的信息触发 QAServer 线程中的相关操作进行响应。 二者关系上, QLServer 线程 辅助 QAServer线程 ,实现各项功能。 QLServer 线程主要是用于对 g
8、prs模块进行监听,并唤醒 QAServer 线程 中的相 关响应操作。 QLServer 线程 主要包含以下几个函数(相关的信号函数将在下面讨论): void readGprsData(int fd,QString gprsSC); /读取串口中的字符信息 void encodeGPRS(Qstring gprsSC); /解析读出的信息,并唤醒 /QLServer 中的响应操作 QAServer 线程主要是用于执行相关的 响 应 操作,如 拨打 /接听电话 等。 QAServer线程 主要包含以下函数(相关的槽函数将在下面讨论): void call(QString); /打电话 void
9、 answer(); /接电话 void hanUp(); /挂电话 void sendMessage(QString MES,QString serverNum,QString TeleNum); /发送短信,调用了 enCodeMES void enCodeMES(QString MES,QString serverNum,QString TeleNum); /对要发送的短信进行编码 void readMessage(QStirng index)/读取短信,并触发用户界面层的界面操作 ( /调用了 unCodeMES) void unCodeMES(QString mesrc,QStrin
10、g phonenum);/解析要读取的短信 整个应用程序 共 包括 3 个线程 及 主线程 , 从而构成了用户界面层 。 所有涉及 界面的操作必须在主线程中实现, 主线程也被称为 GUI线程 ,它是唯一一个允许执行 GUI 相关操作的线程 ( 而且必须在创建一个 QThread 之前创建 QApplication(or QCoreApplication)对象 ) 。在 QAServer 中的界面操作, 则 是通过 signal/slot 机制, 通过 QAServer 线程类中创建一个 signal (信号),在主线程的界面管理类中创建一 个 slot(槽)。 一旦 QAServer 线程发送
11、 相关 修改界面的信号, 主线程即接收并对信号进行处理,进而调用相 应的界面管理类的方法(槽)来 响应操作 。 1.2 线程间的通信流程 本段以接收,阅读短信并发送短信为例, 说明 服务程序层 的线程间通信的流程,如图 2 1 QLServer 线程和 QAServer 线程以及主线程, 消息循环,等待可能输入进行相应 。QLServer 不断监听 GPRS/GSM 模块传送过来的信号,当有短信到来时,由 QLServer 解析出是短信信号,并把解析出的短信索引位置( index)通过 QT 线程之间的传递机制发送给QAServer 线程。 2 QAServer 线程通过索引位置( index
12、)解析出发送方的号码,并发送消息给主线程。 3 主线程调用界面管理对象中的方法,弹出提示框,提示有新短信到来,用户是否需要阅读短信。用户点击阅读短信,主线程将短信索引位置返回发送给 QAServer 线程。 4 QAServer 线程接收到消息后,调用短信解析函数 readMessage,解析出短信内容,并(把) 发送消息给主线程,主线程调用界面管理中的方法,显示短信内容。 5 编辑短信内容,输入目 标号码,点击发送短信。主线程将短信内容 、 短信中心号码 、目标号码 以消息的形式,发送给 QAServer 线程 6 QAServer 线程调用 sendMessage 函数,编码短信。并通过
13、AT 指令,向 GPRS 模块串 口写入编码后的短信。短信将被 GPRS 模块发送。 G P RS / G S M模块m a i n线程Q L s e r v e r线程Q As e r v e r线程1 . L i s t e n i n g2 . M e s s a g e a r r i v e3 . M e s s a g e i n d e x4 . i n d e x A N D P n u m5 . i n d e x6 . M e s s a g e c o n t e n t7 . r e p l e M e s s a g e8 . s e n d M e s s a g
14、e ( A T )G UIl e v e lS e r v e r l e v e lPh y s i c a l l e v e l图 2 线程间的通信(以接收,阅读,发送短信为例) 1.3 线程间通信机制的方式与实现 1.3.1 QCOP 协议 QCOP 是 Qt 内部的一种通信协议, 该 协议用于不同 的客户之间在同一地址空间内部或者不同的进程之间的通信。目前, 此 机制还只在 Qt 的嵌入式版本( Qt/Embedded)中提供 . QCOP 利用继承自 QObject 的 QCopChannel 类来实现 。 QCopChannel 可以实现多个线程之间的通信。 QCopChanne
15、l 类提供了静态函数 send()来发送需要传递的消息和数据,静态函数isRegistered()来查询某个 Channel 是否已经被注册。当从 Channel 中接收消息和数据时 ,需要构造一个 QCopChannel的子类并重写 receive()函数 ,或者提供一个槽并利用 connect()函数将 receive()信号连接起来。 以 QLServer 线程监听到新短信,向 QAServer 线程发送短信索引位置( Message index)为例 ,说明采用 QCOP机制线程之间的通信方式。 在 QLServer 中的方法: QByteArray data;/如果字数过多,建议删减
16、此处 QDataStream out( out =0) emit newMes(QString index); /*解析出新短信到来,发送新短信到来的信号。信号中包含短信的存储索引位置( index) */ 在 QAServer 中的方法: public slots: void readMessage(Qstirng index);/定义 槽函 数 关联信号和槽,是在主线程的界面管理类中的构造函数中,关联函数如下:QObject:connect(QLSerObj,SIGNAL(newMes(QString index),QASerObj,SLOT(readMessage(Qstirng ind
17、ex); ( 1.3.3 其他的通信机制 Qt 程序的线程还可以通过事件进行通信,在 QThread 中通过 QThread:postEvent()方法将事件提交给一个对象,该方法提供了一种 Thread-safe 的事件提交过程。提交的事件被放进一个队列中,然后 GUI 主事件线程被唤醒并将此事件发给相应的对象。但该方式适用于非主线程和主线程之间的通信,因而使用受到限制。这种通信机 制在本系统中无法方便的满足非主线程与非主线程之间的直接通信。由于 采用的嵌入式操作系统为 Linux,而 Qt做为一个跨平台开发工具,不仅支持自己特有的通信机制,也支持 Linux中有名的管道通信机制,即 FIF
18、O 机制 .) 2 采用 Qt 定时器实现服务程序层 首先 建立一个 GprsServer 类, 在类的构造函数 中 创建并启动定时器 TimerProcess,并利用信号和槽机制中的 connect 函数, 将定时器 超时 为信号 与功能处理函数 processGprs 为槽函数 相关联 () 。然后 通过功能处理函数 processGprs 来间隔的读取串口和处理用户的相关操作(如接 /打电话等)。用户的不同操作将通过标志变量来确定,用户的操作和读取串口提取出来的信息都会设置相应的标志变量(如用户点击发送短信, SendMF 被置为 1。 SendMF为 1并且定时器超时,发短信功能代码将
19、被执行同时 SendMF 被 重 置 0)。如图 3 为定时器的流程图 。 定时器t i m e O u t Sl o t弹出收到新短信提示m e s s a g e N o t i f y阅读短信r e a d M e s s a g e发送短信s e n d M e s s a g e读取串口r e a d G p rs字符中是否含有“ + C M T I “字符中是否含有“ R i n g ”弹出呼叫提示c a l l N o t i f y1 5 0 m s 触发N e w M F为 T R U ER e a d M F为 T R U ES e n d M F为 T R U E读取一定
20、长度的字符串获得短信 i n d e x置 N e w M F 为 T R U Ee l s e图 3 定时 器实现服务层的程序流程图 3 实验结果 ( 通过分别 ) 采用多线程和定时器两种程序架构, 分别 实现了智能手机电话拨打 /接听 /拒接 和 短信接收 /发送等基本功能,并着重研究了 QT中关于多线程间通信的实现途径 , 进而对比 得出以下结论: 1 使用多线程将程序划分为多个 独立的任务, 因此 可以提高应用程序的响应速度。在采集 GPRS 串口数据线程的运行过程中,用户界面也可以一直 保持 活动状态,即时无延迟感的响应用户的操作。另外多线程中 由 专门的线程负责采集 GPRS 数据
21、的线程, ( 这样就 ) 可以保证读出 GPRS 串口发送 过来的全部数据,确保了数据的完整性。 ( 但 使用多线程的 ) 缺点是使用多线程会带来一些不确定因素。如果线程之间的通信没有处理好,会产生数据的不同步和线程安全问题。其次,使用多线程在技术上有一定的难度。 2 使用定时器的优点是,功能的划分比较明确,实现难度相对较低,出现异常的情况可以得到控制。缺点是对设备的利用率不高,每次对 GPRS 串口的采集都有一定的时间间隔,这就要求硬件设备有一定大小的缓冲区。在一定情况下,如大量信息的接收,有可能产生数据的丢失。 4 结束语 本文 通过智能手机项目,总结了 实现智能手机后台功能服务程序的两种
22、框架, 并对两种框架的设计和具体实现过称进行了阐述。对采用多线程或定时器实现智能手机系统的可行性和优缺点,进行了实践验证和总结。 由于 两种程序框架均具有良好的可扩展性,如在采用多线程设计的框架中只需要添加线程和增加功能函数,在采用定时器设计的框架中 只需要增加标志变量和功能函数,手机的功能都可以得到良好的扩展,这为后续开发奠定了基础。鉴于智能手机通信系统的设计要么是采用多线程 /进程或定时器,要么是多线程 +定时器,笔者分别采用两种方式设计的程序框架和对采用这两种方式实现程序框架的 优缺点的总结,对智能手机的开发者具有一定的参考价值。 参 考 文 献 1 蔡志明 . 精通 Qt4 编程 M.北京:电子工业出版社 ,2008. 2 赵庆丽 ,魏东兴 ,郭永山 .基于嵌入式 LINUX 的 GPRS 数据传输系统 J.信息技术 ,2004。 3周绪宏 . 智能手机系统软件设计与研究 D.上海交通大学 , 2007. 4孙英 . 短信收发中的 PDU 编码分析 J. 内蒙古科技与经济 , 2007, (01) 5 李志伟 . 基于 AT 指令的串行通信程序的设计 J. 微计算机信息 , 2007, (09) 6 车朝雄 ,赵彦敏 . 基于串口的手机收发短信的设计方法 J. 福建电脑 , 2006, (02) .