forked from CodeMonkeyKevin/smpp34
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pdu_utils.go
63 lines (51 loc) · 1.19 KB
/
pdu_utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package smpp34
import (
"github.com/esazykin/smpp34/gsmutil"
"math"
"crypto/rand"
)
func splitShortMessage(shortMessage string, params *Params) ([][]byte, error) {
dataCoding, ok := (*params)[DATA_CODING];
if !ok {
dataCoding = ENCODING_DEFAULT
}
var octetLimit int
var message []byte
switch dataCoding {
case ENCODING_DEFAULT:
octetLimit = 160
message = []byte(shortMessage)
break
case ENCODING_ISO10646:
octetLimit = 140
message = gsmutil.EncodeUcs2(shortMessage)
default:
octetLimit = 254
message = []byte(shortMessage)
}
messageLen := len(message)
if messageLen > octetLimit {
totalParts := byte(int(math.Ceil(float64(messageLen) / 134.0)))
(*params)[ESM_CLASS] = ESM_CLASS_GSMFEAT_UDHI
uid := make([]byte, 1)
_, err := rand.Read(uid)
if err != nil {
return nil, err
}
partNum := 1
parts := make([][]byte, 0)
for i := 0; i < messageLen; i += 134 {
start := i
end := i + 134
if end > messageLen {
end = messageLen
}
part := []byte{0x05, 0x00, 0x03, uid[0], totalParts, byte(partNum)}
part = append(part, message[start:end]...)
partNum++
parts = append(parts, part)
}
return parts, nil
}
return [][]byte{message}, nil
}