Как это работает?
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(); } }