- Пара способов отправить уведомления на смартфон со своего сервера
- 1. Регистрируемся в Firebase
- 2. Настраиваем Firebase
- 3. Настройка приложения Android на приём уведомлений.
- 4. Отправляем уведомление со своего сервера
- Протокол первого поколения — Legacy HTTP
- Протокол второго поколения — (Modern) HTTP v1.
- Бонус, дополнительные параметры для уведомлений:
- Заключение
- Создание сервера push-уведомлений для устройств Android
- Требования
- Что такое push-уведомления?
- 1: Создание проекта Google API
- 2: Включение Google Cloud Messaging
- 3: Настройка приложения Android
- 4: Развертывание сервера
- 5: Создание простого сервера Python GCM
- 6: Рассылка Push-уведомлений
- Устранение неполадок
- Заключение
Пара способов отправить уведомления на смартфон со своего сервера
В этом туториале я рассмотрю пошагово, как отправлять со своего сервера уведомления на свой (или не свой) смартфон, какие средства для этого понадобятся. Эти способы универсальны и подойдут для любого языка программирования, т.к. напрямую используют API гугла, без использования библиотек. Отправить можно на смартфоны с Android, iOS и в браузеры с поддержкой Push API (на сегодня это Chrome, Firefox и их производные).
В общем всем тем, кто давно хотел отправлять уведомления со своего домашнего сервера на свой смартфон, но не знал с чего начать, посвящается.
Немного истории. В начале (с версии андроида 2.2) у гугла для доставки использовалась система C2DM (Android Cloud to Device Messaging), начиная с июня 2012 для этого стали предлагать использовать GCM (Google cloud messaging).
В настоящее время используется универсальная платформа Firebase, которая помимо доставки уведомлений имеет ещё много всяких других возможностей. Firebase тоже успела эволюционировать и протокол первого поколения уже считается устаревшим и для доставки сообщений рекомендуется использовать протокол второго поколения.
Технически, уведомления отправляются с сервера не напрямую в смартфон, а на некий промежуточный сервер, на котором при необходимости хранятся до 4-х недель (настраиваемо), и по возможности отправляются получателю. Т.е. если смартфон находится оффлайн, сервер ждёт. Как только появляется возможность — отправляет.
1. Регистрируемся в Firebase
Для регистрации в Firebase понадобится учётка гугла.
Жмём «Перейти к консоли».
Затем «Добавить проект».
Вводим название проекта. Рекомендую в диапазоне 8-16 символов.
Выбираем страну. Жмём «Создать проект».
2. Настраиваем Firebase
Прокручиваем до блока «Notifications», жмём «Начать».
Вам предложат выбрать приложение, для которого ваши уведомления будут отправляться.
Шаги для Andriod-приложения:
Шаг 1 — Вводим название проекта на Andriod.
Жмём «Зарегистрировать приложение».
Шаг 2 — Жмём «Скачать google-services.com».
Добавляем скачанный файл конфигурации в проект, рядом с файлом build.gradle (тем, который персональный для приложения).
Жмём «Продолжить».
После настройки приложения, можно сразу протестировать работает ли связь отправив тестовое сообщение (нет нельзя, у нас ещё нет ID клиента, куда слать).
3. Настройка приложения Android на приём уведомлений.
Важное примечание: некоторые оболочки, например MIUI, могут блокировать уведомления, если приложение не запущено или не висит в фоне. Делается это якобы для экономии заряда батареи.
Грубо говоря, отправлять можно два вида уведомлений:
— уведомление по запросу,
— уведомление с полезной нагрузкой.
У них разные способы взаимодействия с приложением.
Уведомление по запросу выведет уведомление в области уведомлений, но только в случае если приложение свёрнуто. При тапе пользователя оно откроет заранее выбранную (при отправке) активити приложения, и передаст бандлом экстра-параметры.
Уведомление с полезной нагрузкой требует наличия в приложении пары служб, в которые и передаётся управление, но на длительность не дольше 10 секунд.
Ниже приведён пример службы, которая отвечает за генерацию ID клиента.
И пример кода службы, принимающей сообщения. Приложение должно быть запущено, или висеть в фоне, иначе не гарантируется приём сообщений. Некоторые оболочки, например MIUI, в целях экономии, режут всё подряд, в том числе привелегии фоновых служб.
не забудьте прописать службы в манифесте.
ID клиента генерируется на устройстве, но вы сами выбираете способ доставки этого ID к себе на сервер.
Вот теперь можно протестировать, отправив тестовое сообщение из консоли.
4. Отправляем уведомление со своего сервера
Существует несколько способов обмена данными с сервером Firebase. Мы рассмотрим два способа обмена по протоколу HTTP.
Протокол первого поколения — Legacy HTTP
Понадобится ключ. Жмём на гайку, выбираем «Настройки проекта».
Вкладка «Cloud Messaging».
Копируем «Устаревший ключ сервера».
Здесь в поле «to» надо подставить ID клиента. В http заголовок «Authorization: key=» подставить «Устаревший ключ сервера».
Протокол второго поколения — (Modern) HTTP v1.
(источник: developers.google.com/identity/protocols/OAuth2ServiceAccount)
Не спрашивайте, почему вторая версия протокола называется V1, видимо первая считалась бетой и носила нулевой номер.
Я не углублялся в подробности, но так понимаю этот протокол более универсальный и имеет более широкие возможности, чем просто отправка уведомлений.
‘; // — parse answer JSON (lame) — // $line = explode(«\r\n», $receive); if ($line[0] != ‘HTTP/1.1 200 OK’) die($line[0]); $pos = FALSE; if (($pos = strpos($receive, «\r\n\r\n», 0)) !== FALSE ) < if (($pos = strpos($receive, "<", $pos+4)) !== FALSE ) < if (($pose = strpos($receive, ">«, $pos+1)) !== FALSE ) < $post = substr($receive, $pos, ($pose - $pos+1) ); $aw = json_decode($post, TRUE); $access_token = $aw['access_token']; >else die(‘> not found.’); > else die(‘ < not found.'); >else die(‘\r\n\r\n not found.’); // — шаг 3. отправляем запрос на Firebase сервер — // $socket = @fsockopen(‘ssl://fcm.googleapis.com’, 443, $errno, $errstr, 10); if (!$socket) die(‘error: remote host is unreachable.’); $payload = ‘ < "message":< "token" : "cGAFgPJGf-s:APA91bF**. **aEVM17c9peqZ", "notification" : < "title" : "Заголовок сообщения", "body" : "(Modern API) Моё первое сообщение через Firebase!" >> >’; // или $payload = ‘ < "message": < "token" : "cGAFgPJGf-s:APA91bF**. **aEVM17c9peqZ", "data":< "val1" : "Заголовок сообщения", "val2" : "(Modern API) Моё первое сообщение через Firebase!", "val3" : "дополнительные данные" >> >’; $send = »; $send .= ‘POST /v1/projects/pyur-test-id/messages:send HTTP/1.1’.»\r\n»; $send .= ‘Host: fcm.googleapis.com’.»\r\n»; $send .= ‘Connection: close’.»\r\n»; $send .= ‘Content-Type: application/json’.»\r\n»; $send .= ‘Authorization: Bearer ‘.$access_token.»\r\n»; $send .= ‘Content-Length: ‘.strlen($payload).»\r\n»; $send .= «\r\n»; $send .=$payload; $result = fwrite($socket, $send); $receive = »; while (!feof($socket)) $receive .= fread($socket, 8192); fclose($socket); echo »; ?>
по адресу console.firebase.google.com/project/poject-id/settings/serviceaccounts/adminsdk надо скопировать «Сервисный аккаунт Firebase» и подставить в переменную «$JWT_claim_set», в поле «iss».
Жмём «Создание закрытого ключа»
Создаём ключ, сохраняем, никому не показываем. В скачанном файле будет содержаться «Закрытый ключ», его подставляем в переменную «$private_key».
Хинт: токен, полученный в шагах 1 и 2 можно и нужно кешировать в локальном временном хранилище, например файле, или базе данных. И только по истечении времени (по умолчанию один час), запрашивать у сервера авторизации следующий токен.
Важно! Перед использованием Modern Http API необходимо явно разрешить его использование здесь: console.developers.google.com/apis/library/fcm.googleapis.com/?project=your-project
Бонус, дополнительные параметры для уведомлений:
sound — либо «default», либо имя ресурса в приложении. Должен располагаться в «/res/raw/». Формат MP3, AAC или ещё чего подходящее.
icon — меняет иконку уведомления. Должна храниться в «drawable» приложения. Если отсутствует, FCM будет использовать иконку приложения (указанную как «launcher icon» в манифесте приложения).
tag — Следует использовать для группировки однотипных уведомлений. Новые уведомления будут выводиться поверх уже имеющихся с таким же тегом.
color — цвет иконки, задаётся как «#rrggbb» (у меня в MIUI не заработало)
click_action — запускаемое активити, при нажатии пользователем на уведомлении.
Заключение
В будущем API вероятно будет изменяться, объявляться depricated и т.п. Поэтому сегодня думаю стоит делать сразу на протоколе HTTP v1.
Мне будет интересно почитать в комментариях оригинальные способы применения уведомлений, помимо новых сообщений из вконтактика. К примеру у меня настроен мониторинг вентиляторов ардуиной, и если они остановятся, отправляется уведомление.
Да, я в курсе, что существует Zabbix и т.п., но тема статьи — домашние сервера, и прочие умные дома. Считаю системы корпоративного класса перебором в любительских поделках.
Источник
Создание сервера push-уведомлений для устройств Android
Push-уведомления позволяют приложениям Android сообщать пользователю о событиях, даже если пользователь не использует приложение. Целью данного руководства является настройка рассылки простых push-уведомлений приложения. Для достижения этой цели используются Ubuntu 14.04 и Python 2.7, а также Google Cloud Messaging в качестве сервиса push-уведомлений.
Требования
Чтобы следовать руководству, нужны:
- Приложение Android (полезную информацию можно найти на сайте проекта);
- Выделенный сервер Ubuntu 14.04;
- IP-адрес виртуального выделенного сервера.
Что такое push-уведомления?
Предоставляемые Google серверы соединения GCM принимают сообщения от стороннего сервера приложений (например, от виртуального выделенного сервера), и передают эти сообщения приложениям Android с поддержкой GCM (то есть, клиентскому приложению). В настоящее время Google предоставляет такие серверы соединения для HTTP и XMPP.
Другими словами, для отправки push-уведомлений виртуальный выделенный сервер должен взаимодействовать с сервером Google. Выделенный сервер отправляет сообщение на сервер GCM (Google Cloud Messaging), затем последний ставит в очередь и запоминает сообщение, после чего отправляет его на устройство Android, когда оно находится в режиме онлайн.
1: Создание проекта Google API
Чтобы включить поддержку GCM, нужно для нала создать проект Google API:
Откройте консоль Google Developers Console. При этом будет предложено указать некоторую информацию.
Нажмите кнопку Create Project. Укажите имя проекта, а затем нажмите Create.
Создание нового проекта займет несколько секунд. Обратите внимание на Project ID и Project Number в верхней части экрана.
Запишите Project Number – он еще пригодится при настройке клиента приложения Android.
2: Включение Google Cloud Messaging
Убедитесь, что в Google Developers Console все еще выбран только что созданный проект. В левой панели выберите APIs & auth, затем – APIs.
В появившемся списке интерфейсов включите тумблер Google Cloud Messaging for Android и примите условия обслуживания.
Теперь Google Cloud Messaging for Android появится в списке включенных API данного проекта.
Снова выберите APIs & auth в левом меню, затем – Credentials.
Под Public API access нажмите на Create new Key и выберите Server key. Укажите IP-адрес сервера. Затем нажмите кнопку Create. Скопируйте API KEY – позже его нужно будет ввести на вашем сервере.
3: Настройка приложения Android
Чтобы протестировать отправку push-уведомлений, нужно соединить приложение Android с только что созданным проектом Google API.
Примечание: пользователи, недостаточно хорошо знакомые с разработкой приложений Android, могут обратиться к официальному руководству по созданию клиента GCM.
Официальный исходный код можно загрузить со страницы gcm.
Имейте в виду, исходный код не является обновлением, потому нужно отредактировать файл Gradle:
В main activity поместите строку:
String SENDER_ID = «YOUR_PROJECT_NUMBER_HERE»;
Замените выделенную фразу значением Project Number проекта Google API.
При регистрации устройства на GCM оно получает регистрационный ID, который пригодится для дальнейшей проверки. Чтобы получить его, просто измените эти строки в основном файле:
Поле запуска приложения откройте logcat и скопируйте regid, который выглядит примерно так:
=======================================
10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UJY0KNqpL4EUXTWOm0RxccxpMk
10-04 17:21:07.102 7550-7550/com.pushnotificationsapp.app E/==========================﹕ =======================================
4: Развертывание сервера
Разверните сервер Ubuntu 14.04, который будет использоваться в качестве стороннего сервера приложений.
Как уже говорилось, серверы GCM принимают сообщения от стороннего сервера приложений (в данном случае – от выделенного сервера Ubuntu 14.04) и отправляют их приложениям Android. Google предоставляет серверы для HTTP и CCS (XMPP); данное руководство сфокусировано на HTTP.
- взаимодействует с клиентом;
- отправляет правильно отформатированные запросы серверу GCM;
- обрабатывает запросы и пересылает их по мере необходимости с помощью экспоненциального отката;
- хранит ключ API и идентификаторы регистрации клиента. Ключ API включен в заголовок POST-запросов, которые отправляют сообщения;
- создает уникальные идентификаторы для каждого отправляемого сообщения.
Клиент будет взаимодействовать с сервером, отправляя регистрационный номер устройства (который нужно хранить и использовать при отправке уведомления). Управлять клиентом очень просто; кроме того, GCM поможет в этом, отправляя сообщения об ошибках, в случае если регистрационный ID является недействительным.
5: Создание простого сервера Python GCM
Войдите на сервер как пользователь с расширенными привилегиями. Обновите список пакетов:
sudo apt-get update
Установите пакеты Python:
sudo apt-get install python-pip python-dev build-essential
Установите python-gcm (подробнее здесь):
sudo pip install python-gcm
Создайте новый файл Python в любой удобной точке системы, например:
Внесите следующую информацию в файл, заменив значения, выделенные красным (разбор конфигураций можно найти ниже):
from gcm import *
gcm = GCM(» AIzaSyDejSxmynqJzzBdyrCS-IqMhp0BxiGWL1M «)
data = <'the_message': 'You have x new friends', 'param2': 'value2'>
reg_id = ‘ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UxxxqpL4EUXTWOm0RXE5CrpMk ‘
gcm.plaintext_request(registration_id=reg_id, data=data)
Данные конфигурации выполняют следующее:
- from gcm import *: импортирует клиента Python в Google Cloud Messaging.
- gcm: в эту строку нужно внести API KEY проекта Google API; убедитесь, что IP сервера разрешен.
- reg_id: укажите regid приложения Android.
6: Рассылка Push-уведомлений
Запустите следующую команду, чтобы выполнить тестовую отправку уведомления:
Это займет около 10 секунд. Устройство Android должно получить уведомление.
Устранение неполадок
Если уведомление не пришло на устройство в течение 10 секунд, проверьте:
- подключен ли смартфон/планшет к интернету;
- правильно ли указан ключ проекта;
- правильно ли указан regid приложения;
- внесен ли IP в ключ Google API;
- подключен ли сервер к интернету.
Если даже после этого уведомление не приходит, вероятно, проблема в приложении. Проверьте logcat на наличие ошибок.
Заключение
Протестировав рассылку push-уведомлений, можете разослать их всем пользователям приложения.
Примечание: если CGM сообщает «invalid ID», удалите его из базы данных.
Источник