Статьи

Android Things: ваш первый проект

Android Things, новая платформа Google для создания устройств , связанных с Интернетом вещей (IoT) , — это простой способ познакомиться с одной из ключевых технологий будущего. Из этого урока вы узнаете, как настроить Android Things. Вы создадите свой первый простой проект и начнете использовать GPIO (ввод / вывод общего назначения), чтобы читать нажатия кнопок и зажигать светодиод.

Для получения дополнительной информации об Android Things, посмотрите мою статью здесь на Envato Tuts +.

  • Android
    Введение в Android вещи

Прежде чем вы начнете программировать для Android Things, вам необходимо настроить физическую макетную плату для работы операционной системы.

В настоящее время существует три варианта для плат:

  • Raspberry Pi
  • Intel Edison с Arduino Breakout Board
  • NXP Pico i.MX6UL

В этом уроке я покажу вам, как настроить Raspberry Pi, поскольку это самая распространенная и доступная из поддерживаемых в настоящее время плат макетирования. Если вы используете другую среду разработки, вы можете найти конкретные инструкции по перепрошивке вашей платы на официальной странице документации по Android Things .

Чтобы поместить Android Things на Pi, вам понадобится Raspberry Pi 3 B и следующее дополнительное оборудование:

  • Кабель HDMI и дисплей (например, монитор компьютера)
  • Кабель Ethernet подключен к вашему интернету
  • Кабель Micro-USB
  • Карта Micro SD с объемом не менее 8 ГБ и адаптером для карты SD
SD-карта и адаптер
  • Компьютер, который может читать и записывать на SD-карту

После того, как вы собрали все необходимые компоненты, вам нужно будет загрузить последнюю версию образа системы для Raspberry Pi из Google. Все последние изображения можно найти на странице загрузок образов системы Android Things .

Как только вы загрузили файл, вам нужно будет разархивировать его, чтобы получить файл .img . Из-за размера файла некоторые программы могут столкнуться с проблемой разархивирования, например стандартная служебная программа архивирования в OS X, которая будет возвращать .cpgz или .zip в цикле. Если это произойдет, вы можете установить Unarchiver for OS X или 7zip для Windows, чтобы правильно распаковать файл.

После извлечения файла .img вам нужно будет поместить его на SD-карту. Этот процесс может варьироваться в зависимости от операционной системы. В этом разделе описан процесс в OS X, хотя инструкции существуют и для Linux и Windows .

Сначала вставьте SD-карту в компьютер. Если ваша SD-карта не отформатирована как FAT-32, вам нужно будет сделать это сейчас. Затем вам нужно будет выполнить команду diskutil list чтобы найти путь к вашей SD-карте.

Вывод терминала из команды diskutil list

На приведенном выше снимке экрана вся SD-карта имеет путь / dev / disk3 (не путать с идентификатором раздела disk3s1 ). Используя этот путь, выполните команду diskutil unmountDisk чтобы диск можно было перепрошить.

Вывод терминала из команды diskutil unmountDisk

Последний шаг при перепрошивке образа Android Things для Raspberry Pi — скопировать образ на вашу SD-карту с помощью следующей команды (обновленной с sudo dd bs=1m if=image.img of=/dev/rdisk<disk# from diskutil> правильного пути к вашему образу и номеру диска): sudo dd bs=1m if=image.img of=/dev/rdisk<disk# from diskutil>

Вывод терминала из проверки прогресса при копировании образа Android Things на SD-карту

Важно отметить, что эта операция может занять несколько минут. Вы можете проверить текущий прогресс с помощью команды Control-T .

Когда изображение закончится на SD-карте, извлеките карту micro-SD из адаптера и вставьте ее в нижнюю часть Raspberry Pi.

Raspberry Pi со вставленной SD-картой

Затем подключите Raspberry Pi к дисплею с помощью кабеля HDMI, к сети с помощью кабеля Ethernet и к источнику питания (например, к компьютеру) с помощью кабеля micro-USB типа B.

Raspberry Pi с минимальным количеством соединений, необходимых для завершения настройки

Когда ваш Raspberry Pi загрузится, вы должны увидеть следующее на вашем дисплее.

Экран отображения вещей Android с указанным IP-адресом

Вы увидите IP-адрес вашего устройства в нижней части экрана. Это понадобится вам для подключения к вашей плате вещей Android с помощью команды adb connect <ip address> .

На этом этапе вы сможете подключиться к недавно установленной плате Android Things и загрузить на нее приложения, о чем мы и поговорим на следующем занятии. Если вы хотите отключить Raspberry Pi от физического сетевого подключения и использовать встроенный чип WiFi, вам нужно будет выполнить следующую команду.

1
2
3
4
5
adb shell am startservice \
   -n com.google.wifisetup/.WifiSetupService \
   -a WifiSetupService.Connect \
   -e ssid <Network_SSID> \
   -e passphrase <Network_Passcode>

Это позволит вам перезагрузить устройство и получить к нему доступ через сеть WiFi, не привязываясь к соединению Ethernet.

Прежде чем приступить к написанию кода для вашего нового приложения Android Things, вы должны убедиться, что ваше оборудование настроено для проекта, который вы хотите создать. Для нашего вводного проекта мы создадим простое устройство, которое позволяет пользователям нажимать кнопку, которая включает светодиод. Когда кнопка отпущена, светодиод погаснет. Вам понадобятся следующие аппаратные компоненты:

  • совместимая с Android Things плата, на которой установлена ​​последняя версия ОС
  • светодиод
  • кнопка
  • резистор 10 кОм (цветные полосы коричневого, черного, оранжевого цвета)
  • резистор 470 Ом (резистор цветные полосы желтый, фиолетовый, коричневый)
  • провода
  • макетировать

После того, как у вас есть компоненты, вы можете приступить к подключению. Я включил две схемы для вашего первого проекта: одну схему подключения для коммутационной платы Intel Edison с Arduino и одну для Raspberry Pi.

Схема подключения для проекта с использованием Intel Edison с платой Arduino
Схема подключения Raspberry Pi

После того, как ваша доска подключена, пришло время написать ваше первое приложение.

Для Android Things требуется, чтобы проекты создавались с минимальным набором SDK 24. Вы можете запустить это руководство, создав новый проект с таким минимальным требованием и пустым действием.

Когда ваш базовый проект будет создан, откройте файл build.gradle вашего модуля приложения. Под узлом зависимостей включите библиотеку Android Things. На момент написания этой статьи библиотека еще находилась в предварительной версии для разработчиков.

1
provided ‘com.google.android.things:androidthings:0.1-devpreview’

Затем откройте файл AndroidManifest.xml . Вам нужно будет объявить, что ваше приложение использует библиотеку Android Things, добавив следующую строку в ваш узел application .

1
<uses-library android:name=»com.google.android.things»/>

Последнее, что нужно сделать в файле манифеста, — добавить intent-filter к узлу MainActivity который позволит вашему устройству узнать, что оно должно запустить это действие при запуске. Поскольку Android Things запускает приложения при запуске, вы, как правило, хотите, чтобы на устройстве одновременно было установлено только одно приложение.

01
02
03
04
05
06
07
08
09
10
11
12
<activity android:name=».MainActivity»>
    <intent-filter>
        <action android:name=»android.intent.action.MAIN» />
        <category android:name=»android.intent.category.LAUNCHER» />
    </intent-filter>
 
    <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>
</activity>

Как только вы закончите с манифестом, вы можете открыть MainActivity.java , так как именно здесь будет реализована основная логика вашего первого проекта Android Things. Объект, который будет создавать экземпляры ваших входных и выходных соединений, называется PeripheralManagerService , поэтому давайте начнем с получения ссылки на него в onCreate() .

1
PeripheralManagerService service = new PeripheralManagerService();

Теперь, когда у вас есть PeripheralManagerService , давайте сделаем еще одну вещь, прежде чем копаться в написании нашего управляющего кода. Ранее вы подключили все свои компоненты к плате с помощью специальных контактов. Для управления периферийными устройствами, которые вы прикрепили к этим контактам, вам нужно знать название каждого контакта на вашей плате. Вы можете распечатать список каждого компонента, используя PeripheralManagerService следующим образом:

1
Log.e(«AndroidThings», «GPIOs: » + service.getGpioList() );

Вышеприведенная строка выведет на Raspberry Pi следующее:

1
E/AndroidThings: GPIOs: [BCM12, BCM13, BCM16, BCM17, BCM18, BCM19, BCM20, BCM21, BCM22, BCM23, BCM24, BCM25, BCM26, BCM27, BCM4, BCM5, BCM6]

На схеме подключения Raspberry Pi, ранее в этом разделе, вы подключили кнопку к BCM21 а светодиод к BCM6 . В схеме соединений Intel Edison с Arduino Breakout вы подключили кнопку к IO12 и светодиод к IO13 . Давайте сохраним эти значения как String элементы в верхней части нашей Activity . В этом примере будут использоваться значения Raspberry Pi, хотя вы можете использовать любые имена контактов, подходящие для вашей проводки и платы.

1
2
private final String PIN_LED = «BCM6»;
private final String PIN_BUTTON = «BCM21»;

В следующих нескольких разделах мы будем использовать эту информацию для связи с обоими компонентами.

Доступ к основным компонентам, таким как светодиоды, можно получить с помощью объекта Android Thing’s Gpio . В верхней части вашей Activity создайте объект Gpio . Это будет использоваться для ссылки на наше соединение со светодиодом в нашем приложении.

1
private Gpio mLedGpio;

Как только у вас появится эталонный объект, вам нужно будет инициализировать его в onCreate() . Вы можете сделать это, вызвав openGpio с именем контакта из вашего объекта PeripheralManagerService . Вы также захотите объявить состояние инициализации компонента, которое в этом случае является DIRECTION_OUT_INITIALLY_LOW (по сути, «выключено»). Вам нужно будет обернуть вызовы настройки ввода / вывода в блок try/catch на случай возникновения IOException .

1
2
3
4
5
6
try {
    mLedGpio = service.openGpio(PIN_LED);
    mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
} catch (IOException e){
 
}

Теперь, когда мы создали наш светодиодный эталон, вам нужно будет изменить его состояние (включено и выключено). Вы можете использовать метод setValue(boolean) в Gpio чтобы изменить состояние компонента.

1
2
3
4
5
6
7
private void setLedState(boolean isOn) {
    try {
        mLedGpio.setValue(isOn);
    } catch (IOException e) {
 
    }
}

Наконец, когда ваша Activity будет уничтожена, вам нужно будет закрыть все соединения и аннулировать ваши ссылки на оборудование в onDestroy() .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Override
protected void onDestroy(){
    super.onDestroy();
 
 
    if (mLedGpio != null) {
        try {
            mLedGpio.close();
        } catch (IOException e) {
        } finally{
            mLedGpio = null;
        }
    }
}

И это все, что нужно для записи в базовый компонент. Хотя приложение может управлять светодиодом, логика для изменения состояния светодиода отсутствует. На следующем шаге мы будем читать нажатия кнопок, чтобы активировать или отключить этот компонент.

Хотя кнопки являются довольно простыми компонентами, Google все же выпустила набор библиотек драйверов , облегчающих использование кнопок и различных других компонентов. В этом разделе вы будете использовать драйвер кнопки, чтобы подключиться к кнопке и прочитать ее состояние, но сначала вам нужно импортировать драйвер кнопки в файл build.gradle .

1
compile ‘com.google.android.things.contrib:driver-button:0.2’

Затем объявите объект ButtonInputDriver в качестве переменной-члена для вашего класса MainActivity .

1
private ButtonInputDriver mButtonInputDriver;

Вы можете инициализировать этот объект и зарегистрировать его в блоке try который используется в onCreate() для вашего светодиодного компонента.

1
2
3
4
5
6
mButtonInputDriver = new ButtonInputDriver(
        BoardDefaults.getGPIOForButton(),
        Button.LogicState.PRESSED_WHEN_LOW,
        KeyEvent.KEYCODE_SPACE);
         
mButtonInputDriver.register();

Как только ваш ButtonInputDriver создан, он будет отправлять события нажатия кнопок в onKeyDown() и onKeyUp() с кодом ключа, который вы указали при создании драйвера, который может быть переопределен в вашей Activity для изменения состояния вашего индикатора.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_SPACE) {
        setLEDState(true);
        return true;
    }
 
    return super.onKeyDown(keyCode, event);
}
 
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_SPACE) {
        setLEDState(false);
        return true;
    }
 
    return super.onKeyUp(keyCode, event);
}

Наконец, вам нужно ButtonInputDriver регистрацию и аннулировать ваш ButtonInputDriver в onDestroy() , как вы это делали со своим светодиодом.

01
02
03
04
05
06
07
08
09
10
if (mButtonInputDriver != null) {
    mButtonInputDriver.unregister();
    try {
        mButtonInputDriver.close();
    } catch (IOException e) {
        Log.e(TAG, «Error closing Button driver», e);
    } finally{
        mButtonInputDriver = null;
    }
}

В этом уроке вы узнали, как прошить Raspberry Pi с Android Things, настроили простую схему, состоящую из кнопки и светодиода, и написали приложение для Android для управления светодиодом на основе нажатий кнопок с помощью библиотеки драйверов.

На этом этапе вы сможете использовать другие библиотеки драйверов и создавать свои собственные более сложные схемы. В следующем уроке этой серии мы рассмотрим различные типы периферийных входов / выходов, которые доступны в Android Things, а затем продолжим создавать собственный драйвер компонента!

А пока ознакомьтесь с некоторыми другими нашими курсами и руководствами по разработке для Android!

  • Введение в Android вещи

  • 6 Что нужно и чего не нужно для отличного пользовательского опыта на Android

  • Java против Kotlin: стоит ли использовать Kotlin для разработки под Android?

  • Начало работы с Android