В этом уроке мы расскажем, как создать систему уведомлений по SMS с Android Things и Twilio. Основная цель этого руководства — шаг за шагом описать, как реализовать систему IoT на основе Android Things, которая отправляет SMS-уведомления через Twilio.
Мы все знаем о важности IoT как прорывной технологии, которая революционизирует несколько экономических областей. Нам не нужно описывать, что такое IoT и как его использовать . Более того, Android Things, новая ОС IoT, созданная Google, достигла необходимой зрелости для использования в производственных средах. Последняя версия Android Things, 1.0, является первой и стабильной версией, которая обещает ввести новую парадигму в разработке приложений IoT на базе Android. Мы рассмотрели несколько аспектов Android Things в предыдущих статьях, поэтому нет необходимости в другой раз подчеркивать важную роль Android Things в экосистеме IoT.
Что касается IoT, важным аспектом является то, как отправлять уведомления пользователям, когда происходит определенное событие. К событиям уведомления могут относиться оповещения, информационные сообщения, предупреждающие сообщения и так далее. Есть несколько способов, которые мы можем реализовать, чтобы предупредить пользователя о конкретном событии, например:
- Отправка push-уведомления
 - Отправка оповещения по электронной почте
 - Отправка смс уведомления
 
Мы уже рассмотрели некоторые из этих методов в предыдущих постах. В этом уроке рассказывается, как внедрить системы SMS-уведомлений. В конце концов, SMS — это первый и самый старый метод уведомления, широко используемый в нескольких конкурсах.
Содержание
1. Обзор проекта системы SMS-уведомлений
Прежде чем углубляться в детали проекта, полезно иметь представление о том, что мы будем реализовывать, и об общей архитектуре, лежащей в основе этого проекта.
Чтобы сосредоточить внимание на основной теме проекта или создании системы уведомлений по SMS с использованием Android Things, можно предположить, что событие, о котором мы сообщим, инициируется значением, считанным с помощью простого датчика температуры.
Даже если это может быть простой подход, он может быть расширен. Прежде всего, мы можем предположить, что есть другие виды датчиков, которые могут инициировать SMS-уведомление. Более того, мы можем предположить, что устройство Android Things является сборщиком нескольких микроконтроллеров, которые управляют несколькими датчиками и обмениваются данными с Android Things, используя MQTT или другие протоколы. Таким образом, можно централизовать систему уведомлений SMS, и несколько MCU могут использовать эту систему.
Тем не менее, рисунок ниже описывает архитектуру проекта Android Things, которую мы будем реализовывать в ходе этого проекта IoT.
В этом руководстве используется датчик BMP280 или BME280, но можно использовать датчики других типов, если они совместимы с платформой Android Things.
Для простоты этот проект Android Things IoT можно разделить на следующие части:
- Чтение датчика данных BMP280 / BME280 с помощью Android Things
 - Настройка Twilio для приема подключений от Android Things
 - Реализация клиента Twilio в Android Things для отправки SMS-уведомлений
 
Давайте начнем с первого шага.
2. Чтение датчика данных BMP280 / BME280 с помощью Android Things
Эта первая часть проекта считывает данные датчиков с помощью Android Things API. Как вы, возможно, уже знаете, в Android Things есть несколько стратегий, которые можно использовать для считывания данных с датчиков:
- считывать данные датчика одним выстрелом
 - непрерывно читать данные датчика
 
В первой стратегии приложение Android Things считывает данные датчика только один раз, и для получения нескольких выборок данных мы должны прочитать данные с определенным интервалом времени. С другой стороны, Android Things может считывать данные с датчиков непрерывно. Этот второй подход полезен, когда необходимо постоянно контролировать физическую величину, такую как температура, давление и так далее. Этот проект IoT использовал этот второй подход.
Настало время создать проект Android Things с помощью Android studio, и давайте изменим build.gradle, добавив следующую строку:
| 
 1 
2 
3 
4 
 | 
dependencies {  ....   implementation 'com.google.android.things.contrib:driver-bmx280:1.0'} | 
Это добавит необходимые классы для обмена данными между Android Things и BMP280 / BME280.
Теперь в MainActivity мы должны добавить следующие строки:
| 
 1 
2 
 | 
private Bmx280SensorDriver driver;private SensorManager sensorManager; | 
где SensorManager — это класс Android Things API, который управляет датчиками в Android Things.
Следующим шагом является инициализация датчика и регистрация слушателей:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
 | 
private void initSensor() {    try {        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);        sensorManager.registerDynamicSensorCallback(sensorCallback);        driver = new Bmx280SensorDriver("I2C1") ;        driver.registerTemperatureSensor();    }    catch(IOException ioe) {        Log.e(TAG, "Error initializing the driver", ioe);    }} | 
 где sensorCallback — это список, который мы должны реализовать, чтобы узнать, когда датчик подключен: 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
 | 
private SensorManager.DynamicSensorCallback sensorCallback = new  SensorManager.DynamicSensorCallback() {    @Override    public void onDynamicSensorConnected(Sensor sensor) {      if (sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE)          sensorManager.registerListener(sensorListener, sensor,                    SensorManager.SENSOR_DELAY_NORMAL);      else if (sensor.getType() == Sensor.TYPE_PRESSURE)          sensorManager.registerListener(pressSensorListener, sensor,                     SensorManager.SENSOR_DELAY_NORMAL);   }   @Override    public void onDynamicSensorDisconnected(Sensor sensor) {         super.onDynamicSensorDisconnected(sensor);    }}; | 
  BMP280 или BME280 — это датчик, который считывает температуру и давление, поэтому мы регистрируем обоих слушателей.  Кроме того, приложение определяет, как часто данные датчика должны быть получены с помощью SENSOR_DELAY_NORMAL . 
  Наконец, приложение регистрирует слушателей датчика, чтобы знать, когда датчик считывает новое значение: 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
private SensorEventListener sensorListener = new SensorEventListener() {  @Override  public void onSensorChanged(SensorEvent event) {    float temp = event.values[0];    // Here we will implement the logic to send the message  } }} | 
Теперь мы готовы к настройке Twilio.
3. Настройка Twilio для приема подключений от Android Things
В этом разделе мы расскажем, как настроить Twilio для отправки SMS-уведомлений с устройств Android Things. Если у вас нет учетной записи в Twilio, вы можете зарегистрироваться по этой ссылке . Если у вас есть учетная запись, вы можете создать новый проект, который мы будем использовать для отправки SMS-уведомлений на наш смартфон:
Теперь вам нужно создать собственный номер мобильного телефона для отправки вашего SMS. С помощью консоли Twilio вы можете легко создавать. Когда номер отправителя будет готов, на панели мониторинга Twilio появится вся информация, необходимая клиенту Android Things для отправки SMS-уведомления:
Перед завершением настройки Twilio вы можете попробовать отладчик Twilio API в (Меню-> Время выполнения-> API Explorer). Теперь вам нужно выбрать Programmable SMS и получить консоль для отправки уведомлений:
Нажав на кнопку «Сделать запрос», вы получите SMS на свой смартфон.
4. Реализация клиента Twilio в Android Things для отправки SMS-уведомлений
Это последний шаг этого проекта, где мы внедрим клиент Twilio в Android Things, который будет отправлять SMS-уведомления на наш смартфон, когда происходит определенное событие. В этом примере мы можем предположить, что контролировать температуру и отправлять SMS, когда она превышает пороговое значение.
  Давайте создадим новый класс с именем TwilioCient.java .  Этот класс будет управлять всеми деталями общения.  Для этого мы будем использовать OkHTTP. 
Давайте создадим статический метод внутри этого класса, как показано ниже:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
 | 
public static void sendSMS(String body) {   client = new OkHttpClient.Builder()      .authenticator(new Authenticator() {        @Override        public Request authenticate(Route route, Response response) throws IOException {            String credential =                Credentials.basic(TWILIO_ACCOUNT_SID,                             TWILIO_AUTH_TOKEN);            return response.request()             .newBuilder()             .header("Authorization", credential)             .build();        }    }).build();    RequestBody reqBody = new FormBody.Builder()            .add("To", DEST_PHONE_NUMBER)            .add("From", ORIGIN_PHONE_NUMBER)            .add("Body", body)            .build();    Request req = new Request.Builder()            .url(TWILIO_BASE_URL)            .post(reqBody)            .build();    client.newCall(req).enqueue(new Callback() {        @Override        public void onFailure(Call call, IOException e) {            Log.e(TAG, "Error", e);        }        @Override        public void onResponse(Call call, Response response) throws IOException {            Log.i(TAG, "Ok message sent");            Log.d(TAG, "Response ["+                    response.body().string()                    +"]");        }    });} | 
У этого метода есть несколько важных аспектов:
- Мы используем собственный аутентификатор для доступа к API с использованием TWILIO_ACCOUNT_SID и TWILIO_AUTH_TOKEN, как показано на панели инструментов.
 - URL-адрес (TWILIO_BASE_URL) добавляется к API-интерфейсу Twilio для URL идентификатора учетной записи.
 
Это все. Наконец, мы можем изменить класс MainActivity следующим образом:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
 | 
...public void onSensorChanged(SensorEvent event) {  float temp = event.values[0];    if (temp > 30) {      if ( lastTime == 0 || (System.currentTimeMillis() - lastTime) > 60000) {        Log.d(TAG, "Sending message...");        TwillioClient.sendSMS("Alert! the temperatus is over 30°C");        lastTime = System.currentTimeMillis();      }      else {        //    Log.d(TAG, "Message Already sent...waiting");      }   }} | 
В этом методе мы отправляем не только SMS-уведомление, но и проверяем, что мы еще не отправили сообщение.
5. Резюме
В конце этой статьи вы узнали, как внедрить систему уведомлений по SMS с помощью Android Things и как интегрировать Twilio с Android Things. Как описано ранее, это простое учебное пособие может быть дополнительно расширено, чтобы охватить несколько случаев использования, когда необходимо уведомить событие для использования с помощью SMS.
|   Опубликовано на Java Code Geeks с разрешения Франческо Аццолы, партнера по нашей программе JCG.  См. Оригинальную статью здесь: Создайте систему SMS-уведомлений с Android Things и Twilio. 
 Мнения, высказанные участниками Java Code Geeks, являются их собственными.  | 


