我正在编写一个Perl脚本,它将使用Net :: SMPP充当接收器和发送器 . 当移动用户将消息发送到短代码(比如123)时,它将到达我的SMPP帐户,我的SMPP应用程序将读取该消息并回复并向用户发送确认,例如“谢谢您发送消息” ” . 我收到用户发送到我的SMPP应用程序的消息完全没问题 . 问题是向SMSC发回确认(delivery_sm_resp),以便从流中删除该消息,以便可以收集其他用户发送的下一条消息 . 我尝试使用该功能,但我无法弄清楚从SMSC收到的消息到我的ESME的message_id .
我的代码是 .
my $transmitter = Net::SMPP->new_transmitter($host,port=> $port,system_id => '123',password => '',) or die;
$receiver = Net::SMPP->new_receiver($host,system_id => '123',password => '',port => $port,)
or die "Can't create server: $!";
while (1) {
warn "Waiting for PDU";
$pdu = $receiver->read_pdu() or die "$$: PDU not read. Closing connection";
print "Received #$pdu->{seq} $pdu->{cmd}:". Net::SMPP::pdu_tab->{$pdu->{cmd}}{cmd} ."\n";
warn Dumper($pdu);
print "\n\n ** Hello ** " . $pdu->{message_id} . "\n ** now printing ** " . $pdu->{sm_default_msg_id};
$transmitter->deliver_sm_resp( message_id => $pdu->{sm_default_msg_id}, seq => $pdu->{seq});
$resp_pdu = $transmitter->submit_sm(
destination_addr => $pdu->{source_addr},
short_message => "you sent a message with text " . $pdu->{short_message}
) or die "Response indicated error: " . $resp_pdu->explain_status();
}
我从SMSC收到的消息到我的ESME的显示如下 . 请帮助我找到它的message_id,它可用于确认SMSC,以便从流中删除该消息,并可以接受其他用户发送的下一条消息 . 否则我会收到相同的PDU 3次,直到超时,下一条消息无法接受 .
Waiting for PDU at s.pl line 23.
Received #2 5:deliver_sm
$VAR1 = bless( {
'source_addr_ton' => 1,
'known_pdu' => 1,
'schedule_delivery_time' => '',
'protocol_id' => 0,
'status' => 0,
'short_message' => 'A',
'dest_addr_npi' => 0,
'source_addr' => '44702601843',
'validity_period' => '',
'registered_delivery' => 0,
'dest_addr_ton' => 0,
'seq' => 2,
'data_coding' => 1,
'service_type' => '',
'replace_if_present_flag' => 0,
'cmd' => 5,
'priority_flag' => 0,
'data' => '44702601843420A',
'destination_addr' => '420',
'esm_class' => 0,
'sm_default_msg_id' => 0,
'source_addr_npi' => 0,
'reserved' => undef
}, 'Net::SMPP::PDU' );
2 回答
答:我正在更多地检查这一点,并发现从ESME发送确认响应 - > SMSC应该在代码中使用以下命令 . 我希望有时可以帮助某人 . :)
附件是允许我接收短信的代码