使用 Node js 将下游消息发送到 google ccs

2024-02-04

我在用节点xmpp https://github.com/node-xmpp/node-xmpp连接到 google gcm ccs 服务器。我跟着连接。现在,每当我收到来自我的 redis 订阅者的消息时,我需要发送一条下游消息(我订阅了一个 redis 频道)redis节点包 https://www.npmjs.org/package/redis)。我的代码如下

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] /cdn-cgi/l/email-protection',
    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 服务器接收消息,但是can not在消息回调中从 Redis 发送下游消息。

我收到以下错误

error
{ name: 'message',
  parent: null,
  attrs: 
   { id: '',
     type: 'error',
     to: '[email protected] /cdn-cgi/l/email-protection/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] } ] }

我尝试打印(随后节点xmpp https://github.com/node-xmpp/node-xmpp/issues/233) 发送前的 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>

正如他们在文档中提到的(请求格式 https://developer.android.com/google/gcm/ccs.html)。我的代码有什么问题?


我遇到过同样的问题。这几乎让我发疯,但最终这只是一个无效的 JSON 格式错误。

我认为 messageData.from 或 messageData.message_id 未转换为正确的 JSON 格式。就我而言,我传递了一个标量,而 JSON.stringify() 没有将其转换为字符串。因此结果是 --> "message_id": 1234 而不是 "message_id": "1234"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Node js 将下游消息发送到 google ccs 的相关文章

  • 删除 json 对象字符串中的“\”

    如何删除下面字符串中的特殊字符 String x message content toom recipients id 1000001865 room subject room 我使用了 x replaceAll 但它不起作用 您必须转义正
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • Mesibo 通话 UI 未更新

    我正在尝试更改 Mesibo Call UI 的配置 但它并没有改变 我尝试如下 MesiboCallConfig mesiboCallConfig new MesiboCallConfig mesiboCallConfig backgro
  • 为 npm install 添加本地项目依赖

    在 npm 中添加本地项目依赖项的正确语法是什么package json file 我本地有 git 项目C projects MyApp 我想得到这个项目npm install 我尝试以下 dependencies my app file
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • 如何更改对话框的默认黑色暗淡背景“颜色”(而不是暗淡量)?

    这是随机显示的图像Dialog在网上找到的 我一直在实施一个自定义Dialog 我可以处理对话框上的几乎所有内容 除了对话框本身下方的默认黑色昏暗背景之外 但在其后面的整个屏幕上 基本上我想改变它color和阿尔法值 我一直在 StackO
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • Android Studio:Android 设备监视器未显示我的设备

    我的真实设备是索尼 Xperia c6502安卓版本4 3 我确定我将其连接到我的计算机然后打开开发者选项 USB调试 on 在 SDK 管理器中 Google USB 驱动程序已安装 I downloaded Xperia Z Drive
  • 将 firebase auth 与 google app engine 云端点集成

    有人可以指定 使用一些示例代码 如何验证谷歌云端点中的 firebase 令牌吗 最近提出的问题根本没有澄清 如何将 Firebase 身份验证与 Google 应用引擎端点集成 https stackoverflow com questi
  • twitter4j => AndroidRuntime(446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken

    我正在尝试使用 twitter4j 我的应用程序来连接并发布到 Twitter 我正在关注本教程 http blog doityourselfandroid com 2011 02 13 guide to integrating twitt
  • Android 26 (O) 通知不显示操作图标 [重复]

    这个问题在这里已经有答案了 随着 Android 26 O 引入通知渠道 我一直在调查 Google 提供的com example android notificationchannels 这个示例按预期工作 直到我尝试添加Action到示
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • 以编程方式应用样式资源

    我没有找到一种以编程方式做到这一点的方法 所以我在这里发布这个问题 我也没有找到与此相关的任何问题 我有一个资源样式 在 res values styles xml 中定义 我想做的是使用 java 将这种样式应用到我正在操作的 View
  • 如何从webkit浏览器中检测Android版本和品牌?

    如何通过webkit浏览器检测Android版本和品牌 可靠吗 我相信你可以检查用户代理 但是 我认为它不安全 因为有很多方法可以用来欺骗用户代理 在谷歌上搜索这个问题给了我们很多答案 它甚至可以在默认浏览器上运行 您只需输入 about
  • 活动组代码示例

    有人可以给我一些使用活动组的示例代码吗 我的应用程序中有一些按钮 我想将活动应用于这些按钮 目前我正在使用 setVisibility 但我被告知活动组将是更好的选择 这是另一个ActivityGroup 示例项目 http richipa
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • SQLiteDatabase.openDatabase 与 SQLiteOpenHelper.getReadableDatabase

    这两种方法有什么区别吗 两者都返回一个打开的 SQLiteDatabase 如果数据库不存在 两者都可以创建数据库 当需要读 写时 SQLiteOpenHelper 还具有 getWriteableDatabase 我应该使用哪种方法以及在
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或

随机推荐

  • 服务如何生成和使用公共和秘密 API 密钥?

    Google Stripe 和许多其他公司都有公共 API 密钥和秘密 API 密钥 生成随机字符串很容易 但我的问题是 如何生成公钥和私钥 存储它们并正确使用它们 公共 API 密钥用于告知用户是谁 秘密用于确认用户的身份 我的流程如下
  • Typescript - React 组件中的“找不到名称”错误

    我正在将现有的 React 代码迁移到 TypeScript 并且遇到了很多问题 其中之一是当我创建我的代码时出现很多 找不到名称 错误 js files ts files 这是有问题的代码 import React from react
  • Windows 7 Websocket PlatformNotSupportedException

    我正在使用 Microsoft Azure Devices Client NuGet 包开发一个应用程序 在 Windows 10 上一切都运行良好 但在 Win7 机器上测试时我遇到了这个聚合异常 System PlatformNotSu
  • 如何在 Homebrew 中符号链接 python?

    由于某种原因 当我运行 brew link python 时 没有符号链接 我收到以下错误 我按照它告诉我的去做 但它不起作用 我已经尝试按照它告诉我的去做 但也许我没有把公式名称放在正确的位置 另外 当我执行 which python 时
  • 如何在 SQL Server 中循环插入多条数据?使用 Node JS 乏味

    我有一个 Node JS 项目 它从数组中获取数据data2 使用此数据创建一个对象myObject使用来自 API 的数据获取let url https 然后将其保存到 SQL Server 中的数据库中 我遇到的问题是我遵循MS Doc
  • 在响应中返回 HttpStatusCode

    有没有一种简单的方法可以为我的 api 返回 HttpStatusCode 我找到了一种稍微更详细的方法来做到这一点 return Response AsJson new object HttpStatusCode NoContent 我已
  • 在ant脚本中连接xml文件

    我是 Ant 脚本的新手 我正在寻找如何将文件夹中的所有 xml 文件连接到 ant 脚本中的单个 xml 文件中 在我的项目中 将在文件夹中动态生成 n 个 xml 文件 例如 server1 xml manager xml server
  • 在 iOS 9 和 10 中支持 NSManagedObject fetchRequest() 类方法

    iOS 10 引入了新的类级别fetchRequest 中的方法NSManagedObject 和许多其他开发人员一样 我在上面创建了自己的扩展NSManagedObject其中有一个fetchRequest 方法 当我尝试构建支持 iOS
  • 对数字进行排序 Objective C

    我有一个字符串数组 我使用该方法对其进行排序 TableViewPopoverList sortUsingSelector selector localizedCaseInsensitiveCompare 这些字符串的第一部分是一个数字 但
  • 执行transact-sql语句或批处理时发生异常

    我不断收到错误消息 执行transact sql语句或批处理时发生异常 当尝试在 SQL Server Management Studio 2016 中执行任何操作时 当我尝试创建或编辑登录名 尝试创建新数据库时 基本上当我执行任何操作时
  • 内容从高度为 100% 的 div 溢出

    当我在 Chrome Firefox 或 IE11 中查看此页面时 我注意到将窗口水平调整到最小宽度会导致文本溢出页面底部的白色背景 div div设置了100 的高度 那不是应该继续匹配页面的高度吗 看起来 100 只匹配窗口的高度 但是
  • 为什么 php 接口中的关键词是abstract和void?

    查看 php 手册站点上的 SplSubject 接口并注意到 SplSubject Methods abstract public void attach SplObserver observer abstract public void
  • JRXML 中的多个页面使用 iReport 进行多页报告

    我只是想知道iReport JRXML是否支持多页报表 如果有的话 可以给一些参考样品吗 我并不是要求一份随着数据增长而增长的报告 我有一份静态报告 其中包含多个页面需要处理 每个页面都有不同的页眉 页脚和内容 只是他们需要成为一个单一的一
  • 如何在 Asp.Net Core 6 中从 Secrets.json 获取 ConnectionString?

    我是 Asp Net Core 和 EF 的新手 我正在从数据库端开发一个简单的 CRUD 使用Secrets json文件来隐藏我的连接字符串凭据 但我不知道如何使用 AddDbContext 引用该文件 到目前为止我的代码 public
  • 如何在 Jetpack Compose 中减慢 AnimateScrollToItem 的速度?

    我有一个惰性列表 单击按钮时我将动画滚动到项目 onClick scope launch lazyListState animateScrollToItem selectedIndex 为什么 animateScrollToItem 这么快
  • 使用 pdfkit for python 生成目录

    问题摘要 我无法让目录生成器在 Python 的 pdfkit 中工作 我尝试过的 传递参数toc 我当前的代码 toc xsl style sheet toc xsl pdfkit from file book html filename
  • 从矩阵中提取一系列连续向量

    我有一个大矩阵 为了简化起见 gt mat matrix c 1 50 ncol 5 gt mat 1 2 3 4 5 1 1 11 21 31 41 2 2 12 22 32 42 3 3 13 23 33 43 4 4 14 24 34
  • 为什么 v-model 不能与数组和 v-for 循环一起使用?

    我有一个自定义选择组件 它适用于一个简单的变量 但与 v for 一起使用时它将不起作用 https jsfiddle net 7gjkbhy3 19 https jsfiddle net 7gjkbhy3 19
  • 如何使用 IHttpClientFactory 刷新令牌

    我使用 IHttpClientFactory 使用 Net Core 2 2 发送请求并从两个外部 API 接收 HTTP 响应 我正在寻找一个好的策略来使用已存储在 appsettings json 中的刷新令牌来获取新的访问令牌 当当前
  • 使用 Node js 将下游消息发送到 google ccs

    我在用节点xmpp https github com node xmpp node xmpp连接到 google gcm ccs 服务器 我跟着连接 现在 每当我收到来自我的 redis 订阅者的消息时 我需要发送一条下游消息 我订阅了一个