From dd0fe5add36e910e07d5ab29b888859c1b569a0b Mon Sep 17 00:00:00 2001 From: Teddy Date: Fri, 23 Aug 2013 09:48:11 +0800 Subject: more specific ptp --- server/client.py | 54 +++++++++++++++++--------------- server/piztor_server.py | 83 ++++++++++++++++++++++++++++++++----------------- server/ptp.rst | 39 ++++++++++++++++------- 3 files changed, 111 insertions(+), 65 deletions(-) diff --git a/server/client.py b/server/client.py index 5b3fde6..cfe9133 100644 --- a/server/client.py +++ b/server/client.py @@ -3,29 +3,33 @@ import sys from struct import * HOST, PORT = "localhost", 9999 -data = "" -sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - -#data = pack("!B", 0) -#data += "hello" -#data += "\0" -#data += "world" - -data = pack("!BLL", 1, 1234, 5678) -data += "hello, world!" - -#data = pack("!BLdd", 2, 1234, 123.123, 12323.23222) -print data - -try: - - sock.connect((HOST, PORT)) - sock.sendall(data) - sock.shutdown(socket.SHUT_WR) - received = sock.recv(1024) -finally: - sock.close() - -print "Sent: {}".format(data) -print "Received: {}".format(received[0]) +def gen_auth(username, password): + data = pack("!B", 0) + data += username + data += "\0" + data += password + return data + +def gen_update_location(token, lat, lont): + return pack("!BLdd", 2, token, lat, lont) + +def send(data): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((HOST, PORT)) + sock.sendall(data) + sock.shutdown(socket.SHUT_WR) + received = sock.recv(1024) + finally: + print "adf" + sock.close() + + print "Sent: {}".format(data) + print "Received: {}".format(received) + return received + +rec = send(gen_auth("hello", "world")) +opt, token, status = unpack("!BLB", rec) +token = 1 +send(gen_update_location(token, 23.33, -54.44)) diff --git a/server/piztor_server.py b/server/piztor_server.py index a19989a..ec6d1ae 100644 --- a/server/piztor_server.py +++ b/server/piztor_server.py @@ -2,7 +2,8 @@ import sqlalchemy import SocketServer, socket, select import struct -from sqlalchemy import create_engine, Column, Integer, String +from sqlalchemy import create_engine +from sqlalchemy import Column, Integer, String, Float from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker @@ -29,29 +30,27 @@ class ReqInvalidError(ConnectionError): class TokenInvalidError(ConnectionError): def __init__(self): - super(ReqInvalidError, self).__init__("Invalid token") + super(TokenInvalidError, self).__init__("Invalid token") class DataManager(object): - pass + def __init__(self, piz_srv): + self.piz_srv = piz_srv class UserManager(DataManager): + class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key = True) username = Column(String) password = Column(String) - def get_uid_by_token(self, token): + def get_user_by_token(self, token): try: - return self.active_sessions[token] + return self.piz_srv.active_sessions[token] except: raise TokenInvalidError() - def __init__(self): - Base.metadata.create_all(engine) - self.active_sessions = dict() - - def authentication_handle(self, opt_type, data, srv): + def authentication_handle(self, opt_type, data): print "Parsing User Data" pos = -1 for i in xrange(0, len(data)): @@ -70,16 +69,21 @@ class UserManager(DataManager): print (username, password) session = Session() - q = session.query(User).filter(User.username == username) + q = session.query(UserManager.User). \ + filter(UserManager.User.username == username) entry = q.first() if entry.password != password: # Auth failed - return struct.pack("!BL" - - return struct.pack("!BL", 0, 1234) + print "Login failed!" + return struct.pack("!BlB", 0, 0, 1) + else: # Succeeded + print "Logged in sucessfully!" + token = entry.id + self.piz_srv.active_sessions[token] = entry + return struct.pack("!BlB", 0, token, 0) class MesgManager(DataManager): - def mesg_sending_handle(self, opt_type, data, srv): + def mesg_sending_handle(self, opt_type, data): print "Parsing Mesg Data" try: if len(data) < 8: @@ -92,28 +96,39 @@ class MesgManager(DataManager): raise ReqInvalidError() class LocationManager(DataManager): - def location_update_handle(self, opt_type, data, srv): + + class LocationInfo(Base): + __tablename__ = "location_info" + uid = Column(Integer, primary_key = True) + lat = Column(Float(precesion = 64)) + lng = Column(Float(precesion = 64)) + # More: last_update + + def location_update_handle(self, opt_type, data): print "Parsing Loc Data" try: if len(data) < 8: raise ReqInvalidError() - sender_token, lat, lont = struct.unpack("!Ldd", data) - print (sender_token, lat, lont) + sender_token, lat, lng = struct.unpack("!Ldd", data) + print "Updateing location data with following info:" + print (sender_token, lat, lng) + + user = self.piz_srv. \ + user_mgr.get_user_by_token(sender_token) + session = Session() + LInfo = LocationManager.LocationInfo + q = session.query(LInfo).filter(LInfo.uid == user.id) + entry = q.first() + entry.lat = lat + entry.lng = lng + session.commit() return struct.pack("!B", 2) - except struct.error: + except struct.error, TokenInvalidError: raise ReqInvalidError() - class PiztorServer(): - user_mgr = UserManager() - mesg_mgr = MesgManager() - location_mgr = LocationManager() - - mgr_map = [ user_mgr.authentication_handle, - mesg_mgr.mesg_sending_handle, - location_mgr.location_update_handle ] class GenericHandler(SocketServer.StreamRequestHandler): @@ -139,16 +154,28 @@ class PiztorServer(): if len(data) < 1: raise ReqInvalidError() opt_id = struct.unpack("!B", data[0])[0] - reply = PiztorServer.mgr_map[opt_id](opt_id, data[1:], self) + reply = self.piz_srv.mgr_map[opt_id](opt_id, data[1:]) sock.sendall(reply) sock.close() def __init__(self, host, port): + PiztorServer.GenericHandler.piz_srv = self srv = SocketServer.TCPServer((host, port), PiztorServer.GenericHandler) srv.timeout = 2 self.server = srv + self.user_mgr = UserManager(self) + self.mesg_mgr = MesgManager(self) + self.location_mgr = LocationManager(self) + + self.mgr_map = [ self.user_mgr.authentication_handle, + self.mesg_mgr.mesg_sending_handle, + self.location_mgr.location_update_handle ] + + Base.metadata.create_all(engine) + self.active_sessions = dict() + def run(self): try: diff --git a/server/ptp.rst b/server/ptp.rst index 741e41e..dc2f672 100644 --- a/server/ptp.rst +++ b/server/ptp.rst @@ -33,9 +33,14 @@ Piztor Transmission Protocol v0.1 :: - +--1b---+-----4b-----+---1b---+ - | 0x00 | USER_TOKEN | STATUS | - +-uchar-+-----int----+--uchar-+ + +--1b---+-----4b-----+---1b----+ + | 0x00 | USER_TOKEN | STATUS | + +-uchar-+-----int----+--uchar--+ + + STATUS: + + - 0x00 for success + - 0x01 for already logged in (kicked another online device) - Message Sending @@ -43,17 +48,22 @@ Piztor Transmission Protocol v0.1 :: - +--1b---+------4b------+------4b-----+ - | 0x01 | SENDER_TOKEN | RECEIVER_ID | - +-uchar-+------int-----+-----int-----+ + +--1b---+------4b------+------4b-----+-----?b-----+ + | 0x01 | SENDER_TOKEN | RECEIVER_ID | MSG_BODY | + +-uchar-+------int-----+-----int-----+------------+ - Response :: - +--1b---+----?b----+ - | 0x01 | RESERVED | - +-uchar-+----------+ + +--1b---+---1b---+ + | 0x01 | STATUS | + +-uchar-+--uchar-+ + + STATUS: + + - 0x00 for success + - 0x01 for invalid token - Location Update @@ -69,9 +79,14 @@ Piztor Transmission Protocol v0.1 :: - +--1b---+----?b----+ - | 0x02 | RESERVED | - +-uchar-+----------+ + +--1b---+---1b---+ + | 0x01 | STATUS | + +-uchar-+--uchar-+ + + STATUS: + + - 0x00 for success + - 0x01 for invalid token - Location Information -- cgit v1.2.3-70-g09d2