package main import ( "encoding/binary" "encoding/hex" "fmt" "log" "net" "time" ) const maxSize = 240 var service = "192.168.240.20:33333" /* 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 */ func msg(c net.Conn, b []byte) []byte { size := int16(len(b)) enc := binary.BigEndian fmt.Println(">>> Send") fmt.Println(hex.Dump(b)) if err := binary.Write(c, enc, size); err != nil { log.Fatal(err) } if err := binary.Write(c, enc, b); err != nil { log.Fatal(err) } if err := binary.Read(c, enc, &size); err != nil { log.Fatal(err) } r := make([]byte, size) if err := binary.Read(c, enc, r); err != nil { log.Fatal(err) } fmt.Println("<<< Recv") fmt.Println(hex.Dump(r)) return r } func main() { c, err := net.Dial("tcp", service) if err != nil { log.Fatal(err) } defer c.Close() msg(c, associate) time.Sleep(time.Second) msg(c, release) }