189 lines
4.4 KiB
Go
189 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"log"
|
|
"sync"
|
|
"time"
|
|
|
|
"smpptester/client"
|
|
"smpptester/pdu"
|
|
)
|
|
|
|
func init() {
|
|
log.SetFlags(log.Lmicroseconds | log.Lshortfile)
|
|
}
|
|
|
|
// Function to create a submit_sm PDU
|
|
func createSubmitSMPDU() []byte {
|
|
// Example values for the submit_sm PDU fields
|
|
serviceType := "CMT"
|
|
sourceAddrTON := byte(0x01)
|
|
sourceAddrNPI := byte(0x01)
|
|
sourceAddr := "12345"
|
|
destAddrTON := byte(0x01)
|
|
destAddrNPI := byte(0x01)
|
|
destinationAddr := "67890"
|
|
esmClass := byte(0x00)
|
|
protocolID := byte(0x00)
|
|
priorityFlag := byte(0x00)
|
|
scheduleDeliveryTime := ""
|
|
validityPeriod := ""
|
|
registeredDelivery := byte(0x01)
|
|
replaceIfPresentFlag := byte(0x00)
|
|
dataCoding := byte(0x01)
|
|
smDefaultMsgID := byte(0x00)
|
|
shortMessage := "Hello, SMPP!"
|
|
|
|
// Calculate the length of the PDU
|
|
headerLength := 16
|
|
bodyLength := 1 + len(serviceType) + 1 + 1 + len(sourceAddr) + 1 + 1 + len(destinationAddr) + 1 + 1 + len(scheduleDeliveryTime) + 1 + len(validityPeriod) + 1 + 1 + 1 + 1 + 1 + len(shortMessage)
|
|
totalLength := headerLength + bodyLength
|
|
|
|
// Create a buffer to hold the PDU
|
|
var buffer bytes.Buffer
|
|
|
|
// Command Length
|
|
binary.Write(&buffer, binary.BigEndian, uint32(totalLength))
|
|
|
|
// Command ID (submit_sm)
|
|
binary.Write(&buffer, binary.BigEndian, uint32(0x00000004))
|
|
|
|
// Command Status (0x00000000 for ESME_ROK)
|
|
binary.Write(&buffer, binary.BigEndian, uint32(0x00000000))
|
|
|
|
// Sequence Number (example value)
|
|
binary.Write(&buffer, binary.BigEndian, uint32(0x00000001))
|
|
|
|
// Service Type
|
|
buffer.WriteString(serviceType)
|
|
buffer.WriteByte(0x00)
|
|
|
|
// Source Address TON
|
|
buffer.WriteByte(sourceAddrTON)
|
|
|
|
// Source Address NPI
|
|
buffer.WriteByte(sourceAddrNPI)
|
|
|
|
// Source Address
|
|
buffer.WriteString(sourceAddr)
|
|
buffer.WriteByte(0x00)
|
|
|
|
// Destination Address TON
|
|
buffer.WriteByte(destAddrTON)
|
|
|
|
// Destination Address NPI
|
|
buffer.WriteByte(destAddrNPI)
|
|
|
|
// Destination Address
|
|
buffer.WriteString(destinationAddr)
|
|
buffer.WriteByte(0x00)
|
|
|
|
// ESM Class
|
|
buffer.WriteByte(esmClass)
|
|
|
|
// Protocol ID
|
|
buffer.WriteByte(protocolID)
|
|
|
|
// Priority Flag
|
|
buffer.WriteByte(priorityFlag)
|
|
|
|
// Schedule Delivery Time
|
|
buffer.WriteString(scheduleDeliveryTime)
|
|
buffer.WriteByte(0x00)
|
|
|
|
// Validity Period
|
|
buffer.WriteString(validityPeriod)
|
|
buffer.WriteByte(0x00)
|
|
|
|
// Registered Delivery
|
|
buffer.WriteByte(registeredDelivery)
|
|
|
|
// Replace If Present Flag
|
|
buffer.WriteByte(replaceIfPresentFlag)
|
|
|
|
// Data Coding
|
|
buffer.WriteByte(dataCoding)
|
|
|
|
// SM Default Message ID
|
|
buffer.WriteByte(smDefaultMsgID)
|
|
|
|
// Short Message Length
|
|
buffer.WriteByte(byte(len(shortMessage)))
|
|
|
|
// Short Message
|
|
buffer.WriteString(shortMessage)
|
|
|
|
// Return the PDU as a byte slice
|
|
return buffer.Bytes()
|
|
}
|
|
|
|
func main() {
|
|
// addr := ":2775"
|
|
// listener, err := net.Listen("tcp", addr)
|
|
// if err != nil {
|
|
// log.Fatalf("Failed to start SMPP server: %v", err)
|
|
// }
|
|
// defer listener.Close()
|
|
// log.Printf("SMPP server started on %s", addr)
|
|
|
|
// go func() {
|
|
// for {
|
|
// conn, err := listener.Accept()
|
|
// if err != nil {
|
|
// log.Printf("Failed to accept connection: %v", err)
|
|
// continue
|
|
// }
|
|
// go handleConnection(conn)
|
|
// }
|
|
// }()
|
|
submit := &pdu.SUBMIT_SM{
|
|
Header: &pdu.PDU_HEADER{
|
|
Command_length: 0,
|
|
Command_id: 4,
|
|
Command_status: 0,
|
|
Sequence_number: 1,
|
|
},
|
|
Service_type: "hehe",
|
|
Source_addr_ton: 0x01,
|
|
Source_addr_npi: 0x01,
|
|
Source_addr: "12345",
|
|
Dest_addr_ton: 0x01,
|
|
Dest_addr_npi: 0x01,
|
|
Destination_addr: "67890",
|
|
Esm_class: 0x00,
|
|
Protocol_id: 0x00,
|
|
Priority_flag: 0x00,
|
|
Schedule_delivery_time: "",
|
|
Validity_period: "",
|
|
Registered_delivery: 0x01,
|
|
Replace_if_present: 0x00,
|
|
Data_coding: 0x01,
|
|
Sm_default_msg_id: 0x00,
|
|
Short_message: "Hello, SMPP!",
|
|
}
|
|
submit.UpdateSize()
|
|
buf := pdu.ByteBufferPool.Get(submit.Size())
|
|
defer pdu.ByteBufferPool.Put(buf)
|
|
submit.Encode(buf)
|
|
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(1)
|
|
|
|
client := client.NewSMPPClient("localhost:2775", 1)
|
|
client.Enable()
|
|
for {
|
|
if client.Connected {
|
|
err := client.Send(submit)
|
|
if err != nil {
|
|
log.Printf("Failed to send PDU: %v", err)
|
|
}
|
|
}
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
log.Println("Are we done")
|
|
|
|
wg.Wait()
|
|
}
|