node-smpp, 在 node.js 中,SMPP客户端和服务器实现

分享于 

12分钟阅读

GitHub

  繁體 雙語
SMPP client and server implementation in node.js
  • 源代码名称:node-smpp
  • 源代码网址:http://www.github.com/farhadi/node-smpp
  • node-smpp源代码文档
  • node-smpp源代码下载
  • Git URL:
    git://www.github.com/farhadi/node-smpp.git
    Git Clone代码到本地:
    git clone http://www.github.com/farhadi/node-smpp
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/farhadi/node-smpp
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    节点 smpp

    node.js. 中的SMPP客户端和服务器实现

    Build StatusDependency StatusdevDependency StatusCoverage Status

    简介

    这是 node.js 中 SMPP v5.0的完整实现,支持定制命令和 TLVs。

    SMPP v5.0,通过设计,是向后兼容 v3.4,所以你可以使用与 3.4实现相关的模块。 即使你不使用TLV参数,也不在收发器模式下绑定,你也可以使用这里模块与 3.3实现。

    这里实现中的方法和参数的名称与SMPP规范中定义的名称等效。 因此,获取 SMPP v5.0规范的副本,获取可用操作及其参数的列表。

    安装

     
    npm install smpp
    
    
    
     

    用法

    创建SMPP会话

    var smpp =require('smpp');var session =smpp.connect('smpp://example.com:2775');session.bind_transceiver({
     system_id:'YOUR_SYSTEM_ID',
     password:'YOUR_PASSWORD'}, function(pdu) {
     if (pdu.command_status==0) {
     // Successfully boundsession.submit_sm({
     destination_addr:'DESTINATION NUMBER',
     short_message:'Hello!' }, function(pdu) {
     if (pdu.command_status==0) {
     // Message successfully sentconsole.log(pdu.message_id);
     }
     });
     }
    });

    创建SMPP服务器

    var smpp =require('smpp');var server =smpp.createServer(function(session) {
     session.on('bind_transceiver', function(pdu) {
     // we pause the session to prevent further incoming pdu events,// untill we authorize the session with some async operation.session.pause();
     checkAsyncUserPass(pdu.system_id, pdu.password, function(err) {
     if (err) {
     session.send(pdu.response({
     command_status:smpp.ESME_RBINDFAIL }));
     session.close();
     return;
     }
     session.send(pdu.response());
     session.resume();
     });
     });
    });server.listen(2775);

    编码

    这里smpp实现支持 3个编码: ASCII ( GSM 03.38 ),LATIN1UCS2。 这些编码的data_coding分别是 0x010x030x08

    data_coding:0的默认编码为 ASCII。 你可以按如下方式更改它:

    smpp.encodings.default='LATIN1';

    字符串消息将使用以下三种编码之一自动编码。 如果你与它的通信的dtmf不支持它的中一个编码,则可以简单地将它的删除:

    deletesmpp.encodings.ASCII;

    你还可以手动将消息转换为缓冲区,并将它的作为 short_message 或者 message_payload 参数传递,以绕过自动消息编码。

    API

    smpp.connect(url, [callback] )

    使用指定的连接url创建新的smpp会话。 url 必须是以下格式的字符串: smpp://host:port。建立安全的smpp连接使用 ssmpp 作为 ssmpp://host:port的方案。 如果url中省略了 port,则将使用默认端口( 2775用于 smpp,3550用于安全 smpp )。 如果没有参数调用,将假定 smpp://localhost:2775

    如果指定了 callback,则将在安全连接中的纯连接和 secureConnect 事件中为 connect 事件添加。

    smpp.Session

    这是SMPP会话的基本对象。 通过调用 smpp.connect() 或者在客户端建立到服务器的连接时,可以通过smpp服务器创建会话。 在这种情况下,服务器将会话对象传递给 'session' 事件监听器。

    session.send(pdu, [responseCallback], [sendCallback] )

    通过会话向 mc/ESME发送pdu请求/响应。 pdusmpp.PDU的实例,它可能是响应或者请求 pdu。

    发送请求pdu时,pdu.sequence_number 将自动设置为正确的值。

    如果 pdu 是请求 pdu,当收到相关响应时,将使用传递给它的响应pdu调用可选的responseCallback 参数。

    刷新pdu时将调用可选的sendCallback

    session.close( [callback] )

    关闭当前会话连接。 如果提供,则在会话完全关闭后调用 callback

    session.connect( )

    可以用于重新连接已经关闭的连接。

    session.pause( )

    可以用于延迟传入pdu事件,直到调用 session.resume()

    session.resume( )

    在调用 pause() 后恢复会话。

    快捷方式方法

    对于所有的smpp操作,你都可以调用与操作名称相同的方法,这等同于 createing a。

    例如调用 session.submit_sm(options, callback) 等效于:

    var pdu =newsmpp.PDU('submit_sm', options);session.send(pdu, callback);
    事件:'连接"'

    成功建立会话连接时发出。

    事件:'secureconnect"'

    secureConnect 事件在成功完成安全连接的握手过程之后发出。

    事件:'close'

    当连接完全关闭时发出。

    事件:'错误'(error)

    发生错误时发出。 将在此事件之后直接调用 'close' 事件。

    事件:'发送'(pdu)

    当使用pdu作为参数通过会话发送pdu时发出。

    事件:'pdu'(pdu)

    接收pdu时发出。

    事件:'未知'(pdu)

    在接收未知pdu时发出。

    快捷事件

    当接收到of后,发出 'pdu' 事件后,同名的事件也将发出。

    smpp.createServer( [options], [sessionListener] )

    创建新的SMPP服务器。 sessionListener 参数被自动设置为'会话'事件的侦听器。 如果选项包括 keycert,则将创建一个TLS安全服务器。

    smpp.Server

    使用 smpp.createServer() 创建的SMPP服务器的基对象。 它是 node的net.Server 类。

    server.listen( [port], [host], [callback] )

    开始接受指定的porthost 上的连接。 如果省略 port,将使用 2775. 如果省略 host,服务器将接受指向任何IPv4地址的连接。

    这里函数是异步的。当服务器被绑定时,最后一个参数 callback 将被调用。

    事件:'会话'(session)

    建立新会话连接时发出。 sessionsmpp.Session的一个实例。

    用于其他服务器方法/事件文件的文件参见 node 文档的net.Server

    smpp.PDU

    这是PDU请求或者响应的基对象。

    新 smpp.PDU(command, [options] )

    使用指定的commandoptions 创建新的PDU对象。

    options 是指定的command 可以接受的参数列表。 参数的名称与SMPP规范v5.0中指定的名称等效。 参数的顺序不重要。 如果在 options 中不指定必需的参数,将使用默认值( 整数通常为空或者 0 )。

    对于参数的类型,请注意以下规则:

    • 对于 Integer 参数( 无论长度是多少),你必须在JavaScript中指定类型为 number的值。
    • 对于 Octet-StringCOctet-String 参数,你可以指定 Buffer 或者 String
    • 对于接受SMPP时间格式(。broadcast_end_timeschedule_delivery_timevalidity_periodfinal_date )的字段,可以指定将自动转换为SMPP绝对时间字符串的Javascript日期实例。 对于 relative 时间,不需要指定整个字符串,指定其中的一部分就足够了。 例如'0430'将转换为'000000000430000 r'。
    • 对于 short_messagemessage_payload 字段,可以指定缓冲区或者包含 udhmessage 属性的对象,而 udh 是一个缓冲区,message 是一个字符串或者缓冲区。 字符串将使用 ASCII。LATIN1或者UCS2自动编码,具体取决于它们的字符。 data_coding 将自动设置为 ASCII。0和 0编码,分别为 ASCII x01和UCS2编码。 如果存在 udhesm_class 中的UDH指示器位也会自动设置。
    • 不需要 sm_length 参数。 它将根据 short_message的长度自动设置。
    • submit_multi 操作的dest_address 参数必须是包含 dest_addr_tondest_addr_npidestination_addr 属性或者通讯组地址或者通讯组列表的dl_name 属性的对象的array。
    • submit_multi_resp 操作中的unsuccess_sme 参数必须是包含 dest_addr_tondest_addr_npidestination_addrerror_status_code 属性的对象的array。
    • 不需要 number_of_destsno_unsuccess 参数。 它们将根据 dest_addressunsuccess_sme 参数自动设置。
    • 可以多次指定的TLV参数( 比如。 broadcast_area_identifier ),必须指定为 array,即使你想要指定一个项目。
    pdu.isResponse( )

    如果pdu是响应 pdu,则返回 true,否则返回 false ;

    pdu.response( [options] )

    对于请求 pdu,调用 response() 将创建并返回该请求的响应 pdu。

    对于未知的pdu,response() 创建并返回 generic_nack pdu。

    session.on('submit_sm', function(pdu) {
     var msgid =.... ; // generate a message_id for this message.session.send(pdu.response({
     message_id: msgid
     }));
    });session.on('unbind', function(pdu) {
     session.send(pdu.response());
     session.close();
    });session.on('enquire_link', function(pdu) {
     session.send(pdu.response());
    });

    路线图

    • 更多测试覆盖。
    • 添加一些使用示例( 比如 客户端。服务器和集群示例)

    许可证

    节点smpp是在MIT许可证下发布的。


    相关文章