书名:物联网项目实战:基于Android Things系统
ISBN:978-7-115-53278-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [美]弗朗西斯科·阿佐拉(Francesco Azzola)
译 杨加康
责任编辑 谢晓芳
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright © Packt Publishing 2017. First published in the English language under the title Android Things Projects.
All Rights Reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书介绍如何使用Android Things完成实际的物联网项目,主要内容包括Android Things系统本身及其工作原理,如何使用Android Things SDK开发报警系统,如何构建环境监测系统,如何集成Android Things与物联网云平台,如何创建智能系统,如何构建远程气象站,如何开发间谍眼,如何集成Android和Android Things。通过本书,开发者可以使用Android开发工具开发嵌入式设备,完成智能硬件的开发。
本书适合Android开发人员、Android爱好者、物联网开发人员及希望了解Android Things的专业人士阅读。
Francesco Azzola,电子工程师,在计算机编程和 JEE 架构方面有超过15年的经验。他是Sun认证的企业架构师(Sun Certified Enterprise Architect,SCEA)、Sun认证的Web组件开发人员(Sun Certified Web Component Developer,SCWCD)和Sun认证的Java程序员(Sun Certified Java Programmer,SCJP),也是Android系统和物联网技术的爱好者,喜欢用 Arduino、Raspberry Pi、Android 和其他平台完成物联网项目。
他对物联网和移动应用颇有兴趣。此前,他也在移动开发领域工作了几年。他创建了一个名为Surviving with Android的博客,在那里他分享了Android和物联网项目开发方面的许多文章。
Ali Utku Selen,索尼移动系统工程师,土耳其伊兹密尔市度库兹埃路尔大学(Dokuz Eylul)大学计算机工程系硕士,多年来致力于旗舰Android设备的开发。他从11岁开始编程,从那以后便对软件开发产生了浓厚的兴趣。
Raimon Ràfols Montane,自2004年以来一直致力于移动设备的开发。他在开发UI、构建系统和实现客户端-服务器通信方面有丰富的实战经验。他目前在巴塞罗那的AXA Group Solutions公司担任工程经理,过去曾在伦敦附近的Imagination Technologies公司和阿姆斯特丹的Service2Media公司工作过。在业余时间,他喜欢编程和摄影,并在多个移动开发会议上就Android 性能优化和Android自定义视图发表演讲。
和大部分读者一样,我之前对物联网技术并没有清晰的认识,同时由于外界的炒作,我一直对物联网技术敬而远之,因此我一直不敢去接触和学习它。
当我在第一家公司做一个嵌入式项目的时候,我第一次对物联网技术产生了兴趣。当时我主要负责Android应用部分的开发,涉及的内容很简单,因此我并没有觉得我参与的项目有什么特色。然而,当我第一次看到公司其他同事用我创建的应用程序的一个外壳来控制台灯、电动车、跑步机等设备的时候,我深刻地感受到了物联网技术的魅力。因为之前一直做软件开发,所以我根本想不到这些控制机制是如何实现的,产生浓厚兴趣的同时,我也对物联网技术更加畏惧······
让我再次折服并且希望花时间投入物联网技术的时机是我在大学实验室做的一个关于Android Things的项目。了解这个项目后不久,我对软件部分十分有信心,毕竟我已经非常擅长Android开发,可关于如何调试硬件、如何软硬件结合,我依然一头雾水。当时,对于Android Things,除了熟悉Android这一个名词之外,我对它的其他方面基本上一无所知,我试着找了国内相关资料,发现介绍Android Things的资料也寥寥无几。在不知道它是否有实用价值并且是否值得学习的情况下,当时我在Packt网站上购买了本书的英文版。我并不确定这是不是一本专业性非常强的图书。相比之下,谷歌的Android Things开发者文档当然更加有参考价值,但我能确定的是本书确实能够让你快速对物联网这项非常有前景的技术产生极大的兴趣并且入门,尤其是对于Android开发者来说。
本书的内容非常简单,它旨在帮助读者自己动手实现其中的小功能或者案例,其中不乏一些现实中已经广泛推广的功能,如RBG灯控制、房屋警报装置,也正是这些触手可及的功能可以激发读者学习物联网技术的兴趣。当然,作为新兴技术,Android Things产品的迭代速度极快,其中的一些案例可能还停留在过去的实现方法上,读者可以根据最新的开发文档进行相应的修改。同时,由于书中很多外网的资源不能使用或者在国内有或多或少的限制,读者也需要自行解决网络不通的问题。
最后,希望读者不要畏惧物联网和Android Things。一本好的入门书足以让你信心倍增。
感谢实验室和我一起做实验的王阳、孙虎同学,感谢帮我校对本书的刘江同学,没有他们,我不会顺利地翻译好这本书。感谢董瑞志博士,没有他,我可能也不会接触Android Things 这项技术,是他帮我打开了一扇通往新世界的大门。最后,感谢给了我不少帮助的谢晓芳编辑,也很感谢人民邮电出版社对我的信任!
杨加康
Android Things是由谷歌开发的旨在使用Android技术开发专业物联网项目的全新操作系统。在阅读本书的整个过程中,读者将逐步深入了解Android Things的所有核心内容,并初步感受到由物联网(Internet of Things,IoT)带来的下一次技术革命。你将学会如何搭建涵盖Android Things 所有技术层面的实际物联网项目。
第1章介绍物联网的概念及其相关组件,并解释为什么它对日常生活产生如此巨大的影响。该章还将介绍Android Things的相关概念,并解释如何用Android Things来实现我们的第一个物联网项目。
第2章演示如何在Android Things中使用双状态传感器(或二进制设备),介绍如何创建一个检测物体运动并向用户的智能手机发送通知的报警系统。
第3章介绍如何将传感器连接到Android Things以及如何使用I2C总线读取数据并使用RGB LED将数据可视化。
第4章介绍如何在物联网云架构中使用Android Things,讲述如何将数据实时地从传感器传输到物联网云平台。
第5章演示如何使用简单的集成模式和HTTP将Android Things与Arduino集成。
第6章介绍如何在机器到机器(Machine to Machine,M2M)架构中使用Android Things。在该章中,我们会搭建一个监控温度、湿度、压强和亮度的远程气象站,同时使用MQTT作为发送数据的协议。
第7章介绍如何使用脉冲宽度调制(Pulse Width Modulation,PWM)开发控制伺服电动机的Android Things应用程序,以及如何在Android Things中使用摄像机。
第8章介绍如何开发与Android Things交互的配套Android应用。
要开发本书中的示例项目,读者需要提前安装Windows操作系统或Mac OS X。此外,为了完整地执行开发、编译和安装Android Things应用程序的流程,也需要按照书中的步骤安装Android Studio等相关开发环境。
本书主要面向希望深入了解Android Things系统的Android 系统爱好者、物联网工程师、Android开发人员。本书重点介绍如何使用Android Things 实现物联网项目,讨论Android Things的常用API在物联网项目中的使用,以及传感器、电阻、电容和物联网云平台等概念。
本书采用许多样式来区分不同类型的信息。下面是这些样式的一些示例。
代码块的样式如下。
adb shell am startservice
-n com.google.wifisetup/.WifiSetupService
-a WifiSetupService.Connect
-e ssid <Your_WIFI_SSID>
-e passphrase <WIFI_password>
命令行的输入或输出如下。
sudo dd bs=1m if=path_of_your_image.img of=/dev/rdiskn
表示警告或重要说明。
表示提示和技巧。
欢迎来自各位读者的反馈。读者的反馈对我们相当重要,这些反馈可以帮助我们出版真正对读者有帮助的图书。如果要向我们发送一般反馈,请发送电子邮件至feedback@packtpub.com,并在电子邮件标题中标明书名。如果您有扎实的专业背景,并且有兴趣撰写图书,可参阅packtpub网站上的作者指南。
虽然我们已经尽力确保内容的准确性,但有时确实会存在疏漏。如果您在我们的书中发现了错误(可能是文字或代码中的错误),并且向我们报告,我们将不胜感激。这样做可以使其他读者少走弯路,并帮助我们进一步完善本书的后续版本。如果您发现任何勘误,请访问packtpub网站,选择您购买的图书,单击Errata Submission Form链接,并录入详细信息。一旦您的勘误得到验证,将接受您的提交,把勘误表上传到我们的网站或添加到本书现有的勘误表中。要查看先前提交的勘误表,可以访问packtpub网站,在搜索框中输入书名,所需信息将显示在Errata部分下。
互联网上正版图书的盗版一直是媒体所关注的问题,Packt非常重视版权的保护。如果您在互联网上发现了盗版的Packt图书,请立即向我们提供地址或网站名称,我们将尽快采取相应措施。您可以通过copyright@packtpub.com与我们联系,必要时可提供盗版图书的链接。这里,感谢广大读者帮助我们保护作者的版权。
如果您对本书的任何方面有疑问,可以通过questions@packtpub.com与我们取得联系。
本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。
本书配套资源包括书中示例的源代码。
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意,为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”按钮,输入勘误信息,单击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。
如果您所在学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
不久之前,谷歌公司发布了一款名为Android Things的物联网(Internet of Things,IoT)操作系统。作为谷歌公司的第一代IoT操作系统,它受到了来自全世界开发者们的关注。本书旨在介绍如何使用此操作系统、兼容的开发板及多种外围设备(如传感器、LED、伺服设备等)开发一个个实际的IoT项目。
本章将首先介绍Android Things是什么,包括它本身的特点及它与Android系统的主要区别。我们将会发现,开发一个Android Things项目原来可以基于我们已经掌握的Android知识。在此之后,我们会学习如何在不同的开发板(如Raspberry Pi 3和Intel Edison)上安装Android Things系统。在配置开发环境过程中,我们也将会在一定程度上熟悉所使用的开发板。一旦对开发板有了一定了解,我们便可以开始创建第一个Android Things项目了。首先,我们将学习如何使用一些像LED和按钮(或开关)这样简单的外围设备。其次,我们将会了解如何将一个完整的Android的项目重构成一个Android Things项目。最后,我们将会学习如何在实际的IoT项目中使用Android Things提供的各种核心 API。
本章内容如下:
IoT是目前极有发展前景的技术方向之一。据专家称,IoT可能是未来十年里极具突破性的技术之一。它将对我们的生活产生巨大影响,并可能改变我们的生活方式和习惯。IoT在未来将是一种更普及的技术,其影响将横跨多个领域或行业:
所有这些领域都将受益于IoT。在深入了解IoT项目之前,我们有必要了解IoT的含义。在不同层面下或者根据不同的应用领域,关于IoT的定义也不尽相同。然而,无论如何,应该强调的一点是,IoT不仅仅是和智能手机、平板电脑或个人计算机(Personal Computer,PC)相互连接的网络。我们可以将IoT称作一个生态系统,在这个系统中,物体之间互相连接,同时,它们均连接到互联网。IoT包括可能连接到互联网并交换数据和信息的每个对象。这些对象随时随地连接在一起,并且可以随时随地相互交换数据。
我们对物体连接的概念可能并不陌生,多年以来,它已经得到了持续的发展。随着CPU的功耗越来越低,我们可以想象未来互联网将能承载数以百万计的物体相互通信。
IoT第一次正式受到瞩目是在2005年。国际通信联盟(International Communication Union,ITU)首次提出了IoT的定义(参见ITU官网上的文章“Internet of Things summary”)。
信息和通信技术(Information and Communication Technologies,ICT)领域将迎来另一个新的成员:无论在任何时间,任何地方,我们都可以连接任何东西……这种连接将成倍增加并创建一个全新的动态网络——IoT。
也就是说,IoT是由一个个可以接收和发送数据并且远程控制的智能对象(或物体)组成的网络。
几个不可忽略的要素推动着IoT生态系统的发展,要了解IoT,就要弄清楚它们在其中扮演的角色,这对更好地理解我们将使用Android Things构建的项目也相当有用。
IoT由一个个智能对象组成。它们是能够交换数据并且连接到互联网的设备,可以是用于测量压力、温度等环境变量的简单传感器,也可以是更复杂的一套完整系统。烤箱、咖啡机,甚至洗衣机都可以是智能对象连接到互联网的例子。所有这些智能对象都可以当作IoT中的成员。总之,IoT对象不仅可以是智能化的家用电器,还可以是汽车、建筑物和执行器等。可以在连接时引用这些对象,使用某种唯一标识符与它们交流互动。
在底层,这些设备使用网络层中的相关技术来交换数据。在IoT底层,重要且常用的协议包括:
在应用层中,IoT项目也广泛使用了几种通用协议。其中一些协议派生自特定的环境(如Web),也有一部分特定于IoT。常见的有以下几种:
现在,它们在你眼中可能只是一个空洞的英文名称,但在本书深入探讨如何在Android Things中使用这些协议后,你将豁然开朗。
原型开发板在IoT中扮演着至关重要的角色,有助于开发具有一定量级的连接对象。使用开发板,可以实现多种IoT项目。本书将一一探究如何使用与Android Things兼容的一些开发板构建并测试IoT项目。我们可能已经了解了市场上已经有的几种原型开发板,它们各具特色且功能各异。例如:
在本书的项目中,我们将主要使用Raspberry Pi 3主板和Intel Edison主板,因为目前Android Things官方支持这两款主板。在本书中,我们也将会使用一些其他主板,以了解它们各自的集成方式。
Android Things是谷歌公司为开发IoT项目而开发的一套全新的操作系统。Android Things帮助我们使用较可信的平台并且能使用 Android开发技能完成专业的IoT项目。没错,是Android,你完全可以把Android Things看作Android系统的“修订”版本,可以使用已有的Android知识来实现一个个智能的IoT项目。该操作系统的巨大前景在于Android开发人员可以利用它平滑地进入IoT领域,并可以在几天之内开发、构建完成自己的IoT项目。在深入了解Android Things 系统之前,先了解一下它的基本架构。Android Things系统的层次结构如图1-1所示。
图1-1 Android Things系统的层次结构
Android Things系统的层次结构与Android操作系统略有不同,可以发现Android Things系统整体上更紧凑,主要体现在Android Things的应用程序底层的层数更少,并且其应用层比普通的Android应用程序更接近驱动程序和外围设备。即使Android Things基于Android,Android Things中也有一些Android并不支持的API。下面简单介绍它们的相似之处和不同之处。
可以发现,在Android中广泛使用的内容提供者(content provider)并不在Android Things SDK中。因此,在开发Android Things应用程序时应该格外注意这一点。要了解有关这些不支持的功能(如内容提供者)的更多信息,可以参阅Android Things SDK的官方网站。
此外,与一般的Android应用程序一样,Android Things应用程序可以拥有用户界面(User Interface,UI)。然而,在Android Things中,应用程序也可以没有UI,这完全取决于要开发何种类型的应用程序。用户完全可以像操作Android设备一样与UI交互,并在Android Things应用中响应相应的事件。我们之后也会知道,Android Things中的UI开发方式与Android中的开发方式完全相同。这一点值得关注,因为我们可以重用一些Android知识来轻松快速地开发一套IoT应用程序的UI。
值得关注的是,Android Things完美地支持谷歌服务。几乎所有由谷歌公司实现的云服务都可以应用在Android Things中,但也有少数例外情况。Android Things不支持严格应用在移动手机中的谷歌服务及需要用户输入或身份验证的服务。不要忘了Android Things应用程序的用户界面可有可无。要获得Android Things中提供的谷歌服务的详细列表,请参阅Android Things官网。
权限的管理在Android开发中有非常重要的作用。读者可以假想Android应用程序其实运行在一个黑盒中,它对外部系统中资源的访问权限有限。当应用程序需要访问黑盒外的特定资源时,它必须申请相应的权限。在开发Android应用程序时,可以在Manifest.xml文件中声明所需要的权限。Android Things仍然使用这种方式,并且在安装时就可以授予应用程序申请的所有权限。Android 6(API 23)引入了一种申请权限的新方法,即应用程序不仅可以在安装时(使用Manifest.xml文件)申请权限,而且可以在运行时动态地申请权限,然而,Android Things暂不支持这种方式,因此只能在Manifest文件中申请所有的权限。
最后要注意的是通知(notification)这个概念。Android Things的系统UI并不支持通知状态栏,因此我们无法触发来自Android Things应用的通知。
简单来说,我们应该了解,与UI相关的所有服务或依托UI来完成任务的所有服务都不一定在Android Things中有效。
IoT依赖库是由谷歌公司为Android Things开发的全新类库,主要用来处理与外围设备和驱动程序的通信。Android SDK不包含此库,该库也是Android Things重要的功能来源之一。该库公开了一组Java接口和类(API),可以使用这些Java接口和类来与传感器、执行器等外围设备连接并交换数据。该库封装了内部通信细节,支持多种行业内标准的通信协议,例如:
本书将会讲述如何使用此库连接到各种类型的外围设备。
此外,该库公开了一组API,用于创建和注册名为用户驱动程序(user driver)的新设备驱动程序。这些驱动程序是用于扩展Android Things框架的Android Things应用程序的用户自定义部分。也就是说,该库是自定义库,可使应用程序与本机不支持的其他设备类型进行通信。
本书将一步一步指导你使用Android完成实际的Android Things项目。你也将深入了解全新的Android Things API,并且学习如何使用它们。下一节将介绍如何在 Raspberry Pi 3和Intel Edison上安装Android Things系统。
Android Things是专为IoT而开发的新操作系统。在撰写本书时,Android Things已经可以支持以下4种不同的主板:
不久的将来,Android Things将支持更多的主板。谷歌公司已经宣布它将支持新的NXP Argon i.MX6UL主板。
本书将重点介绍Raspberry Pi 3和Intel Edison两类主板。当然,我们完全可以在其他开发板上开发和测试本书的所有项目。Android Things的强大之处在于它抽象了底层硬件提供的接口,这是与外围设备和设备交互的常用方式。使Java闻名的一句话“一次编写和到处运行”(Write Once and Run Anywhere,WORA)也适用于Android Things。这是Android Things的一大特色,我们可以不关注底层开发板来开发Android Things应用程序。然而,当在不同主板上开发IoT应用程序时,我们也应当考虑一些较小方面的偏差,以便应用程序可以移植到其他兼容的主板上。
在撰写本书时,Raspberry Pi 3是最新的Raspberry开发板,也是Raspberry Pi 2 Model B的升级版本,与之前的版本相比,它新增了以下功能和特点。
图1-2展示了Raspberry Pi 3 Model B。
图1-2 Raspberry Pi 3 Model B
本节将讲述如何使用Windows PC或Mac OS在Raspberry Pi 3上安装Android Things。
在开始安装之前,需要准备好以下配件:
如果没有HDMI线缆,则可以使用屏幕镜像工具。这将有助于了解安装过程及何时开发Android Things UI。在Windows、OS X或Linux等操作系传统中,安装步骤各不相同。
本节将介绍如何使用Windows PC在Raspberry Pi 3上安装Android Things。具体步骤如下。
(1)从Android Developers网站下载Android Things OS镜像。这里选择Raspberry Pi镜像。
(2)接受许可证并等待下载完成。
(3)下载完成后,解压缩ZIP文件。
(4)要在SD卡上安装镜像,可以使用Win32 Disk Imager这款工具。该工具完全免费,可以在SourceForge网站下载。在撰写本书时,该工具的版本为0.9.5。
(5)下载后,以管理员身份运行、安装可执行文件。现在可以将镜像刻录到SD卡中。
(6)将SD卡插入PC。
(7)选择在步骤(3)中解压缩的镜像,确保选择正确的磁盘名称(SD卡),并单击Write按钮。
至此,已完成安装。镜像已经安装在SD卡上,现在可以尝试启动Raspberry Pi 3。
如果读者使用的操作系统是Mac OS X,安装Android Things的步骤会与1.6.1节的操作略有不同。方法多种多样,这里介绍最快而且最简单的一种方法。
以下是具体的安装步骤。
(1)使用FAT32格式化SD卡。将SD卡插入Mac计算机并打开Disk Utility,将弹出图1-3所示界面。
图1-3 操作界面(一)
(2)从Android Developers网站下载Android Things OS镜像。
(3)解压缩下载的文件。
(4)将SD卡插入Mac计算机。
(5)将镜像烧录到SD卡中。打开终端窗口并执行以下命令。
sudo dd bs=1m if=path_of_your_image.img of=/dev/rdiskn
其中,path_of_your_image是在步骤(2)中下载的扩展名为img的文件的路径。
(6)要查找rdiskn,可选择Preferences→System Report选项,弹出图1-4所示界面。其中,BSD Name是要查找的磁盘名称。
图1-4 操作界面(二)
(7)在这种情况下,必须运行以下代码。
sudo dd bs=1m if=path_of_your_image.img of=/dev/disk1
(8)等待镜像复制到SD卡中,复制过程可能需要一段时间,请耐心等待。
一旦将Android Things镜像复制到SD卡中,就可以将其从PC或Mac计算机中移除并插到开发板上。要测试Android Things是否安装成功,可以按以下步骤操作。
(1)使用HDMI将Raspberry Pi 3连接到屏幕。
(2)使用局域网将Raspberry Pi 3连接到网络。
(3)使用USB线将Raspberry Pi连接到Mac计算机/PC。
(4)等待Android Things完成启动,之后将弹出图1-5所示界面,这说明Android Things安装成功。
图1-5 启动界面
现在开发板已准备好,之后可以开始开发第一个Android Things项目了。可以执行以下命令,以确认Android Things已经启动并正在运行:
adb devices
我们应该在结果列表中看到至少一个具有IP地址的Android设备,它就是目标设备。我们已经安装并测试了Android Things系统。目前,因为还没有在系统上安装应用程序,所以我们只会看到Android Things的默认界面。
Intel Edison是由Intel公司开发的一款非常强大的原型开发板,可在一定程度上取代 Raspberry Pi 3并应用在这里的项目中。该开发板的主要规格如下:
带Arduino分接套件的Intel Edison如图1-6所示。
图1-6 带Arduino分接套件的Intel Edison
在本书中,我们会使用Intel Edison和Arduino分接套件来开发项目。同样,我们也可以将此处涉及的所有概念和方法应用在与Android Things兼容的其他Intel开发板上。在准备将镜像烧录到Intel Edison开发板中之前,需要确保已经在系统上安装了SDK Platform tools 25.0.3及以上版本。
此外,检查系统上是否安装了fastboot应用程序。为此,请切换到<Android_SDK_HOME>/ platform-tools。
如果还没有正确地安装SDK,则可以从Android Developer官网下载、安装SDK Manager,然后再继续执行烧录操作。
具体操作流程如下。
(1)访问谷歌Android Things官方页面并下载Intel Edison镜像。
(2)解压缩文件。
(3)访问Intel Platform Flash Tool Lite官网。根据操作系统(OS X或Windows)选择下载并安装Platform Flash Tool Light。
(4)在步骤(1)下载的映像的解压缩目录中有一个名为FlashEdison.json的文件,这是之后需要使用的文件。在继续下面的操作之前请先检查它是否存在。
(5)运行Platform Flash Tool Light(见图1-7)。
图1-7 运行Platform Flash Tool Light
(6)如果使用了Intel Edison和Arduino分接套件,则请确保完成以下操作。
① 持续单击FW按钮直到出现主板信息。
② 将USB端口(J16)连接到PC或Mac计算机。
(7)当主板连接到PC或Mac计算机时,主板信息将会出现在Platform Flash Tool Light中。
(8)单击Browse按钮并选择步骤(4)中所述的FlashEdison.json文件,如图1-8所示。
图1-8 选择FlashEdison.json文件
(9)在Platform Tool Flash Light中检查配置列表框是否包含Non_OS。
(10)单击Start to flash按钮并等待该过程结束,如图1-9所示。
图1-9 等待结束
(11)打开终端控制台或命令行窗口并执行以下命令。
<Android_SDK>/platform-tools/adb reboot bootloader
(12)执行以下命令,以验证电路板是否已连接。执行以下命令后,应该得到类似edisonXXXXX格式的结果。
<Android_SDK>/platform-tools/fastboot devices
(13)切换至包含解压缩内容的目录。
(14)执行以下命令。等待该过程完成。
<Android_SDK>/platform-tools/fastboot
flash gpt partition-table.img
flash u-boot u-boot-edison.bin flash boot_a boot.img
flash boot_b boot.img flash system_b system.img
flash userdata userdata.img erase misc
set_active _a
(15)当以上过程完成并再次出现提示时,执行以下操作。等待该过程结束。
<Android_SDK>/platform-tools/fastboot
flash gapps_a gapps.img
flash gapps_b gapps.img
(16)执行以下命令。
<Android_SDK>/platform-tools/fastboot flash oem_a oem.img flash oem_b oem.img
(17)重启电路板。
<Android_SDK>/platform-tools/fastboot reboot
(18)可以使用以下命令列出连接到系统的Android设备,从而验证安装是否成功。
adb devices
在设备列表中,应该有一个名为edison的设备。
在Raspberry 3或Intel Edison上安装Android Things系统后,可以使用adb shell配置Wi-Fi连接。打开终端控制台或命令行窗口并执行以下命令。
adb shell am startservice -n com.google.wifisetup/.WifiSetupService -a WifiSetupService.Connect -e ssid <Your_WIFI_SSID> -e passphrase <WIFI_password>
Your_WIFI_SSID是需要连接的Wi-Fi的ID,WIFI_password是用来连接Wi-Fi的密码。
Android Things源自Android,Android Things应用程序的开发过程和结构与普通的Android应用程序相同。因此,我们仍然可以使用Android Studio作为Android Things的开发工具。如果你以前使用过Android Studio,则阅读本节将有助于你了解Android Things应用程序和Android应用程序的项目结构的主要区别。如果你还不熟悉Android开发并且未使用过Android Studio,则本节将逐步指导你创建你的第一个Android Things应用程序。
Android Studio是开发Android Things应用程序的官方开发环境,在开始构建项目之前,必须首先安装它。如果没有安装Android Studio,则可以访问Android Developers官网下载并安装它。开发环境必须符合以下先决条件。
如果开发环境不符合以上条件,则必须使用相应管理工具更新Android Studio。
可以通过以下两种方式开始构建一个新项目。
为了能更好地理解Android和Android Things在项目构建上的主要区别,第一次最好选用第二种构建方式。
复制项目模板是构建项目最便捷的方式。通过以下几个步骤,就可以开始开发一个Android Things应用程序。
(1)打开GitHub网站中关于Android Things应用的新项目模板并复制该存储库。打开终端并执行以下命令。
git clone https://github.com/androidthings/new-project-template.git
(2)将复制的项目导入Android Studio中。
相对于复制项目模板,手动创建项目较复杂,但仍然有必要了解这两种方式之间的差异。具体操作如下。
(1)创建一个新的Android项目,并将Minimum SDK设置为“API 24:Andriod 7.0(Nougat)”(见图1-10)。
图1-10 设置Minimum SDK
(2)创建有一个空Activity的Android项目。确认并创建该项目。
(3)在将Android项目重构成Android Things项目结构之前,需要按以下几个步骤操作。
① 打开build.gradle(在App文件夹下),并在dependency标签中添加以下内容。
dependencies { provided 'com.google.android.things:androidthings: 0.2-devpreview' }
② 打开res文件夹,删除其下的所有文件(strings.xml除外)。
③ 打开Manifest.xml,删除application标签中的android:theme属性。
④ 在Manifest.xml的application标签中添加以下内容。
<uses-library android:name="com.google.android.things"/>
⑤ 在layout文件夹中,打开自动创建的布局文件,删除其中对资源文件中值的引用。
⑥ 在默认创建的活动(MainActivity.java)中删除以下内容。
import android.support.v7.app.AppCompatActivity;
⑦ 将AppCompatActivity替换为Activity。
⑧ 在java文件夹下,删除除包名称之外的所有文件夹。
现在已将Android项目转换为Android Things项目了。编译代码,发现没有错误。此后,可以简单地复制包含项目模板的存储库,并在此基础上开始编码。
Android Things项目的结构与Android项目的结构非常相似,它们都有Activity、布局和Gradle等文件。当然,它们也存在以下一些差异。
本节将介绍如何控制连接到Android Things的外围设备(这里,只需要在之前所构建的项目中编写代码)。具体来说,使用应用程序中的3个按钮控制RGB LED的颜色。每个按钮控制一种颜色(3种颜色分别是红色、绿色和蓝色),当按下其中一个按钮时,Android Things会打开或者关闭相应颜色的LED。要创建此项目,需要以下配件:
图1-11展示了会在项目中使用的按钮。
图1-11 项目中使用的按钮
图1-12是一个RGB LED。
图1-12 RGB LED
在将外围设备和电阻器连接到电路板之前,确保电路板与PC断开连接,以免损坏电路板。
图1-13描述了如何将这些组件连接到Raspberry Pi 3。
图1-13 组件与Raspberry Pi 3的连接
Intel Edison的工作原理如图1-14所示。
图1-14 Intel Edison的工作原理
图1-15展示了实际操作过程中如何中连接按钮。连接方式相当简单,一个10 kΩ的下拉电阻将一个按钮引脚连接到接地极。每个按钮都对应一个下拉电阻。
图1-15 按钮的连接
图1-16展示了如何连接LED。
图1-16 LED的连接
200电阻连接每个RGB LED的引脚和电路板的引脚,用于限制流入LED的电流。把另一个引脚(即阳极)连接到Raspberry Pi 3的3.3V引脚和Intel Edison的+5V引脚上。在编写代码之前,还需添加一个库,这个库有助于轻松地与按钮设备进行交互。打开build.gradle(在App文件夹下),并添加以下依赖库。
dependencies { ... compile 'com.google.android.things.contrib:driver-button:0.1' }
使用此库,可以在程序中控制按钮状态。另外,可以通过设置监听器来监听按钮状态的改变。
现在,打开创建项目中的MainActivity.java,按以下步骤执行相应操作。
(1)在onCreate方法中添加以下代码行。
PeripheralManagerService manager = new PeripheralManagerService();
PeripheralManagerService类是Android Things SDK类库引入的最重要的类之一,主要用于与外围设备进行交互。它提供了一组使用各种不同协议(即GPIO、PWM等)与多个不同设备交互的接口。Android Things应用程序可以使用这个类打开或关闭电路板中的每个引脚,从而控制外围设备。同样,也可以为特定任务打开一个特定端口。
(2)创建Button类的3个不同实例,对应电路中使用的每个按钮。
Button button1 = new Button("IO13", Button.LogicState.PRESSED_WHEN_LOW);
需要注意的是,我们需要指定按钮连接到电路板的哪个引脚。在以上代码中,连接的引脚名为IO13。
可以发现,电路板上的每个引脚都会对应一个特定的名称,这些名称会因选择的电路板的不同而各不相同。如果使用Intel Edison,则其中的引脚名称与Raspberry Pi 3引脚布局将完全不同,第2章将具体介绍这方面内容。以上代码中的另一个参数表示按下时按钮的逻辑电平。
如果使用的是Raspberry Pi 3,因为引脚名称各异,所以必须使用以下代码代替上面的代码。
Button button1 = new Button("BCM4", Button.LogicState.PRESSED_WHEN_LOW);
我们还应当考虑另外一个问题,即当在不同的主板上安装Android Things应用程序时是否存在兼容性问题。答案是一定的,第2章会讨论如何处理这个问题及如何创建一个可同时兼容且独立于主板的应用程序。
(1)添加一个监听器(当用户按下按钮时用于响应相应的事件)。这种方式类似于正在操作具有UI的Android应用程序。
button1.setOnButtonEventListener(
new Button.OnButtonEventListener() {
@Override
public void onButtonEvent(Button button, boolean
pressed){ if (pressed) {
redPressed = !redPressed;
try {
redIO.setValue(redPressed);
}
catch (IOException e1) {}
}
}
});
值得注意的是,我们根据按钮的状态将redIO引脚的值设置为1(高)或0(低)。redIO连接到LED的红色引脚,可以用以下代码获取对它的引用。
redIO = manager.openGpio("IO2");
现在你不必纠结是否理解这段代码,第2章会介绍它的含义。
通过以上代码行,我们使用另一个引脚实现了与LED的通信。前面的示例仅适用于Intel Edison开发板,如果使用的是Raspberry Pi 3,则引脚名称会有所不同,需要自行更改。
(2)参照前面的步骤,通过以下代码设置绿色按钮。对于蓝色按钮,代码也类似。
button2.setOnButtonEventListener(new Button.OnButtonEventListener()
{
@Override
public void onButtonEvent(Button button,
boolean pressed) {if (pressed) {
greenPressed = !greenPressed;
try {
greenIO.setValue(greenPressed);
}
catch (IOException e1) {}
}
}
});
(3)初始化greenIO。
greenIO = manager.openGpio("IO4");
(4)设置蓝色按钮的监听器。
button3.setOnButtonEventListener(new Button.OnButtonEventListener()
{
@Override
public void onButtonEvent(Button button,
boolean pressed) {
if (pressed) {
bluePressed = !bluePressed;
try {
blueIO.setValue(bluePressed);
}
catch (IOException e1) {}
}
}
});
(5)初始化blueIO。
blueIO = manager.openGpio("IO7");
(6)修改Manifest.xml。在Android中,应用程序使用Manifest.xml来声明各个Android组件,如Activity、Service等。
Android Things项目仍需要进行声明操作,但声明方式与Android的有所不同。具体步骤如下。
(1)打开Manifest.xml,找到Activity。
(2)删除所有intent-filter标签。
(3)在相同的位置添加以下代码。
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category android:name=
"android.intent.category.IOT_LAUNCHER" />
<category android:name=
"android.intent.category.DEFAULT" />
</intent-filter>
(4)保存文件。
需要注意的是,这里将会有一种新的类型。如果要在嵌入式设备(如Raspberry Pi 3或Intel Edison)上运行Activity,则必须添加IOT_LAUNCHER类型。
现在,可以将电路板连接到PC/Mac计算机上,单击Android Studio顶部的运行按钮(见图1-17)。
图1-17 单击运行按钮
电路板设备将出现在可用的设备列表中,如图1-18所示。
图1-18 可用的设备列表
执行该应用程序,其安装过程与Android应用程序的过程相同。安装完成后,便可以开始使用应用程序。
单击其中各按钮,我们会看到LED将会变为相应的颜色。此外,也可以完全关闭LED。
本章简要介绍了Android Things系统及其工作原理,并介绍了如何在Raspberry Pi 3和Intel Edison上安装Android Things系统。要测试开发的Android Things IoT项目,需要一款兼容它的开发板。同时,本章还讲述了如何开发一个能与外围设备交互的Android Things应用程序。现在,我们已经准备好使用Android Things SDK开发一些有趣的项目了。在第2章中,我们将开发一个报警系统,并使用具有Android Things的PIR传感器来检测运动物体。此外,第2章也将探究如何使用GPIO引脚让设备与外围环境通信。