Trolltech Greenphone SDK 入门

作者:Robert E. Hartley

Trolltech 最近发布了许多智能手机开发者的梦想组合——基于 Linux 的 Greenphone 及其开源 Qtopia Phone SDK。

Trolltech Greenphone 是一款功能齐全的三频 GSM (900/1800/1900MHz) 手机,内置 130 万像素摄像头。与许多其他现代智能手机一样,它具有 QVGA 触摸屏、蓝牙、客户端 USB、mini-SD 闪存和立体声音频连接器。

在机身内部,它围绕 Marvell 312MHz PXA270(ARM) 处理器构建,运行 64M RAM,并具有 128M 内置闪存存储。它还使用与 Palm Treo 相同的经过现场验证的 Broadcom BCM2121 GSM/GPRS 基带处理器模块。

Greenphone 几乎可以被描述为 Palm Treo 的运动型 Linux 版本。它更轻、更紧凑,并且可以提供您想要的任何颜色——只要它是绿色的!

Qtopia Greenphone SDK 简介

Greenphone SDK 是 Qtopia Phone Edition 的一个发行版,专门配置用于 Greenphone。Qtopia(前身为 Qt Embedded)从 Trolltech 的旗舰产品 Qt 继承了其 API,Qt 是一个成熟的 C++ 应用程序框架,适用于 Linux/X11、Windows 和 Mac OS X。Qtopia 专门为嵌入式 Linux 设备(如手机、PDA 和家电设备)进行了增强。

Qtopia 非常自给自足——直接位于底层操作系统之上,它提供自己的字体和图像渲染、窗口管理和输入处理。除了这种幕后工作之外,Qtopia 还充分利用了 Qt 标准化访问文件、网络、多线程、国际化、图形处理以及 GUI 小部件的所有丰富功能。

与其大哥 Qt 一样,Qtopia 可以免费下载,供那些想要进行 GPL 风格开源开发的人使用,也可以通过从 Trolltech 购买商业许可证获得。

Qtopia 还捆绑了一套个人信息管理工具,正如在任何 PDA 或智能手机上所期望的那样。

包装盒内

当您打开 Greenphone 的包装盒时,您会发现开始开发所需的一切:手机、电源、USB 电缆、立体声耳机和 Greenphone SDK CD-ROM。最后这个项目包含 VMware 播放器的副本和一个预装了 Debian Linux、Qt、Qtopia、KDevelop、本机开发工具和完整 ARM 交叉编译工具链的虚拟机。

Getting Started with the Trolltech Greenphone SDK

图 1. Greenphone 包装内容

实际使用您新创建的应用程序所需的唯一其他项目是具有当前有效帐户的 GSM 用户身份模块 (SIM) 卡。

什么是 GSM?

蜂窝通信的两个最广泛使用的标准是 GSM 和 CDMA,GSM 在全球范围内超过 CDMA 的比例约为 10 亿用户对 2.7 亿用户。尽管它们在彼此的网络上完全不兼容,就像 AM 和 FM 无线电一样,但普通用户通常只会注意到 GSM 手机上的电话帐户通常与 SIM 卡绑定,因此更换手机非常容易。

GSM 目前代表全球移动通信系统。它是由非营利性欧洲电信标准协会 (ETSI) 管理的开放标准。GSM 允许出色的互操作性,从而更容易实现国际漫游。GSM 的其他声誉是更高的数字语音质量;廉价的短消息服务 (SMS);用于交换图像、音频、视频和富文本数据的多媒体消息服务 (MMS);最后,通用分组无线服务 (GPRS),通常用作互联网网关,按传输的数据量(以兆字节为单位)计费,而不是按在线时间计费。

Greenphone 实际上基于两个 ARM RISC 处理器:一个强大的 Marvell 312MHz PXA270 充当 PDA 部分,并与基于 ARM7 的 GSM/GPRS 通信控制器通信。该控制器实际上是电话组件的核心和大脑。它也像调制解调器一样工作,并接受 GSM AT 风格的命令来拨号、接听电话、发送或接收消息以及 GSM/GPRS 通信设备的其他典型活动。

标准 GSM 调制解调器 AT 命令可以发送到手机,手机执行命令然后返回响应代码。这些 AT 命令类似于数十年前的 Hayes 调制解调器命令,但用户不是使用或编程诸如“+++ATDT16505511676”之类的字符串来拨打 Trolltech 的号码 1-(650) 551-1676,而是使用 GSM 版本的命令集做同样的事情,并且字符串看起来更像“ATD16505511676”。

还有无数其他 AT 命令用于处理 GSM/GPRS 电话单元可以做的所有事情。这些命令包括设置电话和建立各种类型的通信,例如语音通话、SMS 和 MMS,它们可以用于获取有关信号强度、网络状态等方面的信息。

有关这些标准化命令的全面描述,您可以从 ETSI 网站下载以下文档

Qtopia 将这些命令中最常用的命令嵌入到 C++ 类包装器中。Qt Assistant 中的在线文档描述了如何在标题为“GSM 调制解调器集成”和“调制解调器模拟器”的部分中使用和增强这些类。

为了离线测试应用程序,Greenphone SDK 提供了一个调制解调器模拟器,允许在不必实际加入网络和上线的情况下测试软件。

Gnokii

有关使用 GSM AT 命令代码的 Linux 程序的出色示例,请查看 Gnokii——它是一个了解 GSM 调制解调器的好工具,因为您实际上可以观察到与发送和接收的数据的每次事务,以执行拨打电话、发送 SMS 消息等命令。它与大多数具有串行或 USB 数据连接器的现代手机配合良好。在本文印刷时,它可能已经在 Greenphone 上本地运行。有关完整详细信息,请访问 www.gnokii.org

准备就绪

加载开发环境很简单——在 Windows 或 Linux 上运行安装程序,肯定地响应提示,在一分钟内,您将安装 VMware 和 SDK 工具、应用程序源代码、文档和二进制文件,并在桌面上有一个图标来启动它们。

这使得使用 MS Windows 的不情愿的开发人员可以非常轻松地进入嵌入式和桌面 Linux 以及 Qt 应用程序开发。

在撰写本文时,使用 Macintosh OS X x86 版本的开发人员可以在 VMware Fusion 下使用 Greenphone SDK,但他们需要从另一个安装中复制虚拟机的​​文件;但是,这可能会在本文发布时发生变化。

提示

基于 VM 的跨平台开发的一种技术是将您的显示器从 Linux VM 导出到运行 X11 服务器的主机。这可能是本地运行在 Linux 主机上的内置 X11 服务器、Apple 为 OS X 提供的可选附加组件,甚至是 Windows 机器上的 Cygwin。我使用旋转 90° 的屏幕,以便在不滚动的情况下阅读更多行代码,因此这个技巧有助于使 VM 配置尽可能通用。当 X 服务器在主机上运行时,GUI 性能通常会得到增强,因为最低级别的渲染会被尽可能地推到管道的下游——通常是在显示适配器的 GPU 上。使用这种方法,几乎可以使 Windows 和 OS X 感觉像 Linux 盒子。

开始构建应用程序

Trolltech 始终随其产品附带大量文档和示例代码,演示所有常用功能,Greenphone SDK 也不例外。首先,“开发者快速入门指南”展示了构建应用程序需要做的事情,只需几行代码即可完成。

首先,我们通过单击桌面上的 runqvfb 图标来启动使用 Qt Virtual Frame Buffer 和 Greenphone 皮肤的 Qtopia 模拟器。这类似于 Qtopia 的 X 服务器,它提供了手机上运行程序的精确像素级表示。

然后,我们通过单击 runqpe 图标来启动 Qtopia 电话环境,然后它连接到 qvfb 进程并在其虚拟屏幕中显示其内容。

Getting Started with the Trolltech Greenphone SDK

图 2. qvfb 运行,其中 qpe 在其中运行

我们需要运行一个脚本来设置我们的 QPEVER 和 PATH 环境变量,并定义一些用于与手机通信的函数。如果为 x86 版本的 Qtopia 构建,我们将使用

. /opt/Qtopia/SDK/scripts/devel-x86.sh

否则,如果为实际的 Greenphone 本身构建,我们将选择交叉编译环境,如下所示

. /opt/Qtopia/SDK/scripts/devel-greenphone.sh

然后,我们更改到我们的目录并构建

cd ~/projects/application
qtopiamake -project && qtopiamake && make && gph -p -i

qtopiamake 程序是 Qtopia 版本的 Qt qmake 实用程序。如果给定 -project 参数,它可以根据当前目录的内容生成 .PRO 项目文件,但其最重要的工作是使用项目文件作为起点,根据 Qtopia 的已安装配置和我们想要的构建类型生成 Makefile。

注意

值得指出的是,这里描述的命令用双 & 符号 (&&) 分隔,以使命令字符串的执行在遇到错误的第一点停止。在这种情况下,它将阻止 shell 尝试执行或安装构建失败的程序。

通常,我们仅在有新文件添加到我们的项目时才生成新的 .PRO 和 Makefile,但是 qtopiamake 执行时间非常短,以至于经常看到它每次都从标准 shell 脚本运行。

gph 实用程序

gph 实用程序是一个有用的 awk 脚本,它为在 Qtopia 环境中(无论是模拟的还是实际在手机上)执行构建、打包、安装和运行应用程序等操作提供了便捷的功能。它可以代替 make 调用,并且功能强大,我们甚至可以使用它将原始源代码转换为从软件包安装到真实或模拟设备上的正在运行的应用程序。

例如,要重建代码、打包它并在 qvfb 上安装和运行,我们将尝试以下命令

gph -C x86 -debug -c -all

如果一切顺利,并且我们对在实际手机上运行它感到满意,我们可以构建一个软件包来安装,如下所示

gph -C greenphone -p

这将为我们在 pkg 目录中提供一个文件,文件名类似于 qpe-application_1.0.0-1_arm.qpk。

为了更全面地了解 gph 的功能,我们可以查看其帮助消息

$gph --help
FORMAT: /opt/Qtopia/SDK/scripts/gph <options>

Options:
 -h          display command help
 -q          quiet mode
 -c          clean
 -C <opt>    reconfig <x86> or <greenphone>, default greenphone
 -b          make
 -p          make package
 -i          install package to greenphone
 -r          run application on greenphone
 -all        reconfig, make, make package, install, run
 -debug      force configure for debug build, override default
 -release    force configure for release build, override default

 -options "<opts>" pass extra options to build system
          eg. /opt/Qtopia/SDK/scripts/gph -C x86 -all -options
"CONFIG+=debug"

 -net        bring up network to greenphone
 -console    console on greenphone
 -qpk <file> install qpk to SDK http server for installation
 -rescan     Tell Qtopia to rescan for new documents and applications

当应用程序打包用于分发到 Qtopia 设备时,它们驻留在 .qpk 文件中,这些文件是专门制作的 gzip 压缩 tar 文件。除了可执行文件本身之外,还有帮助文件、多语言翻译文件和桌面条目。此桌面条目文件包含描述可执行文件的名称、图标、应用程序类型以及最终 MIME 类型以指示它可以处理的数据类型的元素。

在目标设备上调试

在 Greenphone 本身上调试我们的应用程序非常容易设置。

首先,我们需要配置我们的构建环境以交叉编译 Greenphone 上的 ARM 架构

. /opt/Qtopia/SDK/scripts/devel-greenphone.sh

接下来,我们需要重建我们的 Makefile 和可执行文件,将它们打包并安装到手机上

qtopiamake -debug && make clean && make && gph -p -i -r -debug

此时,我们可以单击桌面上的 arm-linux 调试器图标,在手机上打开示例程序,然后单击“运行”以在远程调试器中执行它。

为开发和部署构建

使用 Greenphone SDK 开发时,可以使用多种应用程序部署方法。

首先,我们可以构建和运行我们的应用程序,以便它们在虚拟机的 ersatz 类似手机的环境中执行,并带有看起来像坐在您桌面上的手机的 JPEG 皮肤。它非常适合处理应用程序的 GUI 部分,并且省去了我们必须编译、刷入设备和远程调试的步骤。

其次,可以为 Greenphone 编译和打包应用程序,然后在设备本身上运行和测试。如前所述,VM 安装时带有一个 gdb 调试器,该调试器可以在虚拟机内部运行并在手机上远程调试应用程序。

最后,我们有“电话反弹”模式,使用手机作为通过 USB 电缆连接到开发机器的标准 GSM/GPRS 调制解调器。我们的应用程序将在本地机器上的模拟器中运行,但将通过您拥有的任何网络链接(例如 USB 连接)在逻辑上连接到真正的手机。

我们不必以零散的方式自定义 Greenphone。代表手机上整个 Greenphone Linux 发行版的 Flash 映像可以使用 mini-SD 闪存读卡器或 USB 电缆进行更新,以重新安装完整的全新 Linux 发行版以及所有应用程序和配置文件。这使得企业更容易使用,在企业使用中,可以设置诸如标准配置选项之类的项目,以启用诸如带有视觉主题的企业品牌、VPN 设置、默认地址簿条目和本地化设置等功能。

Qtopia 应用程序的剖析

Qtopia 开发将使任何 Qt 或 KDE 开发人员都感到宾至如归,因为它与桌面版本的 Qt 非常兼容。有一些细微的差异,我们将在 Greenphone SDK 中 ~/projects/application 中的示例应用程序中看到。

最近的风格,特别是对于 C++ 和 Qt v4.x,是包含一个以我们要声明的类命名的标头。这避免了猜测哪个标头包含类的声明。在以下示例中,我们注释掉了旧方法,并遵循了更易于记忆的方法

// main.cpp
#include "example.h"
// #include <qtopia/qtopiaapplication.h>
#include <QtopiaApplication>

QTOPIA_ADD_APPLICATION("example", Example)
QTOPIA_MAIN

// end of main.cpp

以前称为 main() 的函数在 Qtopia 中已被弃用,取而代之的是两个宏。

在上面的示例中,QTOPIA_ADD_APPLICATION 宏用于创建主应用程序窗口的实例。第一个参数是可执行文件名,第二个参数是应用程序窗口类的基类。

QTOPIA_MAIN 宏扩展为传统的 main() 函数(如果构建传统应用程序)或构建快速启动器插件所需的入口点。

在我们的 example.h 中,我们找到了主窗口的类声明,我们已将其子类化为通用 QWidget

#ifndef EXAMPLE_H
#define EXAMPLE_H
#include "ui_examplebase.h"

class ExampleBase : public QWidget, public Ui_ExampleBase
{
public:
    ExampleBase( QWidget *parent = 0, Qt::WFlags f = 0 );
    virtual ~ExampleBase();
};

class Example : public ExampleBase
{
    Q_OBJECT
public:
    Example( QWidget *parent = 0, Qt::WFlags f = 0 );
    virtual ~Example();

private slots:
    void goodBye();
};

#endif // EXAMPLE_H

此类使用使用 Qt Designer GUI 构建工具创建的表单,因此我们看到一个名为 ui_examplebase.h 的包含文件,它引入了其声明。在 Qt 中,名称以 ui_ 开头的标头通常是由 Designer 生成的。接下来是我们的类的直接祖先,称为 ExampleBase。此基类继承自 QWidget 和由 GUI 构建器定义的类 Ui_ExampleBase。

注意

作为对 Qt 新用户的简要提醒,由 Designer 生成的类没有包含其中所有其他小部件的基小部件。生成类中的代码仅实例化传递到其构造函数中的任何父小部件实例的子小部件。这就是为什么我们看到多重继承与从 Qt Designer 生成的代码派生的类一起使用——它提供了一个可以挂载其他小部件的单个小部件。

Getting Started with the Trolltech Greenphone SDK

图 3. 在 VM 中运行的 Designer

我们的主窗口是 ExampleBase 派生的 Example 类的实例。它使用一种称为信号和槽的技术——Trolltech 使用的一种方法,它允许在定义如何调用函数时具有很大的灵活性。连接的调用方称为 SIGNAL(),被调用方称为 SLOT()。它们使用称为 connect() 的方法连接在一起,该方法允许多对多的连接关系。Qt 使用预处理器添加元数据处理,以有效地优雅地添加到 C++ 动态调用和对象内省——这些元素在其他 OOP 语言中可用。

我们的最终代码示例显示了我们类的实现

#include "example.h"
#include <QPushButton>

ExampleBase::ExampleBase( QWidget *parent, Qt::WFlags f )
    : QWidget( parent, f )
{
    setupUi( this );
}

ExampleBase::~ExampleBase() { }

Example::Example( QWidget *parent, Qt::WFlags f )
    : ExampleBase( parent, f )
{
    connect(quit, SIGNAL(clicked()), this, SLOT(goodBye()));
}

Example::~Example() { }

void Example::goodBye()
{
    close();
}

我们的 ExampleBase 类的构造函数调用 Designer 生成的 setupUi() 方法,以创建表单定义 的子小部件并设置它们的布局和其他属性。如果没有该步骤,它将是一个通用的 QWidget。

我们看到的下一个有趣的事情是 Example 类的构造函数。它调用 connect() 方法将 Qt Designer 生成的 QPushButton 上名为 quit 的 clicked() 信号与我们的 goodBye() 槽连接起来。这允许我们通过单击标记为“退出”的 QPushButton 来退出示例程序。

后续步骤

如果能更详细地探索许多其他 Qtopia 特定功能,例如用于跨进程通信的 QCop IPC 机制、基于 XML 的主题引擎、安全执行环境 (SXE) 以及所有特定于电话的功能,那就太好了,首先。

Qtopia 为移动电话应用程序的嵌入式开发人员提供了许多优势。

除了模拟环境、与桌面应用程序的代码兼容性以及自然直观的应用程序框架之外,我发现 Qtopia 比其他嵌入式环境做得更好——它有助于让编程重新变得有趣。

资源

北美市场 CDMA 和 GSM 之间的入门级比较: www.wisegeek.com/what-is-the-difference-between-gsm-and-cdma.htm

欧洲电信标准协会 (ETSI): www.etsi.org

GSM: en.wikipedia.org/wiki/GSM

Natalie Watson 的“使用 Qt 为嵌入式 Linux 开发”(LJ,2001 年 5 月): www.linuxjournal.com/article/4660

Martin Hansen 的“为您的嵌入式设备选择 GUI 库”(LJ,2007 年 1 月): www.linuxjournal.com/article/9403

短消息服务: en.wikipedia.org/wiki/Short_message_service

多媒体消息服务: en.wikipedia.org/wiki/Multimedia_Messaging_Service

通用分组无线服务: en.wikipedia.org/wiki/General_Packet_Radio_Service

Robert E. Hartley 婚姻幸福,是四个可爱孩子的父亲。他是澳大利亚/加拿大双重国籍,居住在加拿大渥太华。Robert 的职业生涯始于在 IBM 大型机上编写汇编语言的程序员,之后在 1980 年代中期迷上了 UNIX 和 C。他十年前开始使用 Linux 作为他的主要桌面环境,并且直到最近一直忙于为北美和欧洲的客户提供咨询和培训,作为其北美培训合作伙伴 ICS (www.ics.com) 的 Trolltech 认证 Qt 培训师。

加载 Disqus 评论