Procházet zdrojové kódy

Added a major packet type and cleaned up

Grissess před 10 roky
rodič
revize
b3606eb073
6 změnil soubory, kde provedl 69 přidání a 12 odebrání
  1. 1 0
      .gitignore
  2. 8 2
      broadcast.py
  3. 27 3
      client.c
  4. 24 5
      client.py
  5. 9 2
      packet.py
  6. binární
      packet.pyc

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@ client
 *.xml
 *.swp
 *.swo
+*.pyc

+ 8 - 2
broadcast.py

@@ -5,7 +5,7 @@ import time
 import xml.etree.ElementTree as ET
 import threading
 
-from packet import Packet, CMD
+from packet import Packet, CMD, itos
 
 PORT = 13676
 if len(sys.argv) > 2:
@@ -32,7 +32,13 @@ except socket.timeout:
 
 print 'Clients:'
 for cl in clients:
-	print cl
+	print cl,
+        s.sendto(str(Packet(CMD.CAPS)), cl)
+        data, _ = s.recvfrom(4096)
+        pkt = Packet.FromStr(data)
+        print 'ports', pkt.data[0],
+        print 'type', itos(pkt.data[1]),
+        print 'uid', ''.join([itos(i) for i in pkt.data[2:]]).rstrip('\x00')
 	if sys.argv[1] == '-t':
 		s.sendto(str(Packet(CMD.PLAY, 0, 250000, 440, 255)), cl)
 		time.sleep(0.25)

+ 27 - 3
client.c

@@ -13,12 +13,16 @@
 #define CLK_FREQ 1193180
 
 int term;
+static int ident = 0x42454550;
 
-enum cmd_t {CMD_KA, CMD_PING, CMD_QUIT, CMD_PLAY};
+enum cmd_t {CMD_KA, CMD_PING, CMD_QUIT, CMD_PLAY, CMD_CAPS};
 
 struct cmd_buffer {
 	int cmd;
-	int data[8];
+	union {
+		int data[8];
+		char string[8*sizeof(int)];
+	};
 };
 
 void sigalrm(int sig) {
@@ -27,11 +31,15 @@ void sigalrm(int sig) {
 
 int main(int argc, char **argv) {
 	struct sockaddr_in addr, remote;
-	int sock, rlen = sizeof(remote), i;
+	int sock, rlen = sizeof(remote), i, len_uid = 0;
 	struct itimerval tmr;
 	struct cmd_buffer cmd;
 	struct sigaction sa;
 
+	if(argc > 1) {
+		len_uid = strlen(argv[1]);
+	}
+
 	if((term = open("/dev/console", O_WRONLY)) < 0) {
 		perror("open");
 		return 1;
@@ -80,6 +88,22 @@ int main(int argc, char **argv) {
 				setitimer(ITIMER_REAL, &tmr, NULL);
 				ioctl(term, KIOCSOUND, (int) (CLK_FREQ / cmd.data[2]));
 				break;
+
+			case CMD_CAPS:
+				cmd.data[0] = 1;
+				cmd.data[1] = ident;
+				for(i = 0; i < 6 * sizeof(int); i++) {
+					if(argc > 1 && i < len_uid) {
+						cmd.string[i+8] = argv[1][i];
+					} else {
+						cmd.string[i+8] = '\0';
+					}
+				}
+				for(i = 0; i < 8; i++) {
+					cmd.data[i] = htonl(cmd.data[i]);
+				}
+				sendto(sock, &cmd, sizeof(cmd), 0, (struct sockaddr *) &remote, rlen);
+				break;
 		
 			default:
 				printf("WARNING: Unknown cmd %d\n", cmd.cmd);

+ 24 - 5
client.py

@@ -9,9 +9,15 @@ import math
 import struct
 import socket
 
-from packet import Packet, CMD
+from packet import Packet, CMD, stoi
 
 PORT = 13676
+STREAMS = 1
+IDENT = 'TONE'
+if len(sys.argv) > 1:
+    UID = sys.argv[1].rfill(24, '\x00')
+else:
+    UID = '\x00'*24
 
 LAST_SAMP = 0
 FREQ = 0
@@ -63,23 +69,36 @@ pa = pyaudio.PyAudio()
 stream = pa.open(rate=RATE, channels=1, format=pyaudio.paInt32, output=True, frames_per_buffer=FPB, stream_callback=gen_data)
 
 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+sock.bind(('', PORT))
 
 signal.signal(signal.SIGALRM, sigalrm)
 
 while True:
-    data, cli = sock.recvfrom(4096)
+    data = ''
+    while not data:
+        try:
+            data, cli = sock.recvfrom(4096)
+        except socket.error:
+            pass
     pkt = Packet.FromStr(data)
     print 'From', cli, 'command', pkt.cmd
-    if pkt.cmd == KA:
+    if pkt.cmd == CMD.KA:
         pass
-    elif pkt.cmd == PING:
+    elif pkt.cmd == CMD.PING:
         sock.sendto(data, cli)
     elif pkt.cmd == CMD.QUIT:
         break
     elif pkt.cmd == CMD.PLAY:
         dur = pkt.data[0]+pkt.data[1]/1000000.0
         FREQ = pkt.data[2]
-        AMP = MAX * (pkt.data[2]/255.0)
+        AMP = MAX * (pkt.data[3]/255.0)
         signal.setitimer(signal.ITIMER_REAL, dur)
+    elif pkt.cmd == CMD.CAPS:
+        data = [0] * 8
+        data[0] = STREAMS
+        data[1] = stoi(IDENT)
+        for i in xrange(len(UID)/4):
+            data[i+2] = stoi(UID[4*i:4*(i+1)])
+        sock.sendto(str(Packet(CMD.CAPS, *data)), cli)
     else:
         print 'Unknown cmd', pkt.cmd

+ 9 - 2
packet.py

@@ -6,7 +6,7 @@ class Packet(object):
 	def __init__(self, cmd, *data):
 		self.cmd = cmd
 		self.data = data
-		if len(data) >= 8:
+		if len(data) > 8:
 			raise ValueError('Too many data')
 		self.data = list(self.data) + [0] * (8-len(self.data))
         @classmethod
@@ -20,4 +20,11 @@ class CMD:
 	KA = 0 # No important data
 	PING = 1 # Data are echoed exactly
 	QUIT = 2 # No important data
-	PLAY = 3 # seconds, microseconds, frequency (Hz), amplitude (0-255)
+	PLAY = 3 # seconds, microseconds, frequency (Hz), amplitude (0-255), port
+        CAPS = 4 # ports, client type (1), user ident (2-7)
+
+def itos(i):
+    return struct.pack('>L', i)
+
+def stoi(s):
+    return struct.unpack('>L', s)[0]

binární
packet.pyc