Как это работает?

Headwind MDM включает в себя встроенную платформу для доставки Push-уведомлений, полностью автономную и не использующую какие-либо сторонние облачные сервисы. Поэтому сервис Push-уведомлений может быть развернут в локальных сетях и использоваться на Android-устройствах, не сертифицированных Google.

Устройства поддерживают постоянное TCP соединение с сервером. Когда сообщение появляется на сервере, оно отправляется на соответствующее устройство по TCP каналу, поэтому доставка Push-уведомления происходит практически мгновенно.

В качестве несущего протокола используется MQTT. Веб-панель включает в себя брокер MQTT (Apache ActiveMQ), ответственный за маршрутизацию Push-уведомлений.

Для надежности TCP-соединения, мобильный агент отправляет Heartbeat-сообщения каждые 5 минут и реализует алгоритм автоматического восстановления соединения при его потере. Headwind MDM использует улучшенный вариант библиотеки MQTT клиента с открытым кодом «Eclipse Paho».

Структура Push-сообщения

Push-сообщение в Headwind MDM имеет три поля:

  • Type — строка, определяющая тип сообщения. Тип сообщения используется для маршрутизации в приложения — ваше приложение может получать сообщения одного или нескольких типов. Есть также уже определенные в системе типы сообщений.
  • Payload — опциональная JSON-строка, содержащая дополнительные данные.
  • DeviceNumber — адрес получателя сообщения (номер устройства в Headwind MDM).

В библиотеке Headwind MDM, Push-сообщение представлено классом MDMPushMessage.

Примеры

Лаунчер Headwind MDM обрабатывает следующие типы Push-уведомлений.

Обновление конфигурации

Когда администратор обновляет конфигурацию в веб-панели, она отправляет сообщение типа configUpdated (без данных) на каждое устройство, имеющее эту конфигурацию.

Ваше приложение также может получать сообщения этого типа, и обновлять свои настройки после обновления конфигурации. Этот механизм обновления настроек используется в большинстве плагинов Headwind MDM.

Запуск приложения

Когда плагину нужно удаленно запустить мобильного агента, на устройство отправляется сообщение типа runApp.

Дополнительные данные имеют вид:

{
  "pkg": "Package ID of the running app",
  "action": "Action for the Android intent, optional",
  "extra": {
    "ExtraKey1": "Extra Value 1",
    "ExtraKey2": "Extra Value 2",
    ...
  }
}

Атрибут pkg является обязательным, остальные атрибуты — опциональны.

REST API для отправки Push-уведомлений

Ваши приложения могут отправлять Push-уведомления на устройства, управляемые Headwind MDM, с помощью REST API.

Перед вызовом метода API для отправки уведомления, необходимо авторизоваться в REST API и получить токен авторизации. Детали об авторизации в REST API можно посмотреть здесь.

REST метод для отправки Push-уведомления:

POST /rest/private/push
Authorization: Bearer current_authorization_token_here
Content-Type: application/json

{
  "messageType": "Type of your message",
  "payload": "Message payload in a string form",
  "broadcast": true/false,
  "deviceNumbers": [ "DeviceNumber1", "DeviceNumber2", ... ],
  "groups": [ "GroupName1", "GroupName2", ... ]
}

Вы можете отправить сообщение на несколько устройств, групп, а также на все доступные устройства. Для отправки на все устройства, установите переменной broadcast значение true.

Важно: переменная payload — это не объект, а строка, инкапсулирующая объект JSON. Например, "{\"pkg\": \"com.android.settings\"}".

При успешном выполнении метод возвращает 200 OK, а сообщения отправляются на все указанные устройства.

Получение Push-уведомлений в мобильном приложении

Лаунчер Headwind MDM отправляет полученные с сервера Push-уведомления во все мобильные приложения с помощью Broadcast-сообщения Android. При этом action устанавливается com.hmdm.push.MessageType (MessageType — тип отправляемого сообщения), а extra для ключа com.hmdm.PUSH_DATA содержит строку дополнительных данных.

С целью упрощения кода приложения, для получения Push-уведомлений рекомендуется использовать класс-враппер MDMPushHandler. Имплементация будет выглядет так:

public class MyActivity extends Activity {
    
    private MDMPushHandler pushHandler = new MDMPushHandler() {
        public void onMessageReceived(MDMPushMessage message) {
            Log.d("MyApp", "MDM Push received: type " + message.getType());
            // Do something with message.getData() which is a JSONObject object.
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pushHandler.register("myMessageType", this);
    }

    @Override
    protected void onDestroy() {
        pushHandler.unregister(this);
        super.onDestroy();
    }
}