本文为 Qunar 技术沙龙投稿,版权归原作者所有,未经允许,请勿转载。
原文地址:http://mp.weixin.qq.com/s/RW1_4mNjFmInpgdbpTpgeg
作者:彭呈祥,去哪儿网大住宿事业部 Android 开发工程师,毕业于江西农业大学,2014 年加入去哪儿网,目前主要工作为去哪儿酒店 Android 相关客户端开发。致力于 Android 技术研发、性能提高和流程优化,项目管理规范化和自动化。
CSDN 有奖征稿啦】技术之路,共同进步,欢迎投稿、给文章纠错,请发送邮件至[email protected],或加微信 tree-rain-chen。

一、你应该了解的 Android Things 的知识

1. Andorid Things 是神马?

Google 物联网操作系统 Android Things,它可以运行在有线扬声器、智能温控器、安全摄像头、路由器等设备上,Google 的理念是通过 Android Things 让 Android 开发者与公司能够以他们过去的开发方式继续开发物联网硬件设备。结合 Google 为物联网推出的通讯协议 Weave,Android Things 将会在 Google 的物联网战略中发挥重要作用。

Google 新物联网平台初体验—Android Things_第1张图片

2. Andorid 和 Android Things 是啥关系?

在深入了解它的开发之前,你应该了解如下几点:

Google 新物联网平台初体验—Android Things_第2张图片

  • 是 Google 为 Google Brillo(Google 在 2015 年宣布的一款物联网操作系统)更改名称后的新版系统;
  • Brillo 核心也是 Android 系统,但是它把 C++作为主要开发环境,开发和部署明显不同于常规的 Android。而 Android Things 则面向所有的 Java 开发者,使用 Android Studio 作为开发工具,开发过程和 Android 几乎相同;
  • 支持 Google API for Android 的一个子集(如:Firebase,Admob 和 Maps 等),要求用户输入或者证书认证的 API 对于应用不可用;
  • 开机启动自动运行你开发的 App,不存在系统的 App,系统应用标准套件(如:Calendar,Contacts,Settings 等)和 Content Provider,开发过程中应该避免使用这些 Intent 和 Content Provider;
  • 继承了核心的 Andorid 框架,并由 Things Support Library 提供了额外的 API,这些 API 允许应用集成在手机上没有的新硬件;
  • 使用 Android 相同的 UI toolkit,支持图形用户界面。开发的应用占据了全部显示区域,没有系统栏和导航按钮,所以不支持 Notification。但是它也不强制要求显示设备,没有显示时 Activity 仍然是主要的 App 组件,输入事件分发 Acitivity;
  • 不支持在运行时请求权限,因为嵌入式设备不能保证有 UI 来显示运行时对话框,你需要在清单文件中声明权限,在安装的时候被授予。

二、树莓派 3 上手就是这么简单

1. 咱们一起来唠唠树莓派吧

Google 新物联网平台初体验—Android Things_第3张图片

官方推荐的开发板有 Intel Edison、NXP Pico i.MX6UL 和 Raspberry Pi 3(树莓派 3)。树莓派是世界上最流行的单板计算机,3 Model B 是最新的版本。它提供了如下配置:

  • 一个双核 64 位 ARM Cortext-A53 1.2GHz CPU(512M 的内存,在背面);
  • 400 MHz GPU;
  • 电源接口;
  • HDMI 和 DSI 视频接口;
  • 音频接口;
  • 有线、无线网络和蓝牙 4.1 模块;
  • 4 个 USB 2.0 接口;
  • 40-针 GPIO 连接器用于连接外设;
  • SD 卡存储(在侧边);

2. 手把手教你安装你自己的 Android Things

Google 新物联网平台初体验—Android Things_第4张图片

  • 准备你的硬件设备,如:1-树莓派 3 开发板,2-电源线,3-HDMI 转接线(连接显示器),4-SD 卡等和 5-网线;

  • 在你的电脑上插入 8G 或者更大的 SD 卡;

  • 下载你的开发板(以树莓派 3 为例)对应的系统镜像(https://developer.android.com/things/preview/download.html),并解压 img 文件;

  • 下载你使用的操作系统对应的(以 Windows7 为例)Win32DiskImager,并安装(https://sourceforge.net/projects/win32diskimager/);
  • 以管理员用户启动 Win32DiskImager,选择解压的 ImageFile,选择插入的 SD 卡磁盘,点击 Write 等待写入完毕;

Google 新物联网平台初体验—Android Things_第5张图片

注意:千万小心!!如果选择的磁盘不是 SD 卡,会损坏该磁盘中的数据;

  • 将你的 SD 卡插入到开发板中,连接开发板的 1-电源、2-HDMI 转接线和 3-网线;

Google 新物联网平台初体验—Android Things_第6张图片

  • 打开电源,显示器就会输出相关启动信息,启动成功后显示如下;

Google 新物联网平台初体验—Android Things_第7张图片

  • 使用 adb tools 通过 ip(通过路由器可查看)连接开发板安装的 Androoid Things 系统(显示 Wi-Fi 和网络连接 ip);

Google 新物联网平台初体验—Android Things_第8张图片

三、来跑一个 Demo 耍耍

这里我们以官方提供的 sample-simplepio 项目的 blink 模块为例,这样给大家演示一下如何使用 Android Studio 和树莓派 3 开发板,进行 Android Things 项目的开发;

1. 克隆代码

Google 新物联网平台初体验—Android Things_第9张图片

2. 导入工程

Open an existing Android Studio Project->选择 sample-simplepio 项目->OK->按照默认引导导入项目;

Google 新物联网平台初体验—Android Things_第10张图片

3. 工程目录

sample-simplepio 项目运行基本的代码练习 PIO API, 项目包含 3 个模块,每个例子是一个可以独立运行的 Android 模块。这里我们仅仅使用 blink 模块跟大家演示和介绍:

Google 新物联网平台初体验—Android Things_第11张图片

4. 硬件准备

在搭建电路之前,我们列举一下需要的硬件设备:

 树莓派 3 开发板 1 块 LED 灯 1 个 电阻 1 个 面包板 1 块

5. 电路搭建

根据下面的电路设计图,使用相关的元器件搭建电路如下(注意正极连接 BCM6 引脚,负极连接 Ground 引脚 ):

Google 新物联网平台初体验—Android Things_第12张图片

Google 新物联网平台初体验—Android Things_第13张图片

6.连接系统

连接好树莓派开发板,启动 Android Things 系统,并在开发电脑中使用 adb connect 命令连接到开发板(这样你就可以在构建运行的时候选择树莓派开发板进行安装了 );

Google 新物联网平台初体验—Android Things_第14张图片

7. 项目概述

该项目实现了使用 SeekBar UI 控件来控制电路中 LED 等闪烁频率的功能,主要使用了 GPIO API 进行如下处理:

 使用 PeripheralManagerService 来打开一个连接到 GPIO 端口的 LED 连接; 使用 DIRECTION_OUT_INITIALLY_LOW 配置端口; 给 setValue()方法传递 getValue()相反的值来改变 LED 的状态; 使用 Handler 来执行触发 GPIO 的事件,在一段时间后再次触发; 当应用程序不在需要 GPIO 连接的时候,关闭 Gpio 资源;

原有官方的 Demo 上我进行相关的修改,使用一个 SeekBar 来控制 LED 等的闪烁频率;

sample-simplepio\blink\build.gradle:

Google 新物联网平台初体验—Android Things_第15张图片

sample-simplepio\blink\src\main\AndroidManifest.xml:

Google 新物联网平台初体验—Android Things_第16张图片

BlinkActivity.java:实现 SeekbarUI 控制界面,并且向 Gpio 接口引脚发送指定频率的信号;

public class BlinkActivity extends Activity {    private static final String TAG = BlinkActivity.class.getSimpleName();    //LED 闪烁时间间隔,单位毫秒    private int interval_between_blinks_ms = 1000;    //控制 LED 灯闪烁频率控件    private SeekBar mSeekbar;    //当前 LED 等闪烁频率    private TextView mSeekbarValue;    private Handler mHandler = new Handler();    //Gpio 接口对象    private Gpio mLedGpio;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i(TAG, "Starting BlinkActivity");        setContentView(R.layout.blink_activity);        mSeekbarValue = (TextView) findViewById(R.id.seekBar_value);        mSeekbar = (SeekBar) findViewById(R.id.seekBar);        mSeekbar.setProgress(interval_between_blinks_ms);        mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {            @Override            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {                mSeekbarValue.setText("LED between time:" + i + "ms");                //通过 SeekBar 控件改变 LED 等闪烁频率                interval_between_blinks_ms = i;            }            @Override            public void onStartTrackingTouch(SeekBar seekBar) { }            @Override            public void onStopTrackingTouch(SeekBar seekBar) { }        });        // 使用指定引脚名称,PeripheralManagerService 来打开一个连接到 GPIO 端口的 LED 连接         PeripheralManagerService service = new PeripheralManagerService();        try {            String pinName = BoardDefaults.getGPIOForLED();            mLedGpio = service.openGpio(pinName);            //设置引脚为输出信号            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);            Log.i(TAG, "Start blinking LED GPIO pin");            //Post 一个 Runnable 对象,在指定的时间间隔持续的改变 GPIO 接口的状态,使得 LED 等闪烁            mHandler.post(mBlinkRunnable);        } catch (IOException e) {            Log.e(TAG, "Error on PeripheralIO API", e);        }    }    @Override    protected void onDestroy() {        super.onDestroy();        //从 Handler 中移除 blink Runnable 对象        mHandler.removeCallbacks(mBlinkRunnable);        Log.i(TAG, "Closing LED GPIO pin");        try {            //页面销毁,当应用程序不在需要 GPIO 连接的时候,关闭 Gpio 资源            mLedGpio.close();        } catch (IOException e) {            Log.e(TAG, "Error on PeripheralIO API", e);        } finally {            mLedGpio = null;        }    }    private Runnable mBlinkRunnable = new Runnable() {        @Override        public void run() {            // 如果 GPIO 引脚已经关闭,则退出 Runnable            if (mLedGpio == null) {                return;            }            try {                //使用 setValue()方法传递 getValue()相反的值来改变 LED 的状态;                mLedGpio.setValue(!mLedGpio.getValue());                Log.d(TAG, "State set to " + mLedGpio.getValue());                mHandler.postDelayed(mBlinkRunnable, interval_between_blinks_ms);            } catch (IOException e) {                Log.e(TAG, "Error on PeripheralIO API", e);            }        }    };}

blink_activity.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="vertical">        <SeekBar        android:id="@+id/seekBar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:max="1000"        android:progress="1000"/>        <TextView        android:id="@+id/seekBar_value"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:textSize="30dp"/>LinearLayout>

8. 项目运行

选择 blink 模块,点击运行,选择树莓派(Iot_rpi3)安装程序;

Google 新物联网平台初体验—Android Things_第17张图片

注意:如果工程导入构建的过程中,提示升级 Build Tools,则按照 Android Studio 引导升级即可。Android Things 要求:

Google 新物联网平台初体验—Android Things_第18张图片

 SDK Tools 为 24 或者更高版本; Android SDK 为 7.0(API 24)或者更高版本;

9. 安装成功

应用安装成功后,显示器上显示如下;

Google 新物联网平台初体验—Android Things_第19张图片

电路板运行效果,看上图。

Google 新物联网平台初体验—Android Things_第20张图片

更多相关文章

  1. 基于android平台底部菜单实现
  2. 从网络获取图片,并缓存到SD卡
  3. android平台下的aes加密和java平台下的运行结果不同的解决办法
  4. ionic3 图片选取imagepicker以及camera汉化
  5. android平台工具说明
  6. Android修改图片颜色-转成灰度图

随机推荐

  1. Android中设置控件点击效果
  2. 最简单的基于FFmpeg的移动端例子:Android
  3. Wifi启动流程分析
  4. 20个Android很有用的代码片段
  5. Android旋转屏幕时阻止activity重建
  6. Android开发资源推荐
  7. android layout_weight 使用总结
  8. RadioButton练习(android)
  9. ADB的使用
  10. 最简单的基于FFmpeg的移动端例子:Android