Skip to content
This repository has been archived by the owner on Sep 18, 2021. It is now read-only.

Commit

Permalink
Merge pull request #95 from madisparn/master
Browse files Browse the repository at this point in the history
add support for missing pdu's and tags
  • Loading branch information
jjlauer committed Apr 19, 2015
2 parents 494b6f0 + b9728b0 commit 605a539
Show file tree
Hide file tree
Showing 8 changed files with 554 additions and 7 deletions.
Binary file added src/etc/SMPP_v5_0.pdf
Binary file not shown.
116 changes: 110 additions & 6 deletions src/main/java/com/cloudhopper/smpp/SmppConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class SmppConstants {

public static final byte VERSION_3_3 = 0x33;
public static final byte VERSION_3_4 = 0x34;
public static final byte VERSION_5_0 = 0x50;

public static final int DEFAULT_WINDOW_SIZE = 1;
public static final long DEFAULT_WINDOW_WAIT_TIMEOUT = 60000;
Expand Down Expand Up @@ -79,8 +80,12 @@ public class SmppConstants {
public static final int CMD_ID_OUTBIND = 0x0000000B;
public static final int CMD_ID_ENQUIRE_LINK = 0x00000015;
public static final int CMD_ID_SUBMIT_MULTI = 0x00000021;
public static final int CMD_ID_ALERT_NOTIFICATION = 0x00000102;
public static final int CMD_ID_DATA_SM = 0x00000103;

public static final int CMD_ID_BROADCAST_SM = 0x00000111;
public static final int CMD_ID_QUERY_BROADCAST_SM = 0x00000112;
public static final int CMD_ID_CANCEL_BROADCAST_SM = 0x00000113;

//
// SMPP Command ID (Responses)
//
Expand All @@ -97,10 +102,14 @@ public class SmppConstants {
public static final int CMD_ID_ENQUIRE_LINK_RESP = 0x80000015;
public static final int CMD_ID_SUBMIT_MULTI_RESP = 0x80000021;
public static final int CMD_ID_DATA_SM_RESP = 0x80000103;
public static final int CMD_ID_BROADCAST_SM_RESP = 0x80000111;
public static final int CMD_ID_QUERY_BROADCAST_SM_RESP = 0x80000112;
public static final int CMD_ID_CANCEL_BROADCAST_SM_RESP = 0x80000113;

//
// Optional TLV Tags
//
public static final short TAG_SOURCE_TELEMATICS_ID = 0x0010;
public static final short TAG_PAYLOAD_TYPE = 0x0019;
public static final short TAG_PRIVACY_INDICATOR = 0x0201;
public static final short TAG_USER_MESSAGE_REFERENCE = 0x0204;
Expand Down Expand Up @@ -135,6 +144,8 @@ public class SmppConstants {
public static final short TAG_MORE_MSGS_TO_FOLLOW = 0x0426;
// Message State
public static final short TAG_MSG_STATE = 0x0427;
// Congestion State
public static final short TAG_CONGESTION_STATE = 0x0428;
// Callback Number Presentation Indicator
public static final short TAG_CALLBACK_NUM_PRES_IND = 0x0302;
// Callback Number Alphanumeric Tag
Expand All @@ -151,6 +162,38 @@ public class SmppConstants {
public static final short TAG_ITS_SESSION_INFO = 0x1383;
// USSD Service Op
public static final short TAG_USSD_SERVICE_OP = 0x0501;
// Broadcast Channel Indicator
public static final short TAG_BROADCAST_CHANNEL_INDICATOR = 0x0600;
// Broadcast Content Type
public static final short TAG_BROADCAST_CONTENT_TYPE = 0x0601;
// Broadcast Content Type Info
public static final short TAG_BROADCAST_CONTENT_TYPE_INFO = 0x0602;
// Broadcast Message Class
public static final short TAG_BROADCAST_MESSAGE_CLASS = 0x0603;
// Broadcast Rep Num
public static final short TAG_BROADCAST_REP_NUM = 0x0604;
// Broadcast Frequency Interval
public static final short TAG_BROADCAST_FREQUENCY_INTERVAL = 0x0605;
// Broadcast Area Identifier
public static final short TAG_BROADCAST_AREA_IDENTIFIER = 0x0606;
// Broadcast Error Status
public static final short TAG_BROADCAST_ERROR_STATUS = 0x0607;
// Broadcast Area Success
public static final short TAG_BROADCAST_AREA_SUCCESS = 0x0608;
// Broadcast End Time
public static final short TAG_BROADCAST_END_TIME = 0x0609;
// Broadcast Service Group
public static final short TAG_BROADCAST_SERVICE_GROUP = 0x060A;
// Source Network Id
public static final short TAG_SOURCE_NETWORK_ID = 0x060D;
// Dest Network Id
public static final short TAG_DEST_NETWORK_ID = 0x060E;
// Source Node Id
public static final short TAG_SOURCE_NODE_ID = 0x060F;
// Dest Node Id
public static final short TAG_DEST_NODE_ID = 0x0610;
// Billing Identification
public static final short TAG_BILLING_IDENTIFICATION = 0x060B;
// Originating MSC Address
public static final short TAG_ORIG_MSC_ADDR = (short)0x8081;
// Destination MSC Address
Expand All @@ -177,12 +220,13 @@ public class SmppConstants {
public static final short TAG_ADD_STATUS_INFO = 0x001D;
// Receipted Message ID
public static final short TAG_RECEIPTED_MSG_ID = 0x001E;

// MS Message Wait Facilities
public static final short TAG_MS_MSG_WAIT_FACILITIES = 0x0030;

/** ESM Class */

/** Message Type (bits 5-2) */
public static final byte ESM_CLASS_MT_MASK = (byte)0x1C; // BIN: 11100
public static final byte ESM_CLASS_MT_MASK = (byte)0x1C; // BIN: 11100
public static final byte ESM_CLASS_MT_SMSC_DELIVERY_RECEIPT = (byte)0x04; // BIN: 100, Recv Msg contains SMSC delivery receipt
public static final byte ESM_CLASS_MT_ESME_DELIVERY_RECEIPT = (byte)0x08; // BIN: 1000, Send/Recv Msg contains ESME delivery acknowledgement
public static final byte ESM_CLASS_MT_MANUAL_USER_ACK = (byte)0x10; // BIN: 10000, Send/Recv Msg contains manual/user acknowledgment
Expand All @@ -200,6 +244,7 @@ public class SmppConstants {
public static final byte REGISTERED_DELIVERY_SMSC_RECEIPT_NOT_REQUESTED = 0x00;
public static final byte REGISTERED_DELIVERY_SMSC_RECEIPT_REQUESTED = 0x01;
public static final byte REGISTERED_DELIVERY_SMSC_RECEIPT_ON_FAILURE = 0x02;
public static final byte REGISTERED_DELIVERY_SMSC_RECEIPT_ON_SUCCESS = 0x03;

// SME originated acknowledgement (bits 3 & 2)
public static final byte REGISTERED_DELIVERY_SME_ACK_MASK = 0x0c;
Expand All @@ -211,9 +256,9 @@ public class SmppConstants {
// Intermediate notification (bit 4)
// NOTE: SMPP 3.4 specs originally wrote (bit 5) but their matrix actually used bit 4
// the confirmed value is bit 4, not 5.
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_MASK = 0x10;
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_NOT_REQUESTED = 0x0;
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_REQUESTED = 0x10;
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_MASK = 0x10;
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_NOT_REQUESTED = 0x00;
public static final byte REGISTERED_DELIVERY_INTERMEDIATE_NOTIFICATION_REQUESTED = 0x10;


// Replace if Present flag
Expand Down Expand Up @@ -450,6 +495,33 @@ public class SmppConstants {
// Delivery Failure (used for data_sm_resp)
public static final int STATUS_UNKNOWNERR = 0x000000FF; // Unknown Error

// ESME Not authorised to use specified service_type
public static final int STATUS_SERTYPUNAUTH = 0x00000100;
// ESME Prohibited from using specified operation
public static final int STATUS_PROHIBITED = 0x00000101;
// Specified service_type is unavailable
public static final int STATUS_SERTYPUNAVAIL = 0x00000102;
// Specified service_type is denied
public static final int STATUS_SERTYPDENIED = 0x00000103;
// Invalid Data Coding Scheme
public static final int STATUS_INVDCS = 0x00000104;
// Source Address Sub unit is Invalid
public static final int STATUS_INVSRCADDRSUBUNIT = 0x00000105;
// Destination Address Sub unit is Invalid
public static final int STATUS_INVDSTADDRSUBUNIT = 0x00000106;
// Broadcast Frequency Interval is invalid
public static final int STATUS_INVBCASTFREQINT = 0x00000107;
// Broadcast Alias Name is invalid
public static final int STATUS_INVBCASTALIAS_NAME = 0x00000108;
// Broadcast Area Format is invalid
public static final int STATUS_INVBCASTAREAFMT = 0x00000109;
// Numberof Broadcast Areas is invalid
public static final int STATUS_INVNUMBCAST_AREAS = 0x0000010A;
// Broadcast Content Type is invalid
public static final int STATUS_INVBCASTCNTTYPE = 0x0000010B;
// Broadcast Message Class is invalid
public static final int STATUS_INVBCASTMSGCLASS = 0x0000010C;

public static final Map<Integer,String> STATUS_MESSAGE_MAP;
public static final Map<Short,String> TAG_NAME_MAP;

Expand Down Expand Up @@ -503,8 +575,22 @@ public class SmppConstants {
STATUS_MESSAGE_MAP.put(STATUS_INVOPTPARAMVAL, "Optional parameter value invalid");
STATUS_MESSAGE_MAP.put(STATUS_DELIVERYFAILURE, "Deliver SM failed");
STATUS_MESSAGE_MAP.put(STATUS_UNKNOWNERR, "Unknown error");
STATUS_MESSAGE_MAP.put(STATUS_SERTYPUNAUTH, "Not authorised to use specified service_type");
STATUS_MESSAGE_MAP.put(STATUS_PROHIBITED, "Prohibited from using specified operation");
STATUS_MESSAGE_MAP.put(STATUS_SERTYPUNAVAIL, "Specified service_type is unavailable");
STATUS_MESSAGE_MAP.put(STATUS_SERTYPDENIED, "Specified service_type is denied");
STATUS_MESSAGE_MAP.put(STATUS_INVDCS, "Invalid Data Coding Scheme");
STATUS_MESSAGE_MAP.put(STATUS_INVSRCADDRSUBUNIT, "Source Address Sub unit is Invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVDSTADDRSUBUNIT, "Destination Address Sub unit is Invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVBCASTFREQINT, "Broadcast Frequency Interval is invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVBCASTALIAS_NAME, "Broadcast Alias Name is invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVBCASTAREAFMT, "Broadcast Area Format is invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVNUMBCAST_AREAS, "Number of Broadcast Areas is invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVBCASTCNTTYPE, "Broadcast Content Type is invalid");
STATUS_MESSAGE_MAP.put(STATUS_INVBCASTMSGCLASS, "Broadcast Message Class is invalid");

TAG_NAME_MAP = new HashMap<Short,String>();
TAG_NAME_MAP.put(TAG_SOURCE_TELEMATICS_ID, "source_telematics_id");
TAG_NAME_MAP.put(TAG_PAYLOAD_TYPE, "payload_type");
TAG_NAME_MAP.put(TAG_PRIVACY_INDICATOR, "privacy_indicator");
TAG_NAME_MAP.put(TAG_USER_MESSAGE_REFERENCE, "user_message_reference");
Expand All @@ -529,6 +615,7 @@ public class SmppConstants {
TAG_NAME_MAP.put(TAG_DELIVERY_FAILURE_REASON, "delivery_failure_reason");
TAG_NAME_MAP.put(TAG_MORE_MSGS_TO_FOLLOW, "more_msgs_to_follow");
TAG_NAME_MAP.put(TAG_MSG_STATE, "message_state");
TAG_NAME_MAP.put(TAG_CONGESTION_STATE, "congestion_state");
TAG_NAME_MAP.put(TAG_CALLBACK_NUM_PRES_IND, "callback_num_pres_ind");
TAG_NAME_MAP.put(TAG_CALLBACK_NUM_ATAG, "callback_num_atag");
TAG_NAME_MAP.put(TAG_NUM_MSGS, "num_msgs_in_mailbox");
Expand All @@ -537,6 +624,22 @@ public class SmppConstants {
TAG_NAME_MAP.put(TAG_ITS_REPLY_TYPE, "its_reply_type");
TAG_NAME_MAP.put(TAG_ITS_SESSION_INFO, "its_session_info");
TAG_NAME_MAP.put(TAG_USSD_SERVICE_OP, "ussd_service_op");
TAG_NAME_MAP.put(TAG_BROADCAST_CHANNEL_INDICATOR, "broadcast_channel_indicator");
TAG_NAME_MAP.put(TAG_BROADCAST_CONTENT_TYPE, "broadcast_content_type");
TAG_NAME_MAP.put(TAG_BROADCAST_CONTENT_TYPE_INFO, "broadcast_content_type_info");
TAG_NAME_MAP.put(TAG_BROADCAST_MESSAGE_CLASS, "broadcast_message_class");
TAG_NAME_MAP.put(TAG_BROADCAST_REP_NUM, "broadcast_rep_num");
TAG_NAME_MAP.put(TAG_BROADCAST_FREQUENCY_INTERVAL, "broadcast_frequency_interval");
TAG_NAME_MAP.put(TAG_BROADCAST_AREA_IDENTIFIER, "broadcast_area_identifier");
TAG_NAME_MAP.put(TAG_BROADCAST_ERROR_STATUS, "broadcast_error_status");
TAG_NAME_MAP.put(TAG_BROADCAST_AREA_SUCCESS, "broadcast_area_success");
TAG_NAME_MAP.put(TAG_BROADCAST_END_TIME, "broadcast_end_time");
TAG_NAME_MAP.put(TAG_BROADCAST_SERVICE_GROUP, "broadcast_service_group");
TAG_NAME_MAP.put(TAG_SOURCE_NETWORK_ID, "source_network_id");
TAG_NAME_MAP.put(TAG_DEST_NETWORK_ID, "dest_network_id");
TAG_NAME_MAP.put(TAG_SOURCE_NODE_ID, "source_node_id");
TAG_NAME_MAP.put(TAG_DEST_NODE_ID, "dest_node_id");
TAG_NAME_MAP.put(TAG_BILLING_IDENTIFICATION, "billing_identification");
TAG_NAME_MAP.put(TAG_ORIG_MSC_ADDR, "orig_msc_addr");
TAG_NAME_MAP.put(TAG_DEST_MSC_ADDR, "dest_msc_addr");
TAG_NAME_MAP.put(TAG_DEST_ADDR_SUBUNIT, "dest_addr_subunit");
Expand All @@ -550,6 +653,7 @@ public class SmppConstants {
TAG_NAME_MAP.put(TAG_QOS_TIME_TO_LIVE, "qos_time_to_live");
TAG_NAME_MAP.put(TAG_ADD_STATUS_INFO, "additional_status_info");
TAG_NAME_MAP.put(TAG_RECEIPTED_MSG_ID, "receipted_message_id");
TAG_NAME_MAP.put(TAG_MS_MSG_WAIT_FACILITIES, "ms_msg_wait_facilities");
}

}
87 changes: 87 additions & 0 deletions src/main/java/com/cloudhopper/smpp/pdu/AlertNotification.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.cloudhopper.smpp.pdu;

/*
* #%L
* ch-smpp
* %%
* Copyright (C) 2009 - 2015 Cloudhopper by Twitter
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/

import org.jboss.netty.buffer.ChannelBuffer;

import com.cloudhopper.commons.util.StringUtil;
import com.cloudhopper.smpp.SmppConstants;
import com.cloudhopper.smpp.type.Address;
import com.cloudhopper.smpp.type.RecoverablePduException;
import com.cloudhopper.smpp.type.UnrecoverablePduException;
import com.cloudhopper.smpp.util.ChannelBufferUtil;
import com.cloudhopper.smpp.util.PduUtil;

public class AlertNotification extends Pdu {

protected Address sourceAddress;
protected Address esmeAddress;

public AlertNotification(){
super( SmppConstants.CMD_ID_ALERT_NOTIFICATION, "alert_notification", true );
}

public Address getSourceAddress() {
return this.sourceAddress;
}

public void setSourceAddress(Address value) {
this.sourceAddress = value;
}

public Address getEsmeAddress() {
return this.esmeAddress;
}

public void setEsmeAddress(Address value) {
this.esmeAddress = value;
}

@Override
protected int calculateByteSizeOfBody(){
int bodyLength = 0;
bodyLength += PduUtil.calculateByteSizeOfAddress(this.sourceAddress);
bodyLength += PduUtil.calculateByteSizeOfAddress(this.esmeAddress);
return bodyLength;
}

@Override
public void readBody( ChannelBuffer buffer ) throws UnrecoverablePduException, RecoverablePduException{
this.sourceAddress = ChannelBufferUtil.readAddress(buffer);
this.esmeAddress = ChannelBufferUtil.readAddress(buffer);
}

@Override
public void writeBody( ChannelBuffer buffer ) throws UnrecoverablePduException, RecoverablePduException{
ChannelBufferUtil.writeAddress(buffer, this.sourceAddress);
ChannelBufferUtil.writeAddress(buffer, this.esmeAddress);
}

@Override
protected void appendBodyToString( StringBuilder buffer ){
buffer.append("( sourceAddr [");
buffer.append(StringUtil.toStringWithNullAsEmpty(this.sourceAddress));
buffer.append("] esmeAddr [");
buffer.append(StringUtil.toStringWithNullAsEmpty(this.esmeAddress));
buffer.append("])");
}

}
Loading

0 comments on commit 605a539

Please sign in to comment.