Hi, the following Java Code is the decoder that responsible for parsing
incoming SMPP messages from Short message Center:
public class SMPPClientSideDecoder extends CumulativeProtocolDecoder {
/** Class revision */
public static final String _REV_ID_ = "$Revision: $";
private static final int MAX_PDU_LENGTH = 300;
private static final Map<Integer, Class<? extends PDU>>
PDUMapping = new HashMap<Integer, Class<? extends PDU>>();
static {
PDUMapping.put(Data.BIND_RECEIVER_RESP,
BindReceiverResp.class);
PDUMapping.put(Data.BIND_TRANSCEIVER_RESP,
BindTranscieverResp.class);
PDUMapping.put(Data.BIND_TRANSMITTER_RESP,
BindTransmitterResp.class);
PDUMapping.put(Data.ENQUIRE_LINK_RESP,
EnquireLinkResp.class);
PDUMapping.put(Data.ENQUIRE_LINK, EnquireLink.class);
PDUMapping.put(Data.UNBIND_RESP, UnbindResp.class);
}
private void writePDUObject(int commandId, byte[] content,
ProtocolDecoderOutput out) throws Exception {
Class<? extends PDU> pduClass =
PDUMapping.get(commandId);
if (pduClass != null) {
PDU pdu = pduClass.newInstance();
pdu.setData(new ByteBuffer(content));
out.write(pdu);
}
}
@Override
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
if (Util.prefixedDataAvailable(in, 4, MAX_PDU_LENGTH)) {
int commandLength = Util.getCommandLength(in);
int commandId = Util.getCommandId(in);
byte[] data = new byte[commandLength];
in.get(data, 0, commandLength);
EServerStatus status = null;
if (status == EServerStatus.STOPPING) {
// filter out Bind & Request message
during STOPPING phrase
if (Util.isSMPPRequest(commandId)) {
return true;
}
}
switch (commandId) {
// handle Bind response & EnquireLink response
case Data.BIND_RECEIVER_RESP:
writePDUObject(Data.BIND_RECEIVER_RESP,
data, out);
break;
case Data.BIND_TRANSCEIVER_RESP:
writePDUObject(Data.BIND_TRANSCEIVER_RESP, data, out);
break;
case Data.BIND_TRANSMITTER_RESP:
writePDUObject(Data.BIND_TRANSMITTER_RESP, data, out);
break;
case Data.ENQUIRE_LINK:
writePDUObject(Data.ENQUIRE_LINK, data,
out);
break;
case Data.ENQUIRE_LINK_RESP:
writePDUObject(Data.ENQUIRE_LINK_RESP,
data, out);
break;
case Data.UNBIND_RESP:
writePDUObject(Data.UNBIND_RESP, data,
out);
break;
default:
// handle the other kind of PDU
out.write(IoBuffer.wrap(data));
break;
}
return true;
}
return false;
}
}