2014-03-24 72 views
9

我使用node-xmpp連接到谷歌gcm ccs服務器。我跟着from gcm google groups來連接。現在我需要發送下行消息,只要我收到來自我的redis訂閱者的消息(我訂閱了redis頻道redis node package)。我的代碼如下發送下游消息到谷歌ccs與節點js

var gearmanode = require('gearmanode'); 
var redis = require("redis"); 
var xmpp = require('node-xmpp'); 

var gearJob; 
var redisSubChan = 'test_channel'; 
var gearmanJobName = 'reverse'; 
var jobPayload; 
var redisClient; 
var xmppClient; 
var gearClient; 

gearClient = gearmanode.client(); 

var options = { 
    type: 'client', 
    jid: '[email protected]', 
    password: 'myserverkey', 
    port: 5235, 
    host: 'gcm.googleapis.com', 
    legacySSL: true, 
    preferredSaslMechanism: 'PLAIN' 
}; 

console.log('creating xmpp app'); 

xmppClient = new xmpp.Client(options); 

xmppClient.connection.socket.setTimeout(0) 
xmppClient.connection.socket.setKeepAlive(true, 10000) 

redisClient = redis.createClient(); 
redisClient.subscribe(redisSubChan); 

redisClient.on("message", function(channel, message) { 
    console.log('received message'); 
    console.log(message); 
    message = JSON.parse(message); 
    //send the messages to google ccs server via xmpp 
    var payload = { 
     "to": message.to, 
     "message_id": message.message_id, 
     "data": message.data, 
     "time_to_live": message.time_to_live, 
     "delay_while_idle": message.delay_while_idle 
    }; 
    var jsonPayload = JSON.stringify(payload); 
    console.log(jsonPayload); 

    var ackToDevice = new xmpp.Element('message', {'id': ''}).c('gcm', {xmlns: 'google:mobile:data'}).t(jsonPayload); 
    console.log('prepared message'); 
    console.log(ackToDevice.root().toString()); 
    xmppClient.send(ackToDevice); 
    console.log('sent!!!'); 
}); 

xmppClient.on('online', function() { 
    console.log("online"); 
}); 

xmppClient.on('connection', function() { 
    console.log('online'); 
}); 

xmppClient.on('stanza', 
     function(stanza) { 
      if (stanza.is('message') && stanza.attrs.type !== 'error') { 
       // Best to ignore an error 
       console.log("Message received"); 
       //Message format as per here: https://developer.android.com/google/gcm/ccs.html#upstream 
       var messageData = JSON.parse(stanza.getChildText("gcm")); 

       if (messageData && messageData.message_type != "ack" && messageData.message_type != "nack") { 

        var ackMsg = new xmpp.Element('message', {'id': ''}).c('gcm', {xmlns: 'google:mobile:data'}).t(JSON.stringify({ 
         "to": messageData.from, 
         "message_id": messageData.message_id, 
         "message_type": "ack" 
        })); 
        //send back the ack. 
        xmppClient.send(ackMsg); 
        console.log("Sent ack"); 
        //receive messages from ccs and give it to PHP workers 
        gearClient.submitJob(gearmanJobName, JSON.stringify(messageData), {background: true}); 

       } else { 
        //Need to do something more here for a nack. 
        console.log("message was an ack or nack...discarding"); 
       } 

      } else { 
       console.log("error"); 
       console.log(stanza); 
      } 

     }); 

xmppClient.on('authenticate', function(opts, cb) { 
    console.log('AUTH' + opts.jid + ' -> ' + opts.password); 
    cb(null); 
}); 

xmppClient.on('error', function(e) { 
    console.log("Error occured:"); 
    console.error(e); 
    console.error(e.children); 
}); 

我能夠從CCS服務器接收郵件,但不能從Redis的發送下行消息的消息回調。

我收到以下錯誤

error 
{ name: 'message', 
    parent: null, 
    attrs: 
    { id: '', 
    type: 'error', 
    to: '[email protected]/8DF23ED7', 
    'xmlns:stream': 'http://etherx.jabber.org/streams' }, 
    children: 
    [ { name: 'gcm', 
     parent: [Circular], 
     attrs: [Object], 
     children: [Object] }, 
    { name: 'error', 
     parent: [Circular], 
     attrs: [Object], 
     children: [Object] } ] } 

我試圖打印(其次node xmpp)的XMPP節在發送之前和它相同的

//日誌我的消息的

<message id=""><gcm xmlns="google:mobile:data">{"to":"APA91bHIGZcbePZ-f1jSyWQkBAJMHorHJiwgtN1GWITzcHf6uyVOZ3k7AasUiB-vBix32ucSypin3xDTYmoxqSc_ZmTDTuKjuDQ8BPQLpC41SqYRimm-hn34ZjSAF4uQO0OP1LSbqUxjh2WF0K5n4KyD3-Vn8ghASQ","message_id":84,"data":{"test":"sample data to send"},"time_to_live":0,"delay_while_idle":false}</gcm></message> 

as他們在文檔中提到(Request format)。我的代碼有什麼問題?

+0

請顯示完整的錯誤消息,[Object]和[Circular]實體背後是什麼? – vitalyster

+0

現在它使用相同的代碼。不知道爲什麼? –

回答

0

快速回答是,如果沒有將項目列入白名單,就不能使用CCS(XMPP)。如果您嘗試使用smack庫,則會出現錯誤,指出您的項目未被列入白名單。

+0

我的項目被列入白名單,並且ccs也發送上游消息。 –

1

我有同樣的問題。它幾乎使我瘋狂,但最終它只是一個無效的JSON格式錯誤。

我想messageData.from或messageData.message_id沒有轉換爲正確的JSON格式。在我的情況下,我傳遞了一個標量,JSON.stringify()沒有將它轉換爲字符串。因此,結果是 - >「message_id」:1234而不是「message_id」:「1234」