用例:Android设备无法直接联系Ruby On Rails服务器(它位于防火墙后面),我也无法使用Internet服务器直接接收请求。我需要有一个内部Rails服务器来从Android设备中检索消息,我已经看到GCM+XMPP非常适合,而不是池策略。
但是,我找不到任何关于如何在Ruby/Rails中编写这样的场景的信息。
我如何不仅从我的Ruby On Rails服务器发送推送通知,而且从GCM接收上游消息(谷歌云消息)将我的Ruby On Rails服务器连接到谷歌CCS服务器
- 对于Upstream,消息源自Android设备,这不是问题的范围
- 我知道我必须使用XMPP
- 我知道有一些ruby gems可以将推送通知从rails服务器发送到Android设备,但它们都是基于HTTP的(至少,我所看到的),不能满足我的需要
- 我知道Rails服务器会保持与谷歌CCS服务器(GCM云连接服务器)的连接打开(XMPP),以接收上游消息
- 我知道XMPP4r-gem,但找不到足够的代码示例将其与Rails集成
感谢您的帮助。
日志(或我迄今为止所做的…)
-
2015年12月17日:试着把这篇文章作为一个起点。我在谷歌控制台上创建了一个项目,并添加了一个服务器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"}}
CCS(GCM的XMPP服务器)将位于Android客户端和ruby服务器之间。一旦您的ruby服务器能够建立到CCS的XMPP连接,那么就不需要发生任何特殊的事情来将消息从客户端传递到服务器,反之亦然。ruby服务器将负责向CCS发送消息和从CCS接收消息。