SMPP 发送消息在 PDU 中收到不同的结果 - 结果混淆

SMPP send Message received different result in PDU - Confuse In Results

在 Nodejs 中实现 使用 node-smpp library and Selenium SMPPSim Simulator

const smpp = require('smpp');
const session = new smpp.Session({host: 'localhost', port: 1234});

session.on('connect', () => {
    isConnected = true;
    session.bind_transceiver({
        system_id: "SYSTEMID",
        password: "PASSWORD",
    }, (pdu) => {
        if (pdu.command_status == 0) {
            console.log('smpp connected !')
        }
    })
})


//**all pdu listener**
session.on('pdu', (pdu)=>{
    console.log(pdu)
})


function sendMessage(from, to, text){

    from = `+${from}`
    to = `+${to}`

    session.submit_sm({
        source_addr:      from,
        destination_addr: to,
        short_message:    text
    }, function(pdu) {
        console.log(pdu)
        if (pdu.command_status == 0) {
            console.log(pdu.message_id);
        }
    });
}

sendMessage("1111", "2222", "Hello World!")

sendMessage()方法调用时的输出:

PDU {
  command_length: 18,
  command_id: 2147483652,
  command_status: 0,
  sequence_number: 2,
  command: 'submit_sm_resp',
  message_id: '3' }

这里我使用的是 SMPPSim MO 注射表格 输出:当 消息发送到 selenium 模拟器时 :

PDU {
  command_length: 63,
  command_id: 5,
  command_status: 0,
  sequence_number: 8,
  command: 'deliver_sm',
  service_type: '',
  source_addr_ton: 1,
  source_addr_npi: 1,
  source_addr: '111111',
  dest_addr_ton: 1,
  dest_addr_npi: 1,
  destination_addr: '222222',
  esm_class: 0,
  protocol_id: 0,
  priority_flag: 0,
  schedule_delivery_time: '',
  validity_period: '',
  registered_delivery: 0,
  replace_if_present_flag: 0,
  data_coding: 0,
  sm_default_msg_id: 0,
  short_message: { message: 'Hello from SMPPSim' } }

混淆了两种结果,如果使用 sendMessage() 方法发送消息,那么为什么它只返回 submit_sm_resp,是因为本地机器吗?或者是其他东西 ?? 需要帮助来理解这种行为。

我不熟悉 node-smpp 或 Selenium SMPPSim 模拟器,但它们仍然使用 SMPP 协议。

来自 "sendMessage()" 的第一个输出是 submit_sm_resp,这是调用 submit_sm 时预期的结果。

但是您提供的第二个回复似乎并不常见。根据 SMPP 协议发现 here 我没有看到任何响应类型 return 您列出的所有字段。

Selenium 可能会将一些参数作为 TLV(标记长度值)参数发送,或者他们只是 return 你在他们这边建立了一些扩展数据集。他们的文档或源代码可能会提供更多信息(如果有的话)。

附带说明一下,不要指望第 3 方提供商 (ESME) 或短消息服务中心 (SMSC) 的 SMPP 协议的一致性。即使当我直接集成到 4 个蜂窝服务提供商时,它们之间也存在需要定制开发的小差异。

你说的是 2 个不同的命令。

您的 sendMessage() 方法发送一个 SMPP submit_sm ... 您从模拟器收到一个 submit_sm_resp。

从模拟器中注入 MO 转化为从模拟器发送到您的应用程序的 deliver_sm。

submit_sm 仅从 smpp 客户端(您)发送到服务器(smsc/simulator) deliver_sm 仅从 smpp 服务器(smsc/simulator)发送到客户端(您)

sumbit_sm_resp 仅包含这些参数是完全正常的。对于你的submit_sm,它只是一个ACK/NACK。 同样,当 SMSC 向您发送 deliver_sm 时,您将回复 deliver_sm_resp.