-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcallerid.go
84 lines (63 loc) · 1.52 KB
/
callerid.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
import (
"bytes"
"fmt"
"reflect"
"time"
)
type calleridData struct {
Time time.Time `json:"time" id:"1"`
Number string `json:"number" id:"2"`
NumberNotPresent string `json:"numberNotPresent" id:"4"` // O | P
Name string `json:"name" id:"7"`
NameNotPresent string `name:"string" id:"8"` // O | P
}
func calleridDataToBytes(data calleridData) []byte {
var b bytes.Buffer
t := reflect.TypeOf(data)
v := reflect.ValueOf(data)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
value := v.Field(i)
if !field.IsExported() {
continue
}
if value.IsZero() {
continue
}
id := field.Tag.Get("id")[0] - 48
b.WriteByte(id)
var val string
if time, ok := value.Interface().(time.Time); ok {
time = time.Local()
month := fmt.Sprint(int(time.Month()))
if len(month) == 1 {
month = "0" + month
}
day := fmt.Sprint(int(time.Day()))
if len(day) == 1 {
day = "0" + day
}
hour := fmt.Sprint(int(time.Hour()))
if len(hour) == 1 {
hour = "0" + hour
}
minute := fmt.Sprint(int(time.Minute()))
if len(minute) == 1 {
minute = "0" + minute
}
val = fmt.Sprintf("%s%s%s%s", month, day, hour, minute)
} else {
val = value.Interface().(string)
}
b.WriteByte(byte(len(val)))
b.WriteString(val)
}
finalBytes := b.Bytes()
payload := append([]byte{0x80, byte(len(finalBytes))}, finalBytes...)
var checksum byte
for _, b := range payload {
checksum += b
}
return append(payload, -checksum)
}