写点什么

相比移动领域,Android 能否也为物联网打开一片新天地

  • 2017-01-21
  • 本文字数:4675 字

    阅读完需:约 15 分钟

我与 Android Things 的 24 小时

我正在参与一个基于 Android 的物联网商用项目,它运行在 Raspberry Pi 3 上。最近发生了一件很有意思的事情,Google 发布了 Android Things 的第一个预览版,他们的 SDK 主要针对 3 个开发板(Single Board Computers),Pi 3、Intel 的 Edison 和 NXP Pico。在 Pi 和 Android 之间无法建立端口连接,我们只能忍受自制固件的各种问题,这种痛苦真的是无以言表。其中一个最大的问题是它们不支持触摸屏,甚至连 Element 14 官方出售的版本也不行。我知道 Android 正在向 Pi 靠拢,而之前 Google 向 AOSP 项目提交的一个声明更是让每个人为之动容。2016 年 12 月 12 号,Google 发布了“Android Things”,外加一个可下载的 SDK。于是我开始着手研究,并在门上挂上“勿扰”的牌子……

关于 Android Things 的疑问

在经历了大量 Android 工作和一些 Pi 项目之后(包括现在的这个项目),对于 Android 和 Pi,我不禁有很多疑问。后面我会逐个说明,不过第一个最大的疑问现在已经得到了回答——Android Studio 完全支持 Pi,Pi 正式成为一个支持 ADB 连接的设备。是的!Android Studio 那些超级好用的强大特性最终支持了真实的物联网硬件,我们可以使用布局预览、调试系统、源代码检查器、自动化测试等等。我为此感到很激动。直到现在,我的很多 Pi 板载程序都是使用 Python 来开发,使用运行在 Pi 上面的编辑器(MC)来进行 SSH 连接。这种方式是可行的,而且毋庸置疑,Pi 和 Python 大神们会提出更好的方式,不过这仍然会让人感觉回到了 80 年代的软件开发时代。我的项目需要为控制 Pi 的手持设备编写 Android 程序,如果使用之前的方式等于往伤口上洒盐,而我后来使用 Android Studio 来开发“真正”的 Android 程序,然后使用 SSH 来完全其它工作,一直到现在。

所有的例子都是有关上述的 3 个开发板,Pi 3 是其中一个。通过 Build.DEVICE 常量可以在运行时决定是哪一种设备,所以你会看到很多类似这样的代码:

复制代码
public static String getGPIOForButton() {
switch (Build.DEVICE) {
case DEVICE_EDISON_ARDUINO:
return "IO12";
case DEVICE_EDISON:
return "GP44";
case DEVICE_RPI3:
return "BCM21";
case DEVICE_NXP:
return "GPIO4_IO20";
default:
throw new IllegalStateException(“Unknown Build.DEVICE “ + Build.DEVICE);
}
}

这里对 GPIO 的处理很有意思,因为我只对 Pi 比较熟悉,所以我只能假设其它开发板也是以这种方式工作的。可以在这些地方定义输入和输出,并作为到外部世界的主要接口。Pi 所使用的 Linux 发行版完全支持 Python 的读写操作,但对于 Android 来说,你必须使用 NDK 来编写 C++ 驱动,然后通过 JNI 与 Java 进行交互。这样做不仅增加了难度,还让构建过程变得更加复杂。Pi 设计了两个针脚的 I2C 接口,分别是时钟和数据,需要额外的工作来处理它们。I2C 是一个强大的可寻址总线系统,它可以把多个针脚的数据串行化到一个针脚上面。让我们感到惊喜的是,我们现在可以直接在 Android Things 里完成这些工作。你只需要调用 read() 或 write() 方法来访问 GPIO 针脚,而 I2C 的操作也很简单:

复制代码
public class HomeActivity extends Activity {
// I2C Device Name
private static final String I2C_DEVICE_NAME = ...;
// I2C Slave Address
private static final int I2C_ADDRESS = ...;
private I2cDevice mDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the I2C device
try {
PeripheralManagerService manager = new PeripheralManagerService();
mDevice = manager.openI2cDevice(I2C_DEVICE_NAME, I2C_ADDRESS)
} catch (IOException e) {
Log.w(TAG, "Unable to access I2C device", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mDevice != null) {
try {
mDevice.close();
mDevice = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close I2C device", e);
}
}
}
}

Android Things 是基于哪个 Android 版本?

应该是 Android 7.0,我们因此可以使用完整的 Material Design UI、优化工具、安全增强以及之前版本的所有特性,真是太棒了!那么问题来了:未来的平台更新将以什么方式放出?我们需要单独对它们进行管理吗?不要忘了,这些设备不会一直在线,我们也无法奢望总是有移动网络或 WiFi 可用,哪怕是不稳定的无线网络。

我所担心的另一个问题是,从名字上看,Android Things 只是 Android 的一个衍生产物,它的诞生只是为了振奋 Arduino 市场,而并非为了做出一个强大的操作系统。不过它所给出的示例立马打消了这个疑虑,示例里有些地方甚至使用SVG 作为resource(这是Android 最近才有的),而不是使用传统的位图,虽然使用传统的位图也很方便。

既然Android Things 是基于Android 的,那么Android 的一些问题也会不可避免地出现在Android Things 上,比如权限问题。Android Things 是为了固定的硬件设备而设计的,一旦构建完成,用户一般不会在上面安装应用,所以用户不会被询问权限问题,因为设备上可能连UI 都没有!所以,在应用被安装到设备上时,它会被授予所有的权限。一般情况下,这些设备都是单应用设备,在设备启动时,只有一个应用会在上面运行。

Brillo 发生了什么?

Brillo 是前 Google 物联网操作系统的代号,看起来应该是 Android Things 之前的代号。事实上,你还是能够看到很多地方在使用 Brillo 这个名字,特别是 GitHub 上 Android Things 示例代码里的源代码文件夹名称。不过这样的情况会越来越少,因为一切正在向新的王者看齐!

UI 指南?

Google 发行了大量关于 Android 智能手机和平台应用的指南,比如如何在屏幕上布局按钮等等。当然,如果能够遵循这些最佳实践是再好不过了,不过现在我们再也不能像以前那样。默认情况下,屏幕上什么也没有,应用开发者需要自己管理所有的组件。包括顶部的状态栏、底层的导航栏以及其它所有的组件。多年来,Google 告诉 Android 应用开发者不要自己去渲染一个返回按钮,因为平台会为我们提供一个这样的按钮,不过现在连这个按钮也没有了,因为 Android Things 有可能连 UI 都没有

关于 Google 将会提供的服务支持,我们将作何期待?

我们可以有很多期待,但不包括所有事情。Android Things 的首个预览版不支持蓝牙,也不支持 NFC,而对于物联网来说,蓝牙和 NFC 是非常重要的。而开发板就支持这些功能,所以我认为在不久的将来 Android Things 也会支持它们。因为没有通知栏,所以也不会有通知。地图也不会有。没有默认的软键盘,需要自己安装一个。因为没有应用商店,所以必须通过 ADB 安装应用,还要做很多其它操作。

在使用 Android Things 进行开发时,我尝试着把为 Pi 开发的 APK 安装到普通的设备上,但没有成功。有个错误被抛了出来:“com.google.android.things”库不存在,说明为 Android Things 设备开发的应用无法安装到其它设备上。这个看起来是合理的,因为只有 Android Things 设备需要这些东西,不过这也会有点局限,因为不仅仅智能手机或平台没有这些库,其它的模拟器也没有。也就是说,你只能在 Android Things 物理设备上运行和测试 Android Things 应用……直到 Google 在它的物联网开发者社区上回答了我所提出的疑问,并提供了一个变通方案。

关于Android Things 生态系统的演化,我们将做何期待?

我期待能够看到更多的基于传统Linux 服务器的应用被移植到Android Things 平台上,虽然这些应用对于智能手机和平板来说毫无意义。例如,Web 服务器。现在已经有一些这样的服务器,不过还没有像Apache 或Nginx 这样的重型服务器。物联网设备可能不会有本地的UI,不过可以通过浏览器来管理它们,这样做是可行的,所以需要一种方式来展现Web 面板。对于那些著名的通信应用来说,它们需要麦克风和扬声器,从理论上说,可以支持任何一款视频通话应用,比如Due、Skype、Facebook 等等。事态将会发展到何种程度都只是我们的猜测。是否会出现应用商店?是否会出现广告?我们能够避免被黑客控制?从消费者的角度来看,物联网设备就是一些具有触摸屏的联网设备,而且每个人都习惯了智能手机的工作方式。

我期待能够看到硬件的飞速发展,特别是开发板设备,而且能够处在一个较低的成本水平。Raspberry Pi Zero 只要5 美元,这个价格低得让人不可思议,不过它那可怜的CPU 和内存甚至都无法保证能够运行Android Things。它们什么时候才能运行Android Things?很显然,很多开发板产商把目标瞄准了Android Things,而且随着规模化生产,一些外围设备,比如触摸屏,很可能只需要2 美元左右。

不过,我不认为我们会如飞一般跳跃。如果我们把Android Things 看成一个无所不包的物联网操作系统,那么知道一些Android 架构方面的知识有助于我们了解这个系统。它仍然使用Java 语言开发,Java 因为它的垃圾回收停顿时间饱受诟病。不过这只是其中的一个方面。一个真正的实时操作系统对时效性具有非常严格的要求,它不能是一个关键性任务系统。想想那些医疗应用、安全监视器、工业控制器等。从理论上说,如果有必要,Android 系统上的Activity 或服务随时会被停掉。对于手机来说,用户可以重启应用,清除其它应用,或者重启设备。拥有一个心跳监测器是很重要的。如果前台的Activity 或服务正在监听一个GPIO 针脚,而信号得不到及时的处理,就会发生错误。Android 需要做一些很基础的修改来支持心跳监测,不过到目前为止还没有听说有这方面的计划。

过去的24 小时

那么,让我们回到我的项目上来。我想我可以把之前所做的工作尽可能地移植过来,如果不可避免地碰到一些问题,我可以到G+ 开发社区上寻求帮助。不过除了无法在非Android Things 设备上运行应用这个问题以外,还没有碰到其它问题。目前一切运行良好!这个项目还用了一些奇怪的东西,比如自定义字体和一些精准的计时器,这些东西在Android Studio 里都得到了完美的支持。我这次给Google 打满分。之后我会做一些实实在在的原型,而不只是视频或截图。

蓝图

物联网操作系统目前看起来非常的碎片化。这个领域目前还没有出现市场领导者,虽然我们经常听到一些天花乱坠的大肆宣传,但这些还为时过早。Google 能否在物联网领域也能做得像他们在移动领域所做的那样?要知道,他们已经占据了90% 的移动市场。我相信他们会的。而如果这个成为现实,那么Android Things 的出现就是一个起点。

让我们想想开放软件和私有软件之间的战争,比如Apple 和Google。Apple 从来没有完整开放过他们的软件,而Google 的开源软件已经为很多人带来了好处。现在这个问题又出现了,要让Apple 开发出一个免费的物联网系统,就好比让它发布一款免费的iPhone 一样难。

物联网操作系统的游戏已经开始了,而竞争对手们甚至都还没有做好准备……

Android Things 的开发者预览版现在已开放下载。

本文已获得原作者翻译授权,查看英文原文: Will Android do for the IoT what it did for mobile?


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-01-21 18:002700
用户头像

发布了 322 篇内容, 共 141.2 次阅读, 收获喜欢 146 次。

关注

评论

发布
暂无评论
发现更多内容

微服务通信设计模式

俞凡

架构 微服务

毕业总结

Geek_1d37ea

架构训练营

LeetCode 每日一题 No.382 链表随机节点

DawnMagnet

c++ rust LeetCode 力扣

模块九作业 - 设计电商秒杀系统

渐行渐远

架构实战营

电商秒杀系统架构设计

stars

架构训练营

毕业设计项目-电商秒杀系统

小朱

架构实战营

Log4j 爆发“核弹级”漏洞、工信部力推开源软件发展、“龙腾计划”启动|开源月报 Vol. 02

腾源会

开源

更快的Maven构建工具mvnd和Gradle哪个更快?

王磊

模块五作业

whoami

「架构实战营」

Apache 首位华人董事吴晟:开源里的“偷懒”学

腾源会

开源

云原生-模块三-作业

hunk

毕业设计

Geek_1d37ea

架构实战营

腾讯开源企业级设计体系 TDesign

腾源会

040022-week9-design

InfoQ_70156470130f

架构实战营 - 毕业设计

唐敏

「架构实战营」

陈梓立tison:投身开源,需要持之以恒的热爱与贡献

腾源会

开源

2022 年十大 AI 开源工具和框架

腾源会

开源

无服务器应用DevOps最新实践(内附完整演讲+视频)

亚马逊云科技 (Amazon Web Services)

计算

4种高速安全混合云解决方案,助力您的云迁移之旅!

亚马逊云科技 (Amazon Web Services)

计算

Linux之ln命令

入门小站

Linux

在线条码生成器

入门小站

工具

彻底理解对象内存分配及Minor GC和Full GC全过程

JavaEdge

1月月更

聊聊 Kafka:如何避免消费组的 Rebalance

老周聊架构

kafka

云原生课程总结

dll

王者荣耀商城异地多活架构设计

drizzle

「架构实战营」

040022-week3-algorithm

InfoQ_70156470130f

毕业设计项目

忘记喝水的猫

架构训练营

进击与危机同在,对抗与成长共存:2021年开源圈大事件盘点

腾源会

开源

ReactNative进阶(二十二):点击事件.bind(this)引发的思考

No Silver Bullet

1月月更 ReactNative

AI遇上强迫症,大脑与情绪的羁绊有解了

脑极体

好家伙!你这网络基础可以啊!2️⃣

XiaoLin_Java

1月日更

相比移动领域,Android能否也为物联网打开一片新天地_移动_Carl Whalley_InfoQ精选文章