IoT, Android Things та хмара
Рейтинг статті: / 17
НайгіршеНайкраще 
Ubidots_1Розглядається, як розробити додаток Android IoT, що використовує Android Things. Додаток надсилає дані, отримані від сенсорів, на хмару Ubidots, допомагаючи нам представити деякі важливі аспекти щодо програмування додатків Android Things.
Android Things - це нова IoT OS, розроблена компанією Google, яка забезпечує можливості Android для IoT. Використовуючи Android Things, ми можемо знову скористатися знаннями Android, щоб створювати додатки Android Things, використовуючи майже ті ж API. З цією метою розглянемо, як відправити дані, отримані з сенсорів, безпосередньо на хмару за допомогою хмарної платформи IoT: Ubidots.
Крім того, пристрій Android IoT буде записувати всі дані, отримані з сенсорів на хмару. Після даної статті ви зможете розробити додаток Android Things з підтримкою хмари. Це загальний сценарій проекту IoT, тому він корисний для досліджень. Крім того, ви можете додатково вдосконалити цей додаток Android IoT, щоб підтримувати інші види сенсорів або надсилати дані на іншу хмарну платформу. Даний проект загального призначення, який можна налаштувати згідно з вашими потребами та технічними характеристиками вашої хмарної платформи. Якщо хочете спробувати інші платформи IoT-хмар, то можете ознайомитись з статтею про всі безкоштовні платформи IoT.
Для побудови проекту будемо використовувати:
·    Сенсор температури, тиску та вологості BMP280
·    Raspberry Pi 3, щоб запустити ОС Android Things
Крім того, додаток Android IoT використовує:
Підключення сенсора BMP280 до Android Things
На цьому кроці ми розглянемо, як підключити BMP280 до Android Things. BMP280 - це сенсор I2C, тобто, для його підключення потрібні чотири різних проводи:
·    Vcc (+3 В)
·    GND
·    CLK (тактування)
·    SDA (дані)
Як було зазначено раніше, ми використовуємо плату Raspberry Pi 3. Підключення до роз'єму плати показане нижче:
Ubidots_1a
Як тільки правильно підключили дроти, можемо зосередити свою увагу на розробці додатку. Якщо ви вперше використовували Android Things, важливо ознайомитись з посібником про те, як розпочати роботу з Android Things. У будь-якому разі, як перший крок, ви повинні клонувати сховище шаблонів з GitHub. Це порожній проект для Android Studio, який ми будемо використовувати для створення нашого додатка Android IoT. Давайте розпочнемо.
Першим кроком є додавання драйвера Android Things, яке програма Android Things використовує для обміну даними з сенсором. Для цього відкрийте gradle.build (рівень додатка) і додайте наступний рядок:
dependencies {
    ....
    compile 'com.google.android.things.contrib:driver-bmx280:0.4'
    ...
}
Мета цього додатка постійно отримувати дані від сенсора. Потім нам потрібно застосувати той самий підхід, який використовується в Android, коли пристрій відстежує сенсора.
Отримання даних: SensorManager, Listeners та Drivers
Android Things забезпечує елегантний спосіб відстежувати стан сенсора, використовуючи слухачів. У MainActivity додайте наступні рядки:
private Bmx280SensorDriver sensor;
private SensorManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate");
    try {
        manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        registerSensors();
        sensor = new Bmx280SensorDriver(pin);
        sensor.registerTemperatureSensor();
        sensor.registerPressureSensor();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
Зазначений вище код досить простий:
1. Додаток отримує посилання SensorManager.
2. Додаток реєструє слухачі сенсора, щоб отримувати сповіщення, коли читають нові значення з сенсора.
3. Ініціалізується драйвер BMP280.
4. Реєструється зворотний виклик динамічного сенсора (температура і тиск).
Давайте пропустимо крок 2 на деякий час і зосередимо нашу увагу на кроках 3 та 4. На кроці 3 додаток Android IoT створює новий екземпляр драйвера Bmx280Sensor, використовуючи ім'я виводу, до якого під'єднано сенсор. Для Raspberry Pi 3 цим виводом є I2C1.
Перш ніж зареєструвати слухачів, щоб отримати нові значення від сенсорів, необхідно зареєструвати два різних слухача, які будуть повідомляти, коли сенсор підключений до Android Things. Даний сенсор BMP280 читає два фізичні параметри, тому він розглядається як два сенсори. Нарешті, маємо код для реєстрації значення слухачів:
private void registerSensors() {
    manager.registerDynamicSensorCallback(new SensorManager.DynamicSensorCallback() {
        @Override
        public void onDynamicSensorConnected(Sensor sensor) {
            if (sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE) {
                manager.registerListener(tempListener, sensor,
                    SensorManager.SENSOR_DELAY_NORMAL);
            } else if (sensor.getType() == Sensor.TYPE_PRESSURE) {
                manager.registerListener(pressListener, sensor,
                    SensorManager.SENSOR_DELAY_NORMAL);
            }
        }
    });
}
Спосіб onDynamicSensorConnected викликається, як тільки сенсор підключиться до плати. У цей момент додаток може зареєструвати двох слухачів, які буде повідомляти, коли з сенсора прочитані нові значення.
Останній крок - це читання даних з сенсора:
private SensorEventListener tempListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        // new value read
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
private SensorEventListener pressListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        // new value read
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
Як ви вже здогадалися, в методі onSensorChanged додаток надішле нове значення в хмару. На цьому етапі ви можете протестувати додаток Android IoT і перевірити, чи він читає дані сенсора. У будь-якому випадку, перш ніж використовувати додаток, слід додати дозволи в Manifest.xml:
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />
<uses-permission android:name="com.google.android.things.permission.MANAGE_SENSOR_DRIVERS" />
Налаштування Ubidots для отримання даних з додатка Android IoT
Цей крок описує, як налаштувати Ubidots на прийом даних, що надходять з додатку Android Things. Перш ніж почати, потрібно мати безкоштовний обліковий запис Ubidots. Потім треба налаштувати пристрій, який ми представляємо. Для отримання додаткової інформації можете подивитися статтю як настроїти Ubidots для проекту IoT:
Ubidots_2
Наступним кроком буде додавання змінних, які зберігатимуть значення, надіслані з додатка Android:
Ubidots_3
Це все! Всі кроки, необхідні для налаштування Ubidots, завершені. Ми можемо зосередити увагу на останньому кроці надсилання даних у хмару.
Відправлення даних з пристроїв Android у хмару
На цьому останньому кроці даного проекту додаток Android IoT надсилає дані в хмару. Для цього додаток використовує бібліотеки, розроблені для додатків Android, які спрощують програмування.
Ubidots виставляє набір API, який додаток може використовувати для надсилання даних. Це JSON API. У цьому контексті бібліотеки Retrofit та Gson дуже корисні.
Додамо залежності в файл build.gradle:
dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.google.code.gson:gson:2.8.2'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
}
API Ubidots, який викликає додаток, є /api/v1.6/collections/values, які приймає тримач масиву JSON:
• ідентифікатор змінної
• значення змінної
Де ідентифікатор змінної - унікальний ідентифікатор змінної, наданий Ubidots, а значення - це значення, яке надсилає додаток. Щоб розробити додаток Android IoT, який викликає цей API, ми використовуємо Retrofit. Коротко кажучи, ця бібліотека спрощує процес виклику API JSON. Для цього першим кроком є розробка інтерфейсу Java, що представляє виклик API:
public interface UbiAPI {
    @POST("/api/v1.6/collections/values")
    public Call<ResponseBody> sendValue(
        @Body ArrayList<Data> dataList, @Query("token") String token);
}
Анотація @POST оголошує контекст API, а метод, визначений у інтерфейсі, являє собою метод, який програма запускає для надсилання даних. Цей метод приймає масив даних як тіла та токену, який ідентифікує наш додаток. Клас Data:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Data {
    @SerializedName("variable")
    @Expose
    private String variable;
    @SerializedName("value")
    @Expose
    private Double value;
    public String getVariable() {
        return variable;
    }
    public void setVariable(String variable) {
        this.variable = variable;
    }
    public Double getValue() {
        return value;
    }
    public void setValue(Double value) {
        this.value = value;
    }
}
Цей клас містить ідентифікатор змінної і значення та описує, як перетворити ці значення у формат JSON. Нарешті, ми повинні визначити клієнта, який обробляє зв'язок з Ubidots:
public class UbiClient {
    private static final String TAG = UbiClient.class.getSimpleName();
    private static final String UBI_BASE_URL =  "http://things.ubidots.com/";
    private static UbiClient client;
    private UbiAPI api;
    private Retrofit retroClient;
    private UbiClient() {
        retroClient = new Retrofit.Builder()
            .baseUrl(UBI_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    }
    public static final UbiClient getClient() {
      if (client != null)
          return client;
      client = new UbiClient();
      return client;
    }
    private UbiAPI getUbiClient() {
        return retroClient.create(UbiAPI.class);
    }
    public void sendData(ArrayList<Data> dList, String token) {
      api = client.getUbiClient();
      Call c = api.sendValue(dList, token);
      c.enqueue(new Callback() {
         @Override
         public void onResponse(Call call, Response response) {
            Log.d(TAG, "onResponse");
            Log.d(TAG, "Result:" + response.isSuccessful());
         }
         @Override
         public void onFailure(Call call, Throwable t) {
             t.printStackTrace();
         }
      });
   }
}
Це все. У нас є клієнт, який підключається до Ubidots і надсилає дані. Останній крок - це зміна коду, показаного вище, де додаток зчитує значення сенсора та додає наступний код для надсилання даних у хмару:
private SensorEventListener tempListener = new SensorEventListener() {
   @Override
   public void onSensorChanged(SensorEvent event) {
       final Data dTemp = new Data();
       dTemp.setValue( (double) event.values[0]);
       dTemp.setVariable("59edbdc7c03f9721cc571662");
       UbiClient.getClient().sendData(new ArrayList<Data>(){{
          add(dTemp);
       }}, token);
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
 };
private SensorEventListener pressListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
      final Data dPress = new Data();
      dPress.setVariable("59edbdcec03f97212ff872c6");
      dPress.setValue( (double) event.values[0]);
      UbiClient.getClient().sendData(new ArrayList<Data>(){{
           add(dPress);
      }}, token);
   }
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
   }
 };
Цікавим фрагментом коду є частина, яка надсилає дані - де додаток збирає інформацію для надсилання в хмару:
final Data dPress = new Data();
// Variable id
dPress.setVariable("59edbdcec03f97212ff872c6");
dPress.setValue((double) event.values[0]);
UbiClient.getClient().sendData(new ArrayList < Data > () {
    {
        add(dPress);
    }
}, token);
Не забудьте додати дозвіл на підключення до Інтернету в Manifest.xml
<uses-permission android:name="android.permission.INTERNET" />
Запускаємо додаток та отримуємо доступ до інформаційної панелі Ubidots:
Ubidots_4
Висновки
Тепер, напевно, ви отримали знання, неохідні для розробки додатку Android IoT, який використовує Android Things для надсилання даних у хмару. Крім того, ви отримали знання, як використовувати сенсор I2C з Android Things.
(Джерело EN: dzone.com)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting