Documentation
¶
Overview ¶
Package smpp is an implementation of the SMPP 3.4 protocol.
Index ¶
- Constants
- Variables
- func EchoHandler(s Session, m pdu.Body)
- func NewLocalListener(port int) net.Listener
- type AuthRequestHandlerFunc
- type ClientConn
- type Closer
- type Conn
- type ConnMiddleware
- type ConnStatus
- type ConnStatusID
- type DeliverySetting
- type HandlerFunc
- type QueryResp
- type Reader
- type Receiver
- type RequestHandlerFunc
- type Server
- type Session
- type ShortMessage
- type Transceiver
- type Transmitter
- type UnsucessDest
- type Writer
Examples ¶
Constants ¶
const MaxDestinationAddress = 254
MaxDestinationAddress is the maximum number of destination addresses allowed in the submit_multi operation.
Variables ¶
var ( // ErrNotConnected is returned on attempts to use a dead connection. ErrNotConnected = errors.New("not connected") // ErrNotBound is returned on attempts to use a Transmitter, // Receiver or Transceiver before calling Bind. ErrNotBound = errors.New("not bound") )
var ( DefaultSystemID = "sys_id" IDLen = 16 )
Default settings.
var ErrMaxWindowSize = errors.New("reached max window size")
ErrMaxWindowSize is returned when an operation (such as Submit) violates the maximum window size configured for the Transmitter or Transceiver.
Functions ¶
func EchoHandler ¶
EchoHandler is the default Server RequestHandlerFunc, and echoes back any PDUs received.
func NewLocalListener ¶
Types ¶
type AuthRequestHandlerFunc ¶
AuthRequestHandlerFunc is the signature of a function passed to Server instances, that is called when a client is trying to bind to the server.
type ClientConn ¶
type ClientConn interface { // Bind starts the client connection and returns a // channel that is triggered every time the connection // status changes. Bind() <-chan ConnStatus // Closer embeds the Closer interface. When Close is // called, client sends the Unbind command first and // terminates the connection upon response, or 1s timeout. Closer }
ClientConn provides a persistent client connection that handles reconnection with a back-off algorithm.
type Closer ¶
type Closer interface { // Close terminates the connection. Close() error }
Closer is the interface that wraps the basic Close method.
type ConnMiddleware ¶
ConnMiddleware is useful for intercepting the traffic in/out happening for the SMPP server. It should be used in a read-only way since might effect the internal work of the SMPP server itself.
type ConnStatus ¶
type ConnStatus interface { Status() ConnStatusID Error() error }
ConnStatus is an abstract interface for a connection status change.
type ConnStatusID ¶
type ConnStatusID uint8
ConnStatusID represents a connection status change.
const ( Connected ConnStatusID = iota + 1 Disconnected ConnectionFailed BindFailed )
Supported connection statuses.
func (ConnStatusID) String ¶
func (cs ConnStatusID) String() string
String implements the Stringer interface.
type DeliverySetting ¶
type DeliverySetting uint8
DeliverySetting is used to configure registered delivery for short messages.
const ( NoDeliveryReceipt DeliverySetting = 0x00 FinalDeliveryReceipt DeliverySetting = 0x01 FailureDeliveryReceipt DeliverySetting = 0x02 )
Supported delivery settings.
type HandlerFunc ¶
HandlerFunc is the handler function that a Receiver calls when a new PDU arrives.
type Reader ¶
type Reader interface { // Read reads PDU binary data off the wire and returns it. Read() (pdu.Body, error) }
Reader is the interface that wraps the basic Read method.
type Receiver ¶
type Receiver struct { Addr string User string Passwd string SystemType string EnquireLink time.Duration TLS *tls.Config Handler HandlerFunc // contains filtered or unexported fields }
Receiver implements an SMPP client receiver.
Example ¶
f := func(p pdu.Body) { switch p.Header().ID { case pdu.DeliverSMID: f := p.Fields() src := f[pdufield.SourceAddr] dst := f[pdufield.DestinationAddr] txt := f[pdufield.ShortMessage] log.Printf("Short message from=%q to=%q: %q", src, dst, txt) } } r := &Receiver{ Addr: "localhost:2775", User: "foobar", Passwd: "secret", Handler: f, } conn := r.Bind() // make persistent connection. time.AfterFunc(10*time.Second, func() { r.Close() }) for c := range conn { log.Println("SMPP connection status:", c.Status()) }
Output:
func (*Receiver) Bind ¶
func (r *Receiver) Bind() <-chan ConnStatus
Bind starts the Receiver. It creates a persistent connection to the server, update its status via the returned channel, and calls the registered Handler when new PDU arrives.
Bind implements the ClientConn interface.
type RequestHandlerFunc ¶
RequestHandlerFunc is the signature of a function passed to Server instances, that is called when client PDU messages arrive.
type Server ¶
type Server interface { Addr() string Close() Handle(id pdu.ID, h RequestHandlerFunc) HandleAuth(id pdu.ID, h AuthRequestHandlerFunc) Start() Serve() Session(id string) Session }
type ShortMessage ¶
type ShortMessage struct { Src string Dst string DstList []string // List of destination addreses for submit multi DLs []string //List if destribution list for submit multi Text pdutext.Codec Validity time.Duration Register DeliverySetting OptParams pdufield.TLVMap // Other fields, normally optional. ServiceType string SourceAddrTON uint8 SourceAddrNPI uint8 DestAddrTON uint8 DestAddrNPI uint8 ESMClass uint8 ProtocolID uint8 PriorityFlag uint8 ScheduleDeliveryTime string ReplaceIfPresentFlag uint8 SMDefaultMsgID uint8 NumberDests uint8 // contains filtered or unexported fields }
ShortMessage configures a short message that can be submitted via the Transmitter. When returned from Submit, the ShortMessage provides Resp and RespID.
func (*ShortMessage) NumbUnsuccess ¶
func (sm *ShortMessage) NumbUnsuccess() (int, error)
NumbUnsuccess is a shortcut to Resp().Fields()pdufield.NoUnsuccess. Returns zero and an error if the response PDU is not available, or does not contain the NoUnsuccess field.
func (*ShortMessage) Resp ¶
func (sm *ShortMessage) Resp() pdu.Body
Resp returns the response PDU, or nil if not set.
func (*ShortMessage) RespID ¶
func (sm *ShortMessage) RespID() string
RespID is a shortcut to Resp().Fields()pdufield.MessageID. Returns empty if the response PDU is not available, or does not contain the MessageID field.
func (*ShortMessage) UnsuccessSmes ¶
func (sm *ShortMessage) UnsuccessSmes() ([]UnsucessDest, error)
UnsuccessSmes returns a list with the SME address(es) or/and Distribution List names to which submission was unsuccessful and the respective errors, when submit multi is used. Returns nil and an error if the response PDU is not available, or does not contain the unsuccess_sme field.
type Transceiver ¶
type Transceiver struct { Addr string User string Passwd string SystemType string EnquireLink time.Duration RespTimeout time.Duration TLS *tls.Config WindowSize uint Handler HandlerFunc ConnInterceptor ConnMiddleware Transmitter }
Transceiver implements an SMPP transceiver.
The API is a combination of the Transmitter and Receiver.
Example ¶
f := func(p pdu.Body) { switch p.Header().ID { case pdu.DeliverSMID: f := p.Fields() src := f[pdufield.SourceAddr] dst := f[pdufield.DestinationAddr] txt := f[pdufield.ShortMessage] log.Printf("Short message from=%q to=%q: %q", src, dst, txt) } } tx := &Transceiver{ Addr: "localhost:2775", User: "foobar", Passwd: "secret", Handler: f, } conn := tx.Bind() // make persistent connection. go func() { for c := range conn { log.Println("SMPP connection status:", c.Status()) } }() http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { sm, err := tx.Submit(&ShortMessage{ Src: r.FormValue("src"), Dst: r.FormValue("dst"), Text: pdutext.Raw(r.FormValue("text")), Register: FinalDeliveryReceipt, }) if err == ErrNotConnected { http.Error(w, "Oops.", http.StatusServiceUnavailable) return } if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } io.WriteString(w, sm.RespID()) }) log.Fatal(http.ListenAndServe(":8080", nil))
Output:
func (*Transceiver) Bind ¶
func (t *Transceiver) Bind() <-chan ConnStatus
Bind implements the ClientConn interface.
type Transmitter ¶
type Transmitter struct { Addr string User string Passwd string SystemType string EnquireLink time.Duration RespTimeout time.Duration TLS *tls.Config WindowSize uint // contains filtered or unexported fields }
Transmitter implements an SMPP client transmitter.
Example ¶
tx := &Transmitter{ Addr: "localhost:2775", User: "foobar", Passwd: "secret", } conn := <-tx.Bind() // make persistent connection. switch conn.Status() { case Connected: sm, err := tx.Submit(&ShortMessage{ Src: "sender", Dst: "recipient", Text: pdutext.Latin1("Olá mundo"), Register: NoDeliveryReceipt, }) if err != nil { log.Fatal(err) } log.Println("Message ID:", sm.RespID()) default: log.Fatal(conn.Error()) }
Output:
func (*Transmitter) Bind ¶
func (t *Transmitter) Bind() <-chan ConnStatus
Bind implements the ClientConn interface.
Any commands (e.g. Submit) attempted on a dead connection will return ErrNotConnected.
func (*Transmitter) Close ¶
func (t *Transmitter) Close() error
Close implements the ClientConn interface.
func (*Transmitter) QuerySM ¶
func (t *Transmitter) QuerySM(src, msgid string) (*QueryResp, error)
QuerySM queries the delivery status of a message. It requires the source address (sender) and message ID.
func (*Transmitter) Submit ¶
func (t *Transmitter) Submit(sm *ShortMessage) (*ShortMessage, error)
Submit sends a short message and returns and updates the given sm with the response status. It returns the same sm object.
func (*Transmitter) SubmitLongMsg ¶
func (t *Transmitter) SubmitLongMsg(sm *ShortMessage) (*ShortMessage, error)
SubmitLongMsg sends a long message (more than 140 bytes) and returns and updates the given sm with the response status. It returns the same sm object.
type UnsucessDest ¶
UnsucessDest contains information about unsuccessful delivery to an address when submit multi is used
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
Package pdu provide codecs for binary PDU data.
|
Package pdu provide codecs for binary PDU data. |
pdufield
Package pdufield provides PDU field codecs and utilities.
|
Package pdufield provides PDU field codecs and utilities. |
pdutext
Package pdutext provides text conversion for PDU fields.
|
Package pdutext provides text conversion for PDU fields. |
Package smpptest provides an SMPP test server.
|
Package smpptest provides an SMPP test server. |