4 from select import poll, POLLIN, POLLERR, POLLHUP, POLLPRI
5 from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
6 from struct import pack, unpack
22 def answer_setup(data):
23 return bytes.fromhex("0300310000000000000000000000000000000000000000000000003b3b3b")
25 def handle_packet(packet, addr, when):
26 xx, length, proto = unpack("!2sBB", packet[:4])
29 if xx != b"xx" or crlf != b"\r\n" or (length > 1 and len(packet) != length + 2):
30 print("bad packet:", packet.hex())
31 print("length", length, "proto", hex(proto))
38 print("imei", data[:-1].hex(), "ver", data[-1:].hex())
40 payload = answer_setup(data)
41 length = len(payload)+1
44 return b"xx" + pack("B", length) + pack("B", proto) + payload + b"\r\n"
46 if __name__ == "__main__":
47 ctlsock = socket(AF_INET, SOCK_STREAM)
48 ctlsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
49 ctlsock.bind(("", PORT))
51 ctlfd = ctlsock.fileno()
53 pollset.register(ctlfd, POLLIN | POLLERR | POLLHUP | POLLPRI)
57 events = pollset.poll(1000)
58 except KeyboardInterrupt:
64 clntsock, clntaddr = ctlsock.accept()
65 clntfd = clntsock.fileno()
66 clnt_dict[clntfd] = (clntsock, clntaddr)
67 pollset.register(clntfd, POLLIN | POLLERR | POLLHUP | POLLPRI)
68 print("accepted connection from", clntaddr, "fd", clntfd)
70 print("unexpected event on ctlfd:", ev)
73 clntsock, clntaddr = clnt_dict[fd]
74 except KeyError: # this socket closed already
77 packet = clntsock.recv(4096)
79 print("packet", packet, "from", clntaddr, "from fd", fd)
81 response = handle_packet(packet, clntaddr, when)
84 # Ignore possibility of blocking
85 clntsock.send(response)
87 print("sending to socket", fd, "error", e)
90 pollset.unregister(fd)
94 print("unexpected event", ev, "on fd", fd)