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