android - send downstream message to google ccs with node js -
i using node-xmpp connect google gcm ccs servers. followed from gcm google groups connect. need send downstream message whenever receive message redis subscriber(i subscribed redis channel redis node package). code follows
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: 'myid@gcm.googleapis.com', 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 messages 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 ignore error console.log("message received"); //message format 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 ack. xmppclient.send(ackmsg); console.log("sent ack"); //receive messages ccs , give php workers gearclient.submitjob(gearmanjobname, json.stringify(messagedata), {background: true}); } else { //need more here nack. console.log("message 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); });
i able receive messages ccs server can not send downstream message redis on message callback.
i following error
error { name: 'message', parent: null, attrs: { id: '', type: 'error', to: '1026645507924@gcm.googleapis.com/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] } ] }
i tried print(followed node xmpp) xmpp stanza before sending , same
//log of message
<message id=""><gcm xmlns="google:mobile:data">{"to":"apa91bhigzcbepz-f1jsywqkbajmhorhjiwgtn1gwitzchf6uyvoz3k7aasuib-vbix32ucsypin3xdtymoxqsc_zmtdtukjudq8bpqlpc41sqyrimm-hn34zjsaf4uqo0op1lsbquxjh2wf0k5n4kyd3-vn8ghasq","message_id":84,"data":{"test":"sample data send"},"time_to_live":0,"delay_while_idle":false}</gcm></message>
as mentioned in documentation(request format). wrong code ?
i had same issue. drove me crazy in end invalid json format error.
i suppose messagedata.from or messagedata.message_id wasn't converted correct json format. in case passed scalar , json.stringify() didn't converted string. hence result --> "message_id": 1234 , not "message_id": "1234"
Comments
Post a Comment