写点什么

相比移动领域,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:003044
用户头像

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

关注

评论

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

架构师训练营 1 期 - 第四周作业(vaik)

行之

极客大学架构师训练营

架构师训练营 1 期 - 第四周总结(vaik)

行之

极客大学架构师训练营

典型互联网公司使用的技术

happy

数字人民币真的来了 六年历程全回顾

CECBC

数字货币 DCEP

浅析 Java 内存模型 一

朱华

Java JMM

架構師訓練營 week4 總結

ilake

架構師訓練營 week4 作業

ilake

架构师训练营 - 第四周总结

一个节点

极客大学架构师训练营

CPU 执行程序的秘密,藏在了这 15 张图里

小林coding

操作系统 计算机基础 计算机 编译器、程序语言、CPU 指令

第三周课后练习

大大猫

极客大学架构师训练营

甲方日常 27

句子

生活 工作 随笔杂谈 日常

详解「区块链」溯源

netkiller

区块链 防伪 超级账本 标签 区块链产品溯源

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?

knight

Redis-技术专题-哨兵配置和原理

码界西柚

第 4 周 系统架构总结

bearlu

系统架构

架构师训练营 - 第四周作业

一个节点

极客大学架构师训练营

go-zero流数据处理利器

万俊峰Kevin

stream functional Go 语言

第二周课后练习

大大猫

极客大学架构师训练营

Spring学习笔记(一)手写一个简单的Spring

无语

Spring Framework

第9周作业

Vincent

极客时间 极客大学

架构师训练营第 1 期 -week4

习习

spring-boot-route(十二)整合redis做为缓存

Java旅途

Java redis Spring Boot

区块链思维是赋能未来经济的关键思维

CECBC

区块链 经济 技术创新

第三周架构师训练营作业

Geek_4c1353

极客大学架构师训练营

spring-boot-route(十一)数据库配置信息加密

Java旅途

Java Spring Boot

浅析 Java 内存模型 三

朱华

Java volatile JMM

第9周总结

Vincent

极客时间 极客大学

第四周作业

Geek_4c1353

极客大学架构师训练营

第4周 作业一

bearlu

架构师训练营第4周作业

悠哉

LeetCode题解:144. 二叉树的前序遍历,使用栈,JavaScript,详细注释

Lee Chen

大前端 LeetCode

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