Статьи

Создайте систему SMS-уведомлений с Android Things и Twilio

В этом уроке мы расскажем, как создать систему уведомлений по 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 создаст новый проект

Теперь вам нужно создать собственный номер мобильного телефона для отправки вашего SMS. С помощью консоли Twilio вы можете легко создавать. Когда номер отправителя будет готов, на панели мониторинга Twilio появится вся информация, необходимая клиенту Android Things для отправки SMS-уведомления:

Система SMS-уведомлений Twilio Dashboard

Перед завершением настройки Twilio вы можете попробовать отладчик Twilio API в (Меню-> Время выполнения-> API Explorer). Теперь вам нужно выбрать Programmable SMS и получить консоль для отправки уведомлений:

смс система уведомлений twilio api консоль

Нажав на кнопку «Сделать запрос», вы получите 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, являются их собственными.