2013-03-27 79 views
1

需要通过Smpp发送和接收SMS消息,Register Number,收到systemID和密码,但无法连接。连接到项目gem'ruby-smpp',使用示例,它仅更改了systemID和密码的值。在Ruby on Rails中使用Smpp

在日志

<- (BindTransceiver) len = 37 cmd = 9 status = 0 seq = 1364360797 (<systemID><password>) 
Hex dump follows: 
<- 00000000: 0000 0025 0000 0009 0000 0000 5152 7e5d | ...% ........ QR ~] 
<- 00000010: 3531 3639 3030 0068 4649 6b4b 7d7d 7a00 | <systemID>.<password>. 
<- 00000020: 0034 0001 00 | .4 ... 

Starting enquire link timer (with 10s interval) 
Delegate: transceiver unbound 

在控制台:

Connecting to SMSC ... 
MT: Disconnected. Reconnecting in 5 seconds .. 
MT: Disconnected. Reconnecting in 5 seconds .. 
MT: Disconnected. Reconnecting in 5 seconds .. 
MT: Disconnected. Reconnecting in 5 seconds .. 
MT: Disconnected. Reconnecting in 5 seconds .. 

请告诉我,我不这样做,也许在配置到别的东西来添加或更改?和SMPP连接,按照我的理解,它仅适用于一个特定的IP地址,但在服务器上,并在本地机器上的日志是一样的

class Gateway 
    include KeyboardHandler 

    # MT id counter. 
    @@mt_id = 0 

    # expose SMPP transceiver's send_mt method 
    def self.send_mt(*args) 
    @@mt_id += 1 
    @@tx.send_mt(@@mt_id, *args) 
    end 

    def logger 
    Smpp::Base.logger 
    end 

    def start(config) 
    # The transceiver sends MT messages to the SMSC. It needs a storage with Hash-like 
    # semantics to map SMSC message IDs to your own message IDs. 
    pdr_storage = {} 

    # Run EventMachine in loop so we can reconnect when the SMSC drops our connection. 
    puts "Connecting to SMSC..." 
    loop do 
     EventMachine::run do 
     @@tx = EventMachine::connect(
      config[:host], 
      config[:port], 
      Smpp::Transceiver, 
      config, 
      self # delegate that will receive callbacks on MOs and DRs and other events 
     ) 
     print "MT: " 
     $stdout.flush 

     # Start consuming MT messages (in this case, from the console) 
     # Normally, you'd hook this up to a message queue such as Starling 
     # or ActiveMQ via STOMP. 
     EventMachine::open_keyboard(KeyboardHandler) 
     end 
     puts "Disconnected. Reconnecting in 5 seconds.." 
     sleep 5 
    end 
    end 

    # ruby-smpp delegate methods 

    def mo_received(transceiver, pdu) 
    logger.info "Delegate: mo_received: from #{pdu.source_addr} to #{pdu.destination_addr}: #{pdu.short_message}" 
    end 

    def delivery_report_received(transceiver, pdu) 
    logger.info "Delegate: delivery_report_received: ref #{pdu.msg_reference} stat #{pdu.stat}" 
    end 

    def message_accepted(transceiver, mt_message_id, pdu) 
    logger.info "Delegate: message_accepted: id #{mt_message_id} smsc ref id: #{pdu.message_id}" 
    end 

    def message_rejected(transceiver, mt_message_id, pdu) 
    logger.info "Delegate: message_rejected: id #{mt_message_id} smsc ref id: #{pdu.message_id}" 
    end 

    def bound(transceiver) 
    logger.info "Delegate: transceiver bound" 
    end 

    def unbound(transceiver) 
    logger.info "Delegate: transceiver unbound" 
    EventMachine::stop_event_loop 
    end 

end 


module KeyboardHandler 
    include EventMachine::Protocols::LineText2 

    def receive_line(data) 
    sender, receiver, *body_parts = data.split 
    unless sender && receiver && body_parts.size > 0 
     puts "Syntax: <sender> <receiver> <message body>"  
    else 
     body = body_parts.join(' ') 
     puts "Sending MT from #{sender} to #{receiver}: #{body}" 
     SampleGateway.send_mt(sender, receiver, body) 
    end 
    prompt 
    end 

    def prompt 
    print "MT: " 
    $stdout.flush 
    end 
end 

/初始化

require 'eventmachine' 
require 'smpp' 

LOGFILE = Rails.root + "log/sms_gateway.log" 
Smpp::Base.logger = Logger.new(LOGFILE) 

/脚本从脚本

puts "Starting SMS Gateway. Please check the log at #{LOGFILE}" 
config = { 
    :host => '127.0.0.1', 
    :port => 6000, 
    :system_id => <SystemID>, 
    :password => <Password>, 
    :system_type => '', # default given according to SMPP 3.4 Spec 
    :interface_version => 52, 
    :source_ton => 0, 
    :source_npi => 1, 
    :destination_ton => 1, 
    :destination_npi => 1, 
    :source_address_range => '', 
    :destination_address_range => '', 
    :enquire_link_delay_secs => 10 
} 
gw = Gateway.new 
gw.start(config) 

文件/通过轨道运行亚军

+0

检查主机和端口设置接收的形式。 smsc与rails应用程序位于同一台机器上吗? – 2013-03-27 07:21:37

+0

不,我的错误,smsc提供个人服务,如何获取主机和端口,再试一次 – 2013-03-27 13:59:45

+0

输入正确的ip地址和端口,但发送俄文字符时出现问题,加上 '#coding:utf-8' 在脚本/和gateway.rb中,但它没有帮助 – 2013-03-28 06:36:53

回答

1

问题解决了。最初被错误地指定了主机和端口,因为smpp-server与RoR应用程序不在同一台机器上。至于编码,在俄罗斯布局发送应

message = text.encode ("UTF-16BE"). force_encoding ("BINARY") 
Gateway.send_mt (sender, receiver, message, data_coding: 8) 

要在正确的

message = pdu.short_message.force_encoding ('UTF-16BE'). encode ('UTF-8') 
+0

嗨,我使用ruby-smpp与ussd,提交短消息编码到UCS2时得到不可读的符号 – 2013-04-19 10:50:39