aboutsummaryrefslogtreecommitdiff
path: root/pbx/main.go
blob: b65bac6a0cee6190a2cb23b3709dc96894249e33 (plain)
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
package main

import (
	"flag"
	"log"

	"dim13.org/asn1/acse"
	"dim13.org/asn1/csta"
	"dim13.org/asn1/rose"
	"dim13.org/asn1/spdu"

	"github.com/dim13/asn1"
)

var pbx = flag.String("pbx", "192.168.240.20:33333", "PBX CTI Service")

const (
	AARQ   = 0x60
	AARE   = 0x61
	RLRQ   = 0x62
	RLRE   = 0x63
	ABRT   = 0x64
	Invoke = 0xa1
	Result = 0xa2
)

func main() {
	flag.Parse()
	conn, err := spdu.Dial(*pbx)
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	aare, _ := acse.Associate()
	conn.Write(aare)

	var connected bool
	for {
		buf, err := spdu.ReadAll(conn)
		if err != nil {
			log.Fatal(err)
		}
		switch buf[0] {
		case AARQ:
		case AARE:
			result, _ := acse.AssociateResult(buf)
			connected = result == acse.AssociateResultAccepted
		case RLRQ:
		case RLRE:
		case ABRT:
			connected = false
		case Invoke:
			id, opcode, payload, err := rose.Unmarshal(buf)
			if err != nil {
				log.Fatal(err)
			}
			switch opcode {
			case csta.SystemStatusOpcode:
				ss := &csta.SystemStatusArg{}
				_, err := asn1.Unmarshal(payload, ss)
				if err != nil {
					log.Fatal(err)
				}
				log.Println(id, "System Status", csta.SystemStatus(ss.SystemStatus))
				null, _ := asn1.Marshal(asn1.Null{})
				res, err := rose.Marshal(id, opcode, null)
				if err != nil {
					log.Fatal(err)
				}
				conn.Write(res)
			default:
				log.Println("Opcode", opcode, payload)
			}
		case Result:
		}
		if !connected {
			log.Fatal("EOT")
		}
	}
}