写点什么

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

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

关注

评论

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

设计你的安全架构OKR

I

安全架构师 安全架构 企业安全 安全治理

Redis 持久化机制

知识浅谈

redis 面试题

(1)长安链学习笔记-启动长安链

代理和反向代理

沃德

程序员 7月月更

安全保护能力是什么意思?等保不同级别保护能力分别是怎样?

行云管家

等保 等级保护 安全保护能力

gRPC三种Java客户端性能测试实践

FunTester

「小程序容器技术」,是噱头还是新风口?

ToB行业头条

室内LED显示屏应该怎么选择?这5点注意事项必须考虑在内

Dylan

LED显示屏 户内led显示屏

体验Python剪辑视频以及相关问题解决,一劳永逸!

迷彩

Python Moviepy视频剪辑处理 7月月更

深度解读 RocketMQ 存储机制

阿里巴巴中间件

阿里云 RocketMQ 云原生 中间件 消息队列

MetaForce原力元宇宙开发搭建丨佛萨奇2.0系统开发

开发微hkkf5566

OAI 5G NR+USRP B210安装搭建

柒号华仔

5G 7月月更

让 Rust 库更优美的几个建议!你学会了吗?

非凸科技

rust API

Python 入门指南之深入 Python 流程控制

海拥(haiyong.site)

7月月更

浅谈网络安全之文件上传

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

面试题:AOF重写机制,redis面试必问!!!

知识浅谈

redis 底层原理

前置机是什么意思?主要作用是什么?与堡垒机有什么区别?

行云管家

堡垒机 前置机

NFTScan 开发者平台推出多链 NFT 数据 Pro API 服务

NFT Research

NFT 研发团队

COSCon'22 社区召集令来啦!Open the World,邀请所有社区一起拥抱开源,打开新世界~

开源社

开源

同构+跨端,懂得小程序+kbone+finclip就够了!

Speedoooo

小程序 跨端开发 小程序容器 kbone web同构

spark调优(二):UDF减少JOIN和判断

怀瑾握瑜的嘉与嘉

spark 7月月更

【Unity】升级版·Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件

萧然🐳

游戏开发 Unity 7月月更 Excel工具

低代码平台中的数据连接方式(上)

Baidu AICLOUD

前端 低代码 数据格式 数据通信 爱速搭

让我们,从头到尾,通透网络I/O模型

C++后台开发

网络编程 IO多路复用 C++后台开发 网络io模型 C++开发

BP神经网络(算法整体思路及原理+手写公式推导)

秃头小苏

7月月更

python变量:引用和可变性

AIWeker

Python python小知识 7月月更

Spring Cloud源码分析之Eureka篇第三章:EnableDiscoveryClient与EnableEurekaClient的区别(Edgware版本)

程序员欣宸

Java SpringCloud 7月月更

TDengine 社区问题双周精选 | 第二期

TDengine

数据库 tdengine 时序数据库

Efficient ETL Testing

Bright

数据开发 ETL 大数据开发 EasySQL

案例推荐丨安擎携手伙伴,保障“智慧法院”更加高效

科技热闻

存币生息理财dapp系统开发案例演示

开发微hkkf5566

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