围绕 Nokia N800 电话/Internet tablet/Webcam 核心并详细探查基于 scratchbox 的构建环境。
在移动和嵌入式应用程序方面,Linux 受到当之无愧的欢迎,这是因为它能够根据小型设备有效运行所需的资源开销按比例进行缩减。Nokia N800 利用了这项功效,并提供了大量多用途的功能供开发人员利用。但是在本期和下两期 Linux 的魅力 中,目的不是讨论功能,而是通过可运行示例(使用照相机功能来创建 Webcam)的方式,展示如何开始构建应用程序。
Nokia N800 是相当成熟的产品。它的前身 Nokia 770 就远远超前于早期基于 Linux 的客户端设备,N800 则明确针对客户端需求开发。开发时的艰难早已成为过去,现在,对该设备使用最普通配置的情况下,就可以添加或删除 stylus(最近推出的 Nokia N810 将在将来的文章中讨论)。
N800 并非提供单个 “RS-MMC” 插槽,而是提供两个针对常规 SD 卡的插槽。架子是内置的。最为引人注目的是,可用内存、闪存和处理器速度都增加了。附带的东西甚至包含一个安装好的屏幕保护膜(有一件关于屏幕保护膜的经历很令人惊奇 — 我曾经在手机的屏幕保护膜下面逮到一只猫 — 所以我非常推崇屏幕保护膜)。阅读下面关于 N800 的一些更重要的 技术规格和物理参数。
大多数功能都得到了扩展,尽管并非尽善尽美;例如,WiFi 代码尚不支持信任的 root 证书权威认证,尽管存在一个针对它的空白下拉菜单。这在将来的版本中可能会得到更新。
我发现 770 最令人印象深刻的事情之一是其基于 scratchbox 的构建环境。让我们研究一下构建环境实际如何工作。
N800 有一个内置的照像机。通过弹出将其打开时,N800 就会启动一个视频友好的聊天程序。这很简洁,但不是我想要的。我想要一个简单的老式 Webcam。N800 似乎是 Webcam 的理想平台:它是小型的、便携式、联网的平台,并且(不要忘了)它有一架照相机。因此让我们讨论实质问题并开始编写代码。
设置工作
我使用一个终端程序设置系统并获得 root 访问权限。您实际上不必如此;这是因为我喜欢随意探索。我从 maemo Wiki 的应用程序编目页(请参阅 参考资料 中的链接)下载了一个终端程序。该程序实际上是针对 770 设计的,但是它不依赖于内核修改之类的细节,因此用起来很不错。
获得 root 访问权限略有难度:必须将设备设成 “R&D” 模式,这是使用 flasher 实用程序实现的,可以从 maemo 站点下载该程序。Flasher 实用程序需要 x86 Linux 主机,而这也是运行 scratchbox 的首选环境。如果没有 x86 Linux box,可以以牺牲一顿早餐为代价获得一台足够强大的 x86 机器(而 Linux 可免费下载)。我的主机平台是 Kubuntu,但是似乎没有关系;我也使用 SuSE 实现过,我认为 maemo 网站上的人喜欢简单的 Debian。
|
Maemo 安装说明就足够了。必须先安装 scratchbox。使用提供的安装程序即可,尽管它的默认行为(即删除已经下载的所有文件以再次下载)不可理喻(也可以手动安装,但是我认为不必如此)。
安装 Scratchbox 需要 root 访问权限,但是安装完之后使用 scratchbox 时不必拥有 root 访问权限。如果您使用提供的 maemo scratchbox 安装程序,则只需作为 root 用户使用您的用户名运行 /scratchbox/sbin/sbox_ctl start 和 /scratchbox/sbin/sbox_adduser
然后再也不需要 root 访问权限。实际上,maemo SDK 安装程序(我使用的是 maemo-sdk-install_3.1.sh;新近的 3.2 更新是从 SDK 内部更新的)将不会作为 root 用户运行,只需拥有 scratchbox 访问的常规用户即可。系统管理员的负担减轻了。
实际上,我发现拥有在不必要的情况下不需要 root 权限的安装程序非常方便。在运行 maemo 安装程序之前,不必实际设置目标;请忽略警告您先运行 sb-menu 的消息(如果转移注意力,可能会在安装程序继续运行时错过它们)。特别感谢 Freenode 的 #maemo 频道的朋友,他们让我确信该错误消息是无害的。
如果您以前从未使用过 scratchbox,则需要简要的介绍。历史上,交叉编译带来了许多挑战。最著名的是难以在目标环境中运行测试程序以及类似程序,而且如果它与主机环境不同,配置起来相当麻烦。
Scratchbox 以尽可能直接的方式解决了这个问题:在使用 CPU 仿真的本地环境中运行本地二进制文件。假设我的主机 CPU 速度大约是目标 CPU 速度的 8 倍,那么这是相当好的解决方案;节省开发时间能带来令人难以置信的好处。这是典型的技术进步例子:可以简单地忽略曾经难以克服的障碍。
Scratchbox 允许您拥有多个构建环境,您可以在其中搭配使用目标和主机二进制文件。如果在 x86 处理器上使用 ARM scratchbox,ARM 二进制文件就能神奇地进行工作,而 “cc” 创建 ARM 二进制文件。这相当酷。Nokia 可能通过该设备和其他类似的设备为其开发提供基金。
顺便提一下,如果过了一会儿您只收到晦涩的消息 “Scratchbox is not properly set up!”,那么可能需要启动它。请作为 root 用户,运行 /scratchbox/sbin/sbox_ctl start,应该就能工作。
如果在尝试停止系统之前,没有运行 sbox_ctl stop,则系统可能不会利落地关闭。如果您像我一样出于安装 scratchbox 和尝试安装 SDK 之类的不相干的原因重新引导系统,并且从未将系统设置为引导时运行 scratchbox,那么这可能是您意想不到的。
另一个常见的意外情况是 apt-get 在 scratchbox 中运行失败,不能解析 repository.maemo.org。要改正这个问题,请编辑 /scratchbox/etc/nsswitch.conf 并确保 “hosts:” 行中为 “dns”,而不是 “mdns”(注意这不同于 scratchbox 环境中的 nsswitch.conf)。
熟悉的情形:实现 “hello, world!” 程序
第一步总是实现 “hello, world!” 程序。这不难,但是开始之前,必须选择一个目标。目标是一组相对于特定设备(N800)的设置和工具。对于典型的 scratchbox 环境,必须创建一个目标。Maemo 设置实际上创建了一对目标,顺理成章地命名为 SDK_X86 和 SDK_ARMEL。可以使用 sb-conf 命令在两者之间切换;例如,sb-conf select SDK_ARMEL 将选择 ARM 目标。
现在,分析代码:
清单 1. hello, world!
#include |
将样例代码清单保存倒一个文件。下面是复杂的部分,交叉编译:
清单 2. 交叉编译
[sbox-SDK_ARMEL: ~] > cc -o hello hello.c [sbox-SDK_ARMEL: ~] > file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped [sbox-SDK_ARMEL: ~] > ./hello hello, world! |
就这么简单。您可能想知道如何将该文件放到 tablet 上?如果 tablet 上安装了 shell,并且两个插槽上都安装了 SD 卡,那么很简单:将 tablet 插入 Linux box,在出现的驱动器上装载该文件系统,并复制该文件。卸载、拔除然后观察,驱动器就能神奇地重新装载到 tablet 上。当然,文件在该处的某些位置没有执行权限,但是可以将其复制到卡以外,然后使用 chmod +x。
这对一个文件可行,假设您已经安装了一个终端程序。这种情况下,由于该程序实际上不必在 shell 中运行,所以这样做比较合理。
然而,在实际的应用程序中,您不希望这么做,图形应用程序尤其如此。对于这种情况,您将希望创建合适的软件包文件(N800 使用 Debian 软件包)并让用户以正确的方式安装。那么,当它正常工作起来而不是采用 quick hack 时,就不会像目前这样。
创建 maemo 软件包
developerWorks 拥有关于创建 Debian 软件包的最好文档(请参阅 参考资料)。当然,针对 maemo 有更多,因为将程序安装到 /usr/bin 是不够的;还需要一种方式使 UI 识别软件包并运行它。本文中到 “hello, world!” 样例应用程序的链接不会正常工作,但是没关系;只需在 scratchbox 环境中执行 apt-get source hello-world-app。该软件包布置所有内容,包括图标和启动程序配置。
构建它相当简单:运行 autogen.sh 以生成配置脚本,然后运行 dpkg-buildpackage -rfakeroot。如果因为 $PATH 中没有 dpkg-buildpackage 而失败,请运行 sb-menu,并确保安装了 debian devkit。不要 安装 debian-sarge devkit;它会使 Debian 工具认为您在构建 arm 架构而不是 armel,这样就不能尽善尽美了。而且,N800 会拒绝安装您的软件包,因为它们针对不兼容的架构。因此,不要这样做。
Maemo 应用程序是使用 Gtk widget 构建的。还有一点不可思议的地方是 “osso_...” 系列函数,它们是常规 Gnome dbus 函数的包装器。如果不使用这些函数,您的应用程序可能不能在 maemo 环境中正常工作。“hello world” 样例是了解该环境的好起点。观察它,构建软件包,并确保适应这种方式。
了解这些内容之后,让我们构建一些应用程序。虽然 Hello World 应用程序是非常完善的示例,但是它的内容过多。一般的应用程序不需要在控制面板的状态栏上显示,如 DBUS 服务和常规应用程序以及主页上的 applet 那样。实际上,通常显示一个或两个程序就足够了。此外,执行以上所有工作的需要解答了为何将应用程序实现为所有不同组件使用的共享库。这是共享代码并使各个示例着重处理其实现所特有任务的最简单途径。它适合教学和作为示例;不一定是应用程序的最佳模板。但我们的目标是什么应用程序呢?
N800 有一项十分简洁的功能:一架小型的弹出式照相机。默认情况下,如果通过弹出将其打开,它会立即启动一个小型的交互式聊天程序。很简洁,但是不太灵活。拥有一个可以抓拍单张图片并且自动将其上载到远程站点的应用程序可能会更好。这利用了 N800 连接各种网络的便捷,并对要发送哪些帧提供了更多控制。
这实际上是一个相当棘手的过程,因此我不会开发一个完美的 app。而将重点研究使其运行起来的基本要素。方便的是,大部分工作已经以 gstreamer 的方式完成了,gstreamer 是处理媒体流的库。目标是以特定的间隔从照相机提取帧并将其保存到某个位置,另一台机子更好,并且可能还允许用户通过按一个按钮来保存帧。
结束语
在本系列的第 2 部分中,将研究一个程序,它实际完成构建 gstreamer 管道以便从 Web 照相机向屏幕或另一个系统传输图像的核心工作。目标是从照相机获得图像,将其转换成 JPEG 并上载到某个位置。
同时,如果您不熟悉 gstreamer,请继续阅读相关知识。 Gstreamer 环境有很大一组概念需要掌握。另外,请花一些时间安装一个终端程序;推荐使用 osso-xterm。
N800 的技术规格
通常,Nokia N800 是便携式 Internet tablet,允许通过以下技术访问 Web:
- 高分辨率宽屏幕显示
- Opera 8 浏览器
- Adobe Flash 9 浏览器插件
- Internet 通信
- Skype 支持
- 带有集成 Webcam 的 Internet 电话
- 即时消息
- 多协议电子邮件客户端
- 全屏幕拇指键盘
- 立体声扬声器
- Media player
- UPnP 架构
- Real Rhapsody
- 可扩展的大容量内存
- 800 x 480-象素、65,536-色 触摸屏
标准的银色/黑色款规格:
- 体积:137cc
- 重量:206g
- 长:75mm
- 宽:144mm
它的内存是 DDR RAM 128MB;还有 Flash 256MB 和 128 MiniSD 扩展。两个内置内存卡插槽兼容 SD、MicroSD、MiniSD、MMC 和 RS-MMC。最多支持 8GB 内存卡。超过 2GB 的 SD 卡必须是 SDHC 兼容的。
BP-5L 电池可使浏览时间长达 3.5 小时(待机 13 天)。
内在设置支持以下文件格式:
- 音频:AAC、AMR、AWB、M4A、MP2、MP3、RA(RealAudio)、WAV、WMA
- 图像:BMP、GIF、ICO、JPEG、PNG、TIFF、SVG-tiny
- 视频:3GP、AVI、H.263、MPEG-1、MPEG-4、RV(Real Video)
- Internet 音频播放清单:M3U、PLS
连接方式:
- WLAN:802.11b/g
- Bluetooth 规格:2.0(针对 Internet 连接和通过电话传输文件)
- Nokia AV connector 3.5mm。支持的模式:拨号网络、文件传输、通用访问、SIM 访问、对象推送模式、人机接口模式和串口模式
- 针对 PC 连接的 USB 2.0 高速设备模式