2014-03-24 6 views
9

Ich benutze node-xmpp, um eine Verbindung zu google gcm ccs Server. Ich folgte dem from gcm google groups, um zu verbinden. Jetzt muss ich eine Downstream-Nachricht senden, wenn ich eine Nachricht von meinem Redis-Abonnenten (ich abonnierte einen Redis-Kanal redis node package). Mein Code ist wie folgtsenden Sie nachgelagerte Nachricht an Google ccs mit Knoten 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); 
}); 

Ich bin in der Lage, die Nachrichten von ccs-Server zu empfangen, aber kann nicht die Downstream-Nachricht von redis auf Nachricht Rückruf senden.

bekomme ich folgende Fehler

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] } ] } 

ich zu drucken versucht (gefolgt node xmpp) die xmpp Strophe vor dem Senden und seine gleichen

// log meiner Nachricht

<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> 

als sie erwähnten in der Dokumentation (Request format). Was ist falsch an meinem Code?

+0

Bitte vollständige Fehlermeldung anzeigen, was steht hinter [Object] und [Circular] entities? – vitalyster

+0

Jetzt funktioniert es mit dem gleichen Code. Nicht sicher warum ? –

Antwort

0

Die schnelle Antwort ist, dass Sie CCS (XMPP) nicht verwenden können, ohne Ihr Projekt auf die weiße Liste gesetzt zu haben. Wenn Sie stattdessen die Smack-Bibliothek verwenden, erhalten Sie eine Fehlermeldung, dass Ihr Projekt nicht auf die weiße Liste gesetzt wurde.

+0

mein Projekt ist auf der weißen Liste und ccs sendet die Upstream-Nachrichten auch. –

1

Ich hatte das gleiche Problem. Es hat mich fast verrückt gemacht, aber am Ende war es nur ein ungültiger JSON Formatfehler.

Ich nehme an, MessageData.from oder messageData.message_id wurde nicht in das richtige JSON-Format konvertiert. In meinem Fall habe ich einen Skalar übergeben und JSON.stringify() hat ihn nicht in einen String konvertiert. Daher war das Ergebnis -> "message_id": 1234 und nicht "message_id": "1234"

Verwandte Themen