GCM + XMPP + восходящие сообщения + Ruby on Rails
Вариант использования: устройства Android не могут напрямую связываться с сервером Ruby On Rails (он находится за брандмауэром), и у меня не может быть интернет-сервера для непосредственного приема запросов. Мне нужен внутренний сервер Rails для получения сообщений с Android-устройств, и вместо стратегии объединения я видел, что GCM + XMPP идеально подходит.
Но я не смог найти никакой информации о том, как кодировать такой сценарий в Ruby/Rails.
Как я могу не только отправлять push-уведомления с моего сервера Ruby On Rails, но и получать восходящие сообщения от GCM (Google Cloud Messaging), соединяющего мой сервер Ruby On Rails с серверами Google CCS?
- для апстрима сообщения отправляются с устройства Android, что не является вопросом вопроса
- Я знаю, что я должен использовать XMPP для этого.
- Я знаю, что существуют рубиновые гемы для отправки push-уведомлений с серверов rails на устройства Android, но все они основаны на HTTP (по крайней мере, все, что я видел) и не могут делать то, что мне нужно
- Я знаю, что сервер Rails будет держать соединение открытым (XMPP) с серверами CCS Google (GCM Cloud Connection Server) для получения вышестоящих сообщений
- Я знаком с гемом XMPP4r, но не могу найти достаточно примеров кода для его интеграции с Rails
Любая помощь приветствуется.
Журнал (или что я сделал до сих пор...)
17.12.15: Попытка использовать этот пост в качестве отправной точки. Я создал проект на консоли Google и добавил ключ API сервера, также включил API
Google Cloud Messaging for Android
, Я проверил с этим кодом (на основе этого сообщения в блоге), и пока он выполняется без ошибок:require 'stella_gcm_xmpp' id = '[project_number]@gcm.googleapis.com' password = [API_KEY] gcm = StellaGcmXmpp.new(id, password, true, true) gcm.connect gcm.callback
Тест восходящего сообщения
Клиентская сторона (выходит за рамки вопроса, для полноты картины):
$ ionic start gcm-test
$ ionic platform add android
$ ionic plugin install cordova-plugin-chrome-apps-gcm
$ ionic run android
open Chrome-Dev-Tools console:
> chrome.gcm.register( ['2195xxxxx718'], function(regId) { console.log('regId:' + regId); } )
> regId:APA91bG_5QIpVrBvuooVp7xO...KiVt3ozcf2HKIkHq_42UAPAU4w
> chrome.gcm.send( {destinationId: '2195xxxxx718@gcm.googleapis.com', messageId: '111', timeToLive: 10, data: {my: 'my message'} }, function(messageId) { console.log(messageId); } )
> 8
Сторона сервера
проверьте получение вышестоящего сообщения на консоли Ruby (irb):
D, [2015-12-18T10:09:05.664007 #4019] DEBUG -- : RECEIVED:
<message from='devices@gcm.googleapis.com' to='2195xxxxx718@gcm.googleapis.com' type='normal'><gcm xmlns='google:mobile:data'>{"data":{"my":"my message"},"time_to_live":86400,"from":"APA91bG_5QIpVrBvuooVp7xOos_EYzA4XNH0CeGzVudbJXxW4avE4NpZO84Q3mC2I-FKAGMTfFdGumSGmkUYViZVwp5gbbC38NDS4GWyaIsABJfhZd3J5KMJBLKgah6lC4LwkbLHKiVt3ozcf2HKIkHq_42UAPAU4w","message_id":"8","category":"com.ionicframework.gcmtest908063"}</gcm></message>
D, [2015-12-18T10:09:05.665623 #4019] DEBUG -- : PROCESSING:
<message from='devices@gcm.googleapis.com' to='2195xxxxx718@gcm.googleapis.com' type='normal' xmlns='jabber:client'><gcm xmlns='google:mobile:data'>{"data":{"my":"my message"},"time_to_live":86400,"from":"APA91bG_5QIpVrBvuooVp7xOos_EYzA4XNH0CeGzVudbJXxW4avE4NpZO84Q3mC2I-FKAGMTfFdGumSGmkUYViZVwp5gbbC38NDS4GWyaIsABJfhZd3J5KMJBLKgah6lC4LwkbLHKiVt3ozcf2HKIkHq_42UAPAU4w","message_id":"8","category":"com.ionicframework.gcmtest908063"}</gcm></message> (Jabber::Message)
D, [2015-12-18T10:09:05.665760 #4019] DEBUG -- : TRYING stanzacbs...
D, [2015-12-18T10:09:05.665859 #4019] DEBUG -- : TRYING message/iq/presence/cbs...
[2015-12-18 10:09:05] GCM send Failed id: 8 error:
*The 'GCM send Failed id: 8 error:' occurs not because of an error, but because message-type is empty*
Тест сообщений в нисходящем направлении (выходит за рамки вопроса, для полноты картины)
Сторона клиента
chrome.gcm.onMessage.addListener(function(msg) { console.log('msg: ' + JSON.stringify(msg)) } )
Сторона сервера
gcm.send 'APA91bG_5QIpVrBvuooVp7x...kHq_42UAPAU4w', '999', { msg: 'teste' }
Сторона клиента
msg: {"data":{"msg":"teste"}}
1 ответ
CCS (XMPP-сервер GCM) будет находиться между вашими клиентами Android и вашим сервером ruby. Как только ваш сервер ruby сможет установить XMPP-соединение с CCS, ничего особенного не должно происходить для доставки сообщений от клиента к серверу и наоборот. Сервер ruby будет отвечать за отправку и получение сообщений в и из CCS.