deepakjeena/jsmpp

Problem in sending optional parameter its_session_info

Closed this issue · 4 comments

Hello,
Hi,

In my USSD application I need to send the its_session_info and ussd_service_op 
optional parameters for interactive session USSD message. But as per the 
wireshark trace it is showing that SMPP Packet is malformed, and i'm getting 
this error only when i am sending the its_session_info optional parameter with 
byte value and it is affecting ussd_service_op also at the same time. If the 
its_session_info is sent using short value everything works fine but without 
any session number in the SMPP Packet whic is actually required. 

Below is my code in which i'm appending optional parameters to SMPP Packet;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ussdsmpp;

import java.io.IOException;

import org.jsmpp.InvalidResponseException;
import org.jsmpp.PDUException;
import org.jsmpp.bean.Alphabet;
import org.jsmpp.bean.BindType;
import org.jsmpp.bean.ESMClass;
import org.jsmpp.bean.GeneralDataCoding;
import org.jsmpp.bean.MessageClass;
import org.jsmpp.bean.NumberingPlanIndicator;
import org.jsmpp.bean.RegisteredDelivery;
import org.jsmpp.bean.SMSCDeliveryReceipt;
import org.jsmpp.bean.TypeOfNumber;
import org.jsmpp.extra.NegativeResponseException;
import org.jsmpp.extra.ResponseTimeoutException;
import org.jsmpp.session.BindParameter;
import org.jsmpp.session.SMPPSession;
import org.jsmpp.util.AbsoluteTimeFormatter;
import org.jsmpp.util.TimeFormatter;
import org.jsmpp.bean.OptionalParameter;
import org.jsmpp.bean.OptionalParameter.Tag;

public class USSD
{

   private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();

    public static void main(String[] args)
    {
        SMPPSession session = new SMPPSession();

        int i = 2;
        short j=1;
        OptionalParameter op1 = new OptionalParameter.Byte(Tag.USSD_SERVICE_OP, (byte) i);
        //OptionalParameter op2 = new OptionalParameter.
        OptionalParameter op2 = new OptionalParameter.Byte(Tag.ITS_SESSION_INFO, (byte)2);
        OptionalParameter op[] = new OptionalParameter[2];
        op[0] = op2;
        op[1] = op1;

        //OptionalParameter op2 = new OptionalParameter.Byte(Tag.ITS_SESSION_INFO, (byte) 3);
        //OptionalParameter opits[] = new OptionalParameter[1];
        //opits[0] = op2;
        try
        {
         session.connectAndBind("xx.xxx.xxx.xx", xxxx, new BindParameter(BindType.BIND_TRX, "xxxx", "xxxx", "xxxx", TypeOfNumber.UNKNOWN, NumberingPlanIndicator.ISDN, "xxx"));
        }catch(IOException ioe)
        {
            System.out.println("Failed connect and bind to host");
            ioe.printStackTrace();
        }

        try
        {
          String messageId = session.submitShortMessage("USSD", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.PRIVATE, "xxx", TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.ISDN, "xxxxxxxxxx", new ESMClass(), (byte)0, (byte)0, null, null, new RegisteredDelivery(SMSCDeliveryReceipt.DEFAULT), (byte)0, new GeneralDataCoding(false, false, MessageClass.CLASS0, Alphabet.ALPHA_DEFAULT), (byte)0, "TEST".getBytes(),op);
        }catch(PDUException e)
        {
            System.out.println("Invalid PDU parameter");
            e.printStackTrace();
        } catch (ResponseTimeoutException e) {
            // Response timeout
            System.err.println("Response timeout");
            e.printStackTrace();
        } catch (InvalidResponseException e) {
            // Invalid response
            System.err.println("Receive invalid respose");
            e.printStackTrace();
        } catch (NegativeResponseException e) {
            // Receiving negative response (non-zero command_status)
            System.err.println("Receive negative response");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("IO error occur");
            e.printStackTrace();
        }

           session.unbindAndClose();
    }

}

And Below is the SMPP frame captured from wireshark;

0000  00 01 7a 09 d6 d3 00 13  20 23 c8 e5 08 00 45 00   ..z.....  #....E.
0010  00 6a 65 05 40 00 80 06  99 75 c0 a8 01 97 3b a1   .je.@... .u....;.
0020  fe 32 08 64 0b c1 4d c7  77 0a ca 7c 0f 8a 50 18   .2.d..M. w..|..P.
0030  ff e9 25 ce 00 00 00 00  00 42 00 00 00 04 00 00   ..%..... .B......
0040  00 00 00 00 00 02 55 53  53 44 00 05 09 33 36 37   ......US SD...367
0050  00 01 01 39 31 39 37 34  31 37 37 37 30 34 31 00   ...91974 1777041.
0060  00 00 00 00 00 00 00 00  00 04 54 45 53 54 13 83   ........ ..TEST..
0070  00 01 02 05 01 00 01 02                            ........         

optional parameter: its_session_info (0x1383)
                    Tag: 0x1383
                    Length: 1
                    session number: 2
                    0000 010. = sequence number : 0x02
                    ........1 = session indicator: End of session    indicator active (0x01)

optional parameter: 0x0100 (0x0100)
                    Tag: 0x0100
                    Length: 258

[Malformed Packet: SMPP]


I am using JSMPP 2.1.0 version.

Kindly help me out in this regard.




Original issue reported on code.google.com by chethan7...@gmail.com on 11 Aug 2010 at 11:09


The length of its_session_info
should be 2,yours is 1

Parameter Tag 2 Integer its_session_info
Length 2 Integer Length of Value part in octets
Value 2 Octet
String Bits 7...............0
SSSS SSSS (octet 1)
NNNN NNNE (octet 2)
Octet 1 contains the session number (0 -
255) encoded in binary. The session
number remains constant for each session.
The sequence number of the dialogue unit
(as assigned by the ESME) within the
session is encoded in bits 7..1 of octet 2.

Original comment by changmen...@gmail.com on 3 Aug 2011 at 5:00

its_session_info should use OctetString so please use

new OptionalParameter.OctetString(OptionalParameter.Tag.ITS_SESSION_INFO, new 
byte[]{x, y})

Original comment by uuda...@gmail.com on 7 Aug 2011 at 10:19

  • Changed state: Done
[deleted comment]
Hello,
I have the same problem but with Tag.RECEIPTED_MESSAGE_ID. Always my wireshark 
set my deliver_sm as Malformed.
I add OptionalParameter like this:
OptionalParameter op[] = new OptionalParameter[2];
OptionalParameter op1 = new OptionalParameter.Byte(Tag.MESSAGE_STATE, (byte) 2);

OptionalParameter op2 = new 
OptionalParameter.OctetString(Tag.RECEIPTED_MESSAGE_ID.code(), 
messageId.toString().getBytes());
op[0] = op1;
op[1] = op2;
And I add it into deliver_sm
session.deliverShortMessage(..., op);
I try to add RECEIPTED_MESSAGE_ID like Int or Byte but always have the same 
result Malformed Packet:SMPP.
Please help me to carry out this problem.

Original comment by sokun...@gmail.com on 11 Mar 2012 at 6:37