SMPP Data Coding Setter

Problem this snippet solves:

Hello, We have some platform that does not have flexible parameters for SMPP Data Coding (DC). When sending SMS from client platform to the SMS-C, it is important that the DC of the SMS text inside the SMPP PDU Field is supported by the SMS-C and defined in such a way that the SMSC is able to interpret it. Otherwise, all SMS may be dropped by the SMS-C server.

This iRule set the DataCoding to 0x00.

  • SMSC default alphabet => DC=0x00 - CharSet:GSM - Length Max: 160
  • LATIN-1 => DC=0x03 - CharSet: GSM - Length Max: 160
  • UCS2 => DC=0x08 - CharSet: UCS2 - Length Max:70

Please consult the smpp v3.4 specification http://opensmpp.org/specs/smppv34_gsmumts_ig_v10.pdf

Code :

when CLIENT_ACCEPTED {
    TCP::collect
    }
    when CLIENT_DATA {
    while { [TCP::payload length] > 16 } {
#Get header
        binary scan [TCP::payload] IH8IIa* length operation status sequence p
        #log local0. "Request: $operation" 
        if { [TCP::payload length] < $length } {
            TCP::collect $length
            return
        }
        switch -glob $operation {           
            00000004 {
                # If submit_sm
set all [TCP::payload length] 
#log local0. "Request: $operation - $all" 
set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p ccA* sourTon sourNpi p
#log local0. "Request: $operation - $sourTon - $sourNpi"

set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p ccA* destTon destNpi p
#log local0. "Request: $operation - $destTon - $destNpi"

set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p ccccA* esm protID pFlag schedTime p 
#log local0. "Request: $operation - $esm - $protID - $pFlag - $schedTime"

set p [string range $p [expr [string first \x00 $p]+1] end]
binary scan $p cccA* registDel replIfPres dataCoding p
#log local0. "Request: $operation - $registDel - $replIfPres - $dataCoding "

set lastindexDCex [string length $p]
#log local0. "Request: $operation - $lastindexDCex "
set indexDC [expr {$all - $lastindexDCex - 1}]
#log local0. "Request: $operation - $indexDC "

TCP::payload replace $indexDC 1 [binary format c 0]   

            }
        }
        TCP::release $length
        TCP::notify request
    }
    TCP::collect
}
Published Jan 16, 2018
Version 1.0

Was this article helpful?

No CommentsBe the first to comment