package main import ( "encoding/binary" "encoding/hex" "flag" "fmt" "log" "net" ) var service = flag.String("service", "192.168.240.20:33333", "PBX CTI Service") func init() { flag.Parse() } /* A-ASSOCIATE Request * * 60 23 AARQ-apdu * 80 02 07 08 protocol-version { version1 } * A1 07 application-context-name * 06 05 2B 0C 00 81 5A { 1 3 12 0 218 } * BE 14 user-information * 28 12 * 06 07 2B 0C 00 82 1D 81 48 derect-reference { 1 3 12 0 285 200 } * A0 07 single-ASN1-type * (ACSEUserInfomrationForCSTA) * A0 05 newDefinition * 03 03 00 08 00 cSTAVersion { versionFive } */ var associate = []byte{ 0x60, 0x23, 0x80, 0x02, 0x07, 0x80, 0xA1, 0x07, 0x06, 0x05, 0x2B, 0x0C, 0x00, 0x81, 0x5A, 0xBE, 0x14, 0x28, 0x12, 0x06, 0x07, 0x2B, 0x0C, 0x00, 0x82, 0x1D, 0x81, 0x48, 0xA0, 0x07, 0xA0, 0x05, 0x03, 0x03, 0x00, 0x08, 0x00, } /* A-ACCOCIATE Result * 61 2F AARE-apdu * 80 02 07 80 protocol-version { version1 } * A1 07 application-context-name * 06 05 2B 0C 00 81 5A { 1 3 12 0 218 } * A2 03 result * 02 01 00 accepted * A3 05 result-source-diagnostic * A1 03 acse-service-user * 02 01 00 no-reason-given * BE 14 user-information * 28 12 * 06 07 2B 0C 00 82 1D 81 48 direct-reference { 1 3 120 285 200 } * A0 07 single-ASN1-type * (ACSEUserInformationForCSTA) * A0 05 newDefinition * 03 03 00 08 00 cSTAVersion { versionFive } */ /* A-RELEASE Request * * 62 00 RLRQ-apdu */ var release = []byte{0x62, 0x00} /* A-RELEASE Result * * 63 00 RLRE-apdu */ /* SystemStatus Request * A1 0C ROSE-Invoke * 02 01 01 invokeId present: 1 * 02 02 00 D3 opcode local: 211 * 30 03 SystemStatusArgiment * 0A 01 02 systemStatus normal */ /* SystemStatus Result * A2 0B ROSE-ReturnResult * 02 01 01 invokeId present: 1 * 30 06 SystemStatusResult * 02 02 00 D3 opcode local: 211 * 05 00 noData */ var status = []byte{ 0xA2, 0x0B, 0x02, 0x01, 0x01, 0x30, 0x06, 0x02, 0x02, 0x00, 0xD3, 0x05, 0x00, } /* A-ABORT * 64 03 ABRT-apdu * 80 01 00 ABRT-source: acse-service-user */ var nbo = binary.BigEndian // Network Byte Order func send(c net.Conn, b []byte) { size := int16(len(b)) if err := binary.Write(c, nbo, size); err != nil { log.Fatal(err) } if err := binary.Write(c, nbo, b); err != nil { log.Fatal(err) } } func recv(c net.Conn) []byte { var size int16 if err := binary.Read(c, nbo, &size); err != nil { log.Fatal(err) } r := make([]byte, size) if err := binary.Read(c, nbo, r); err != nil { log.Fatal(err) } return r } func dump(b []byte, dir string) []byte { fmt.Println(dir) fmt.Println(hex.Dump(b)) return b } func main() { c, err := net.Dial("tcp", *service) if err != nil { log.Fatal(err) } defer c.Close() send(c, dump(associate, ">>> Send associate")) dump(recv(c), "<<< Recv associate") dump(recv(c), "<<< Recv status") send(c, dump(status, ">>> Send status")) send(c, dump(release, ">>> Send release")) dump(recv(c), "<<< Recv release") }