Skip to content

Commit

Permalink
feat: SMPP5.0 implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
“hujm” authored and hujm2023 committed Nov 26, 2023
1 parent eead0ba commit 245ff0f
Show file tree
Hide file tree
Showing 42 changed files with 1,107 additions and 249 deletions.
5 changes: 2 additions & 3 deletions cmpp/cmpp20/pdu_activetest.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ func (p *PduActiveTest) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(p.Header.CommandID))
buf.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, buf)

return buf.BytesWithLength()
}
Expand Down Expand Up @@ -49,7 +48,7 @@ func (pr *PduActiveTestResp) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteBytes(pr.Header.Bytes())
cmpp.WriteHeaderNoLength(pr.Header, buf)
buf.WriteUint8(pr.Reserved)

return buf.BytesWithLength()
Expand Down
5 changes: 2 additions & 3 deletions cmpp/cmpp20/pdu_connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ func (p *PduConnect) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(p.Header.CommandID))
buf.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, buf)
buf.WriteFixedLenString(p.SourceAddr, 6)
buf.WriteFixedLenString(p.AuthenticatorSource, 16)
buf.WriteUint8(p.Version)
Expand Down Expand Up @@ -77,7 +76,7 @@ func (pr *PduConnectResp) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteBytes(pr.Header.Bytes())
cmpp.WriteHeaderNoLength(pr.Header, buf)
buf.WriteUint8(pr.Status)
buf.WriteFixedLenString(pr.AuthenticatorISMG, 16)
buf.WriteUint8(pr.Version)
Expand Down
7 changes: 3 additions & 4 deletions cmpp/cmpp20/pdu_deliver.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ func (p *PduDeliver) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(p.Header.CommandID))
b.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, b)

b.WriteUint64(p.MsgID)
b.WriteFixedLenString(p.DestID, 21)
b.WriteFixedLenString(p.ServiceID, 10)
Expand Down Expand Up @@ -121,8 +121,7 @@ func (pr *PduDeliverResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(pr.Header.CommandID))
b.WriteUint32(pr.Header.SequenceID)
cmpp.WriteHeaderNoLength(pr.Header, b)
b.WriteUint64(pr.MsgID)
b.WriteUint8(pr.Result)

Expand Down
30 changes: 2 additions & 28 deletions cmpp/cmpp20/pdu_query.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cmpp20

import (
protocol "github.com/hujm2023/go-sms-protocol"
"github.com/hujm2023/go-sms-protocol/cmpp"
"github.com/hujm2023/go-sms-protocol/packet"
)
Expand All @@ -26,8 +25,7 @@ func (p *PduQuery) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(p.Header.CommandID))
b.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, b)
b.WriteFixedLenString(p.Time, 8)
b.WriteUint8(p.QueryType)
b.WriteFixedLenString(p.QueryCode, 10)
Expand All @@ -49,29 +47,6 @@ func (p *PduQuery) IDecode(data []byte) error {
return b.Error()
}

func (p *PduQuery) GetHeader() cmpp.Header {
return p.Header
}

func (p *PduQuery) GetSequenceID() uint32 {
return p.GetHeader().SequenceID
}

func (p *PduQuery) GetCommandID() cmpp.CommandID {
return cmpp.CommandQuery
}

func (p *PduQuery) GenerateResponseHeader() protocol.PDU {
resp := &PduQueryResp{
Header: cmpp.NewHeader(MaxQueryRespLength, cmpp.CommandQueryResp, p.GetSequenceID()),
}
return resp
}

func (p *PduQuery) MaxLength() uint32 {
return MaxQueryLength
}

func (p *PduQuery) SetSequenceID(sid uint32) {
p.Header.SequenceID = sid
}
Expand Down Expand Up @@ -119,8 +94,7 @@ func (p *PduQueryResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(p.Header.CommandID))
b.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, b)
b.WriteFixedLenString(p.Time, 8)
b.WriteUint8(p.QueryType)
b.WriteFixedLenString(p.QueryCode, 10)
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp20/pdu_submit.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,7 @@ func (p *PduSubmit) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(p.Header.CommandID))
b.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, b)
b.WriteUint64(p.MsgID)
b.WriteUint8(p.PkTotal)
b.WriteUint8(p.PkNumber)
Expand Down Expand Up @@ -189,8 +188,7 @@ func (pr *PduSubmitResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(pr.Header.CommandID))
b.WriteUint32(pr.Header.SequenceID)
cmpp.WriteHeaderNoLength(pr.Header, b)
b.WriteUint64(pr.MsgID)
b.WriteUint8(pr.Result)

Expand Down
3 changes: 1 addition & 2 deletions cmpp/cmpp20/pdu_terminate.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ func (p *PduTerminate) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(p.Header.CommandID))
buf.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, buf)

return buf.BytesWithLength()
}
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_activetest.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ func (p *ActiveTest) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(p.Header.CommandID))
buf.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, buf)

return buf.BytesWithLength()
}
Expand Down Expand Up @@ -47,8 +46,7 @@ func (pr *ActiveTestResp) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(pr.Header.CommandID))
buf.WriteUint32(pr.Header.SequenceID)
cmpp.WriteHeaderNoLength(pr.Header, buf)
buf.WriteUint8(pr.Reserved)

return buf.BytesWithLength()
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_cancel.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ func (c *Cancel) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(c.Header.CommandID))
b.WriteUint32(c.Header.SequenceID)
cmpp.WriteHeaderNoLength(c.Header, b)
b.WriteUint64(c.MsgID)
return b.BytesWithLength()
}
Expand Down Expand Up @@ -62,8 +61,7 @@ func (c *CancelResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(c.Header.CommandID))
b.WriteUint32(c.Header.SequenceID)
cmpp.WriteHeaderNoLength(c.Header, b)
b.WriteUint32(c.SuccessID)
return b.BytesWithLength()
}
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ func (p *Connect) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(p.Header.CommandID))
buf.WriteUint32(p.Header.SequenceID)
cmpp.WriteHeaderNoLength(p.Header, buf)
buf.WriteFixedLenString(p.SourceAddr, 6)
buf.WriteFixedLenString(p.AuthenticatorSource, 16)
buf.WriteUint8(p.Version)
Expand Down Expand Up @@ -86,8 +85,7 @@ func (c *ConnectResp) IEncode() ([]byte, error) {
buf := packet.NewPacketWriter()
defer buf.Release()

buf.WriteUint32(uint32(c.Header.CommandID))
buf.WriteUint32(c.Header.SequenceID)
cmpp.WriteHeaderNoLength(c.Header, buf)
buf.WriteUint32(c.Status)
buf.WriteFixedLenString(c.AuthenticatorISMG, 16)
buf.WriteUint8(c.Version)
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_deliver.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@ func (d *Deliver) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(d.Header.CommandID))
b.WriteUint32(d.Header.SequenceID)
cmpp.WriteHeaderNoLength(d.Header, b)
b.WriteUint64(d.MsgID)
b.WriteFixedLenString(d.DestID, 21)
b.WriteFixedLenString(d.ServiceID, 10)
Expand Down Expand Up @@ -137,8 +136,7 @@ func (d *DeliverResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(d.Header.CommandID))
b.WriteUint32(d.Header.SequenceID)
cmpp.WriteHeaderNoLength(d.Header, b)
b.WriteUint64(d.MsgID)
b.WriteUint32(d.Result)

Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ func (q *Query) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(q.Header.CommandID))
b.WriteUint32(q.Header.SequenceID)
cmpp.WriteHeaderNoLength(q.Header, b)
b.WriteFixedLenString(q.Time, 8)
b.WriteUint8(q.QueryType)
b.WriteFixedLenString(q.QueryCode, 10)
Expand Down Expand Up @@ -119,8 +118,7 @@ func (q *QueryResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(q.Header.CommandID))
b.WriteUint32(q.Header.SequenceID)
cmpp.WriteHeaderNoLength(q.Header, b)
b.WriteFixedLenString(q.Time, 8)
b.WriteUint8(q.QueryType)
b.WriteFixedLenString(q.QueryCode, 10)
Expand Down
6 changes: 2 additions & 4 deletions cmpp/cmpp30/pdu_submit.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,7 @@ func (s *Submit) IDecode(data []byte) error {
func (s *Submit) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()

b.WriteUint32(uint32(s.Header.CommandID))
b.WriteUint32(s.Header.SequenceID)
cmpp.WriteHeaderNoLength(s.Header, b)
b.WriteUint64(s.MsgID)
b.WriteUint8(s.PkTotal)
b.WriteUint8(s.PkNumber)
Expand Down Expand Up @@ -206,8 +205,7 @@ func (s *SubmitResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(s.Header.CommandID))
b.WriteUint32(s.Header.SequenceID)
cmpp.WriteHeaderNoLength(s.Header, b)
b.WriteUint64(s.MsgID)
b.WriteUint32(s.Result)

Expand Down
8 changes: 4 additions & 4 deletions cmpp/cmpp30/pdu_terminate.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ func (t *Terminate) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(t.Header.CommandID))
b.WriteUint32(t.Header.SequenceID)
cmpp.WriteHeaderNoLength(t.Header, b)

return b.BytesWithLength()
}

Expand All @@ -52,8 +52,8 @@ func (t *TerminateResp) IEncode() ([]byte, error) {
b := packet.NewPacketWriter()
defer b.Release()

b.WriteUint32(uint32(t.Header.CommandID))
b.WriteUint32(t.Header.SequenceID)
cmpp.WriteHeaderNoLength(t.Header, b)

return b.BytesWithLength()
}

Expand Down
13 changes: 12 additions & 1 deletion cmpp/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const (

var ErrIllegalHeaderLength = errors.New("cmpp2 header length is invalid")

// Header CMPP PduCMPP 的公共 header
// Header for CMPP.
type Header struct {
// 4 字节,消息总长度
TotalLength uint32
Expand Down Expand Up @@ -82,3 +82,14 @@ func ReadHeader(r *packet.Reader) Header {
h.SequenceID = r.ReadUint32()
return h
}

func WriteHeader(h Header, buf *packet.Writer) {
buf.WriteUint32(h.TotalLength)
buf.WriteUint32(uint32(h.CommandID))
buf.WriteUint32(h.SequenceID)
}

func WriteHeaderNoLength(h Header, buf *packet.Writer) {
buf.WriteUint32(uint32(h.CommandID))
buf.WriteUint32(h.SequenceID)
}
12 changes: 6 additions & 6 deletions codec/smpp.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"fmt"
"io"

"github.com/hujm2023/go-sms-protocol/smpp/smpp34"
"github.com/hujm2023/go-sms-protocol/smpp"
)

type SMPPCodec struct{}
Expand All @@ -18,8 +18,8 @@ func NewSMPPCodec() *SMPPCodec {
// reading a complete SMPP packet from the ConnReader.
// If the data is incomplete, it will return ErrPacketNotComplete.
func (cc *SMPPCodec) Decode(c ConnReader) ([]byte, error) {
totalLenBytes, _ := c.Peek(smpp34.MinSMPPHeaderLen)
if len(totalLenBytes) < smpp34.MinSMPPHeaderLen {
totalLenBytes, _ := c.Peek(smpp.MinSMPPHeaderLen)
if len(totalLenBytes) < smpp.MinSMPPHeaderLen {
return nil, ErrPacketNotComplete
}

Expand All @@ -45,19 +45,19 @@ func (cc *SMPPCodec) Decode(c ConnReader) ([]byte, error) {
}

func (cc *SMPPCodec) DecodeBlocked(c ConnReader) ([]byte, error) {
totalLenBytes := make([]byte, smpp34.MinSMPPHeaderLen)
totalLenBytes := make([]byte, smpp.MinSMPPHeaderLen)
_, err := io.ReadFull(c, totalLenBytes)
if err != nil {
return nil, err
}
totalLen := int(binary.BigEndian.Uint32(totalLenBytes))

left := make([]byte, totalLen)
_, err = io.ReadFull(c, left[smpp34.MinSMPPHeaderLen:])
_, err = io.ReadFull(c, left[smpp.MinSMPPHeaderLen:])
if err != nil {
return nil, err
}
copy(left[:smpp34.MinSMPPHeaderLen], totalLenBytes)
copy(left[:smpp.MinSMPPHeaderLen], totalLenBytes)

return left, nil
}
10 changes: 1 addition & 9 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,17 @@ go 1.18

require (
github.com/samber/lo v1.38.1
github.com/smartystreets/goconvey v1.8.1
github.com/stretchr/testify v1.8.4
github.com/valyala/bytebufferpool v1.0.0
golang.org/x/sync v0.5.0
golang.org/x/text v0.14.0
)

require (
github.com/gopherjs/gopherjs v1.17.2 // indirect
github.com/jtolds/gls v4.20.0+incompatible // indirect
github.com/smarty/assertions v1.15.0 // indirect
golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff // indirect
)
require github.com/kr/pretty v0.3.1 // indirect

require (
github.com/bytedance/mockey v1.2.9
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/spf13/cast v1.5.1
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
Loading

0 comments on commit 245ff0f

Please sign in to comment.