func NewSubmitMulti(fields pdutlv.Fields) Body {
	b := newSubmitMulti(&Header{ID: SubmitMultiID})
	b.init()
	for tag, value := range fields {
		b.t.Set(tag, value)
	}
	return b
}
NewSubmitMulti creates and initializes a new SubmitMulti PDU.
package pdu
import (
	"github.com/fiorix/go-smpp/smpp/pdu/pdufield"
	"github.com/fiorix/go-smpp/smpp/pdu/pdutlv"
)
const (
	GenericNACKID         ID = 0x80000000
	BindReceiverID        ID = 0x00000001
	BindReceiverRespID    ID = 0x80000001
	BindTransmitterID     ID = 0x00000002
	BindTransmitterRespID ID = 0x80000002
	QuerySMID             ID = 0x00000003
	QuerySMRespID         ID = 0x80000003
	SubmitSMID            ID = 0x00000004
	SubmitSMRespID        ID = 0x80000004
	DeliverSMID           ID = 0x00000005
	DeliverSMRespID       ID = 0x80000005
	UnbindID              ID = 0x00000006
	UnbindRespID          ID = 0x80000006
	ReplaceSMID           ID = 0x00000007
	ReplaceSMRespID       ID = 0x80000007
	CancelSMID            ID = 0x00000008
	CancelSMRespID        ID = 0x80000008
	BindTransceiverID     ID = 0x00000009
	BindTransceiverRespID ID = 0x80000009
	OutbindID             ID = 0x0000000B
	EnquireLinkID         ID = 0x00000015
	EnquireLinkRespID     ID = 0x80000015
	SubmitMultiID         ID = 0x00000021
	SubmitMultiRespID     ID = 0x80000021
	AlertNotificationID   ID = 0x00000102
	DataSMID              ID = 0x00000103
	DataSMRespID          ID = 0x80000103
)
type GenericNACK struct{ *codec }
func newGenericNACK(hdr *Header) *codec {
	return &codec{h: hdr}
}
func NewGenericNACK() Body {
	b := newGenericNACK(&Header{ID: GenericNACKID})
	b.init()
	return b
}
type Bind struct{ *codec }
func newBind(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.SystemID,
			pdufield.Password,
			pdufield.SystemType,
			pdufield.InterfaceVersion,
			pdufield.AddrTON,
			pdufield.AddrNPI,
			pdufield.AddressRange,
		}}
}
func NewBindReceiver() Body {
	b := newBind(&Header{ID: BindReceiverID})
	b.init()
	return b
}
func NewBindTransceiver() Body {
	b := newBind(&Header{ID: BindTransceiverID})
	b.init()
	return b
}
func NewBindTransmitter() Body {
	b := newBind(&Header{ID: BindTransmitterID})
	b.init()
	return b
}
type BindResp struct{ *codec }
func newBindResp(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{pdufield.SystemID},
	}
}
func NewBindReceiverResp() Body {
	b := newBindResp(&Header{ID: BindReceiverRespID})
	b.init()
	return b
}
func NewBindTransceiverResp() Body {
	b := newBindResp(&Header{ID: BindTransceiverRespID})
	b.init()
	return b
}
func NewBindTransmitterResp() Body {
	b := newBindResp(&Header{ID: BindTransmitterRespID})
	b.init()
	return b
}
type QuerySM struct{ *codec }
func newQuerySM(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.MessageID,
			pdufield.SourceAddrTON,
			pdufield.SourceAddrNPI,
			pdufield.SourceAddr,
		},
	}
}
func NewQuerySM() Body {
	b := newQuerySM(&Header{ID: QuerySMID})
	b.init()
	return b
}
type QuerySMResp struct{ *codec }
func newQuerySMResp(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.MessageID,
			pdufield.FinalDate,
			pdufield.MessageState,
			pdufield.ErrorCode,
		},
	}
}
func NewQuerySMResp() Body {
	b := newQuerySMResp(&Header{ID: QuerySMRespID})
	b.init()
	return b
}
type SubmitSM struct{ *codec }
func newSubmitSM(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.ServiceType,
			pdufield.SourceAddrTON,
			pdufield.SourceAddrNPI,
			pdufield.SourceAddr,
			pdufield.DestAddrTON,
			pdufield.DestAddrNPI,
			pdufield.DestinationAddr,
			pdufield.ESMClass,
			pdufield.ProtocolID,
			pdufield.PriorityFlag,
			pdufield.ScheduleDeliveryTime,
			pdufield.ValidityPeriod,
			pdufield.RegisteredDelivery,
			pdufield.ReplaceIfPresentFlag,
			pdufield.DataCoding,
			pdufield.SMDefaultMsgID,
			pdufield.SMLength,
			pdufield.ShortMessage,
		},
	}
}
func NewSubmitSM(fields pdutlv.Fields) Body {
	b := newSubmitSM(&Header{ID: SubmitSMID})
	b.init()
	for tag, value := range fields {
		b.t.Set(tag, value)
	}
	return b
}
type SubmitSMResp struct{ *codec }
func newSubmitSMResp(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.MessageID,
		},
	}
}
func NewSubmitSMResp() Body {
	b := newSubmitSMResp(&Header{ID: SubmitSMRespID})
	b.init()
	return b
}
type SubmitMulti struct{ *codec }
func newSubmitMulti(hdr *Header) *codec {
	return &codec{
		h: hdr,
		l: pdufield.List{
			pdufield.ServiceType,
			pdufield.SourceAddrTON,
			pdufield.SourceAddrNPI,
			pdufield.SourceAddr,
			pdufield.NumberDests,
			pdufield.DestinationList,  
			pdufield.ESMClass,
			pdufield.ProtocolID,
			pdufield.PriorityFlag,
			pdufield.ScheduleDeliveryTime,
			pdufield.ValidityPeriod,
			pdufield.RegisteredDelivery,
			pdufield.ReplaceIfPresentFlag,
			pdufield.DataCoding,
			pdufield.SMDefaultMsgID,
			pdufield.SMLength,
			pdufield.ShortMessage,
		},
	}
}