Google 新物聯網平臺初體驗—Android Things

一、你應該瞭解的 Android Things 的知識

1. Andorid Things 是神馬?

Google 物聯網操作系統 Android Things,它可以運行在有線揚聲器、智能溫控器、安全攝像頭、路由器等設備上,Google 的理念是通過 Android Things 讓 Android 開發者與公司能夠以他們過去的開發方式繼續開發物聯網硬件設備。結合 Google 爲物聯網推出的通訊協議 Weave,Android Things 將會在 Google 的物聯網戰略中發揮重要作用。

2. Andorid 和 Android Things 是啥關係?

在深入瞭解它的開發之前,你應該瞭解如下幾點:

  • 是 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. 咱們一起來嘮嘮樹莓派吧

官方推薦的開發板有 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

  • 準備你的硬件設備,如: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/win32diskp_w_picpathr/);

  • 以管理員用戶啓動 Win32DiskImager,選擇解壓的 ImageFile,選擇插入的 SD 卡磁盤,點擊 Write 等待寫入完畢;

注意:千萬小心!!如果選擇的磁盤不是 SD 卡,會損壞該磁盤中的數據;

  • 將你的 SD 卡插入到開發板中,連接開發板的 1-電源、2-HDMI 轉接線和 3-網線;

  • 打開電源,顯示器就會輸出相關啓動信息,啓動成功後顯示如下;

  • 使用 adb tools 通過 ip(通過路由器可查看)連接開發板安裝的 Androoid Things 系統(顯示 Wi-Fi 和網絡連接 ip);

三、來跑一個 Demo 耍耍

這裏我們以官方提供的 sample-simplepio 項目的 blink 模塊爲例,這樣給大家演示一下如何使用 Android Studio 和樹莓派 3 開發板,進行 Android Things 項目的開發;

1. 克隆代碼

2. 導入工程

Open an existing Android Studio Project->選擇 sample-simplepio 項目->OK->按照默認引導導入項目;

3. 工程目錄

sample-simplepio 項目運行基本的代碼練習 PIO API, 項目包含 3 個模塊,每個例子是一個可以獨立運行的 Android 模塊。這裏我們僅僅使用 blink 模塊跟大家演示和介紹:

4. 硬件準備

在搭建電路之前,我們列舉一下需要的硬件設備:

 樹莓派 3 開發板 1 塊
 LED 燈 1 個
 電阻 1 個
 麪包板 1 塊

5. 電路搭建

根據下面的電路設計圖,使用相關的元器件搭建電路如下(注意正極連接 BCM6 引腳,負極連接 Ground 引腳 ):

6.連接系統

連接好樹莓派開發板,啓動 Android Things 系統,並在開發電腦中使用 adb connect 命令連接到開發板(這樣你就可以在構建運行的時候選擇樹莓派開發板進行安裝了 );

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:

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

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">
    <!--控制 LED 燈閃爍頻率 SeekBar 控件-->
    <SeekBar        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="1000"
        android:progress="1000"/>
    <!--LED 等當前閃爍頻率-->
    <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)安裝程序;

注意:如果工程導入構建的過程中,提示升級 Build Tools,則按照 Android Studio 引導升級即可。Android Things 要求:

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

9. 安裝成功

應用安裝成功後,顯示器上顯示如下;

電路板運行效果,看上圖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章