#include #include #include #include #include #include #include #include #include #include int happy = 0; int valid_fn (unsigned char fn) { switch (fn) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x08: case 0x39: case 0x09: case 0x43: case 0x45: case 0x4E: case 0x4F: case 0x50: case 0x40: case 0x3F: case 0x23: case 0x26: case 0x41: case 0x58: case 0x4C: case 0x56: case 0x76: case 0x49: return 1; } return 0; } int ackable (unsigned char fn) { switch (fn) { case 0x09: case 0x39: case 0x08: case 0x38: case 0x40: case 0x43: case 0x58: return 0; } return 1; } void ack (int fd) { char buf[3]; buf[0] = 0; buf[1] = 0x38; buf[2] = 0xff ^ buf[0] ^ buf[1]; write (fd, buf, sizeof (buf)); } int rx_pkt (int fd, unsigned char *pkt, unsigned len) { unsigned char parity = 0xff; unsigned i; for (i = 0; i < len; ++i) parity ^= pkt[i]; if (parity) return -1; happy++; for (i = 2; i < len - 1; ++i) { if ((pkt[i] > 31) && (pkt[i] < 127)) putchar (pkt[i]); else printf ("\\x%02x", pkt[i]); } printf ("\n"); if ((pkt[0] & 0x40) && ackable (pkt[1])) ack (fd); return 0; } int rx (int fd) { static unsigned char pkt[67]; static unsigned ptr; unsigned char byte; unsigned len; if (read (fd, &byte, 1) != 1) { ptr = 0; return -1; } pkt[ptr++] = byte; if (ptr > 2 && !valid_fn (pkt[1])) { ptr = 0; return 0; } len = pkt[0] & 0x3f; if (ptr == (len + 3)) { ptr = 0; return rx_pkt (fd, pkt, len + 3); } return 0; } int transact (int fd, int ack, unsigned char fn, void *data, unsigned len, int timeout) { struct timeval tv = {0}; int rc; fd_set rfds; unsigned char buf[67], parity; unsigned i; happy = 0; tv.tv_sec = timeout; buf[0] = len; if (ack) buf[0] |= 0x40; buf[1] = fn; memcpy (&buf[2], data, len); parity = 0xff; for (i = 0; i < (len + 2); ++i) parity ^= buf[i]; buf[i] = parity; i++; write (fd, buf, i); fwrite (data, 1, len, stdout); printf (" => "); fflush (stdout); while (!happy) { FD_ZERO (&rfds); FD_SET (fd, &rfds); rc = select (fd + 1, &rfds, NULL, NULL, &tv); if (!rc) break; rx (fd); } return happy; } int main (int argc, char *argv[]) { struct sockaddr_in sin; int fd; unsigned char buf[128]; fd = socket (PF_INET, SOCK_STREAM, 0); sin.sin_family = AF_INET; sin.sin_port = htons (10005); inet_aton ("10.32.52.66", &sin.sin_addr); connect (fd, (struct sockaddr *)&sin, sizeof (sin)); transact (fd, 1, 0x3f, "543210", 6, 4); transact (fd, 1, 0x43, "SA", 2, 4); transact (fd, 1, 0x3f, "543210", 6, 4); transact (fd, 1, 0x43, "SA91", 4, 4); transact (fd, 1, 0x3f, "543210", 6, 4); transact (fd, 1, 0x43, "SA92", 4, 4); if (argc == 2) { sprintf (buf, "SA1*%s", argv[1]); transact (fd, 1, 0x3f, "543210", 6, 4); transact (fd, 1, 0x43, buf, strlen (buf), 4); } close (fd); }