def Loads(): try: global g_Account f = open(os.path.join(os.getcwd(), "account.data"), "rb") jsondata = f.read() f.close() g_Account = json.loads(jsondata) logger.Info("data read success.") except: logger.Info("init database") Dumps()
def on_connect(client: object, userdata: object, flags, respons_code: int): """Connection event handler Arguments: client {object} -- mqtt clinet userdata {object} -- unknown flags {[type]} -- unknown respons_code {int} -- status of connection """ print('status {0}'.format(respons_code)) log.Info('status {0}'.format(respons_code)) client.subscribe(TOPIC) log.Info("start to subscribe: " + TOPIC)
def Disconnected(self, sReason, bForceQuit=False): if not bForceQuit: self.WaitReconnect() else: logger.Info("real disconnect %s, r=%s, force=%s" % (self.m_ID, sReason, bForceQuit)) self.OnDisconnected() service.GetService('PlayerManager').DelPlayer(self.m_ID, sReason)
def WaitReconnect(self): if self.m_OfflineTime: return logger.Info("wait disconnect %s" % (self.m_ID)) timer.Unschedule(self.m_WaitConnectFlag) timer.Schedule(CFunction(CheckOffline, self.m_ID), 30000, self.m_WaitConnectFlag) self.m_OfflineTime = int(time.time())
def Dumps(): if not g_Account: return jsondata = json.dumps(g_Account) f = open(os.path.join(os.getcwd(), "account.data"), "wb") f.write(jsondata.encode("utf-8")) f.close() logger.Info("data write success.")
def Listen(self, iPort, sAddress = "127.0.0.1"): logger.Info("Server listen port %s"%(iPort)) self.m_Status = S_LISTEN self.m_Server = tcpserver.CTcpServer(sAddress, iPort, "client") # 注册两个回调函数,一个是有新链接进来时回调 # 另外一个是已经连上的有数据可读 self.m_Server.On("OnConnected", self.OnConnected) self.m_Server.On("OnDisconnected", self.OnDisconnected) self.m_Server.On("OnReadyRead", self.OnReadyRead)
def Disconnect(self, sReason): timer.Unschedule(self.m_ConnectedFlag) logger.Info("%s disconnect r=%s" % (self.m_ID, sReason)) oMgrServer = service.GetService("ServerManager") oTcpServer = oMgrServer.Get("client") oTcpServer.Disconnect(self.m_SocketID) oLinkMgr = service.GetService("LinkManager") oLinkMgr.DelLink(self.m_ID) oPlayerMgr = service.GetService('PlayerManager') oPlayerMgr.Disconnected(self.m_ProxyID, sReason)
def on_message(client: object, userdata: object, msg: str) -> None: """Message recieve event handler Arguments: client {object} -- mqtt clinet userdata {object} -- unknown msg {str} -- recieved message """ try: data = json.loads(msg.payload.decode("utf-8"))["data"] log.Info(data) if type(data) is str: # データが文字列で渡されてるので、そこだけ再度、オブジェクト化 data = json.loads(data) else: data = data[0] data = {key: value.strip() for key, value in data.items()} action = data[REQ_TYPE] if BUCKET_NAME in data: bucket_name = data[BUCKET_NAME] else: bucket_name = None log.Info("aciton='{0}', bucket_name='{1}'".format(action, bucket_name)) if action == "take_photo": file_name = "tmp.jpg" take_photo(file_name) if os.path.exists(file_name): upload_img_to_s3(file_name, bucket_name) log.Info("finish process for a take_req") else: log.Error("failed to take photo") else: log.Warn(data) except Exception: traceback.print_exc()
def __init__(self, argv): logger.Init() database.Init() service.Init() self.m_Status = S_NOTRUN self.m_Server = None self.m_EntryFunc = None logger.Info("Server Application Init") # 处理下退出的消息 signal.signal(signal.SIGINT, self.OnSignal) # 2 signal.signal(signal.SIGQUIT, self.OnSignal) # 3
def take_photo(file_name: str) -> None: """take a photo with picamera Arguments: file_name {str} -- file name of taked photo """ camera = None try: camera = picamera.PiCamera() camera.capture(file_name) log.Info(file_name) except Exception: log.Error("Failed to take a photo") finally: if not (camera is None): camera.close()
def upload_img_to_s3(file_name: str, bucket_name: str = None) -> None: """send image to amazon S3 Arguments: file_name {str} -- uploaded file name bucket_name {str} -- upload to this cuket Returns: None -- return value is nothing """ if not (bucket_name is None): send_command = SEND_COMMAND_TEMPLATE.format(file_name, bucket_name, PROFILE_NAME) else: send_command = SEND_COMMAND_TEMPLATE.format(file_name, DEFAULT_BUCKET, PROFILE_NAME) log.Info(send_command) subprocess.call(send_command, shell=True) return
def Exec(self): self.m_Server.Listen() while S_LISTEN == self.m_Status: # 处理定时器超时 try: timer.Frame() except Exception as e: traceback.print_exc() # 处理网络部分 try: self.m_Server.Frame() except Exception as e: traceback.print_exc() timer.MillisecondSleep(1) logger.Info("进程退出") self.m_Server.Exit()
def ConnectTimeout(iLinkID): timer.Unschedule("Connected_%s" % (iLinkID)) logger.Info("connect timeout %s" % (iLinkID)) oLinkMgr = service.GetService("LinkManager") oLinkObject = oLinkMgr.GetLink(iLinkID) oLinkObject.Disconnect("timeout")
def DelPlayer(self, uid, sReason): logger.Info("del player %s, r=%s" % (uid, sReason)) if not uid in self.m_Players: return del self.m_Players[uid]
def Exit(self): self.Close() logger.Info("关闭网络服务")
def OnConnected(self, oMsg): logger.Info("OnConnected") login.OnConnected(oMsg.m_SocketID)
def NetworkThread(oTcpServer): epoll = oTcpServer.m_Epoll oSocket = oTcpServer.m_ServerSocket container = oTcpServer.m_Sockets while oTcpServer.IsRunning(): try: # 处理需要退出的socket while not oTcpServer.m_QuitQueue.empty(): iSocketID = oTcpServer.m_QuitQueue.get() if not iSocketID in oTcpServer.m_SocketID2FD: continue fd = oTcpServer.m_SocketID2FD[iSocketID] if fd in container: oTcpSocket = container[fd] epoll.unregister(fd) oTcpSocket.m_Socket.close() del container[fd] del oTcpServer.m_SocketID2FD[oTcpSocket.m_ID] epoll_list = epoll.poll(0.1) # epoll 进行 fd 扫描的地方 扫描出能满足条件的套接字,添加进列表中 for fd, events in epoll_list: #对epoll列表中的文件描述符、事件进行扫描 if fd == oSocket.fileno(): oTcpServer.m_SocketID += 1 #表示有客户端连接了服务器套接字 conn, addr = oSocket.accept() oTcpSocket = tcpsocket.CTcpSocket(oTcpServer.m_SocketID, conn, addr) logger.Info( 'there has been a new cilent form [%s] %s %s %s' % (str(addr), oTcpSocket.m_ID, fd, conn.fileno())) container[conn.fileno()] = oTcpSocket oTcpServer.m_SocketID2FD[oTcpSocket.m_ID] = conn.fileno() epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET) oMsg = CNetWorkMessage(MSG_NEW, oTcpSocket.m_ID) oTcpServer.PushMessage(oMsg) elif events == select.EPOLLIN: #表示可以收取信息 oTcpSocket = container[fd] oClientSocket = oTcpSocket.m_Socket recvData = oClientSocket.recv(1024) if len(recvData) > 0: #logger.Info('massage from [%s] is %s'%(str(addr), str(recvData))) oMsg = CNetWorkMessage(MSG_READ, oTcpSocket.m_ID, Data=recvData) oTcpServer.PushMessage(oMsg) else: logger.Info('client[%s] was closed' % str(addr)) epoll.unregister(fd) oTcpSocket = container[fd] oTcpSocket.m_Socket.close() del container[fd] del oTcpServer.m_SocketID2FD[oTcpSocket.m_ID] oMsg = CNetWorkMessage(MSG_CLOSE, oTcpSocket.m_ID) oTcpServer.PushMessage(oMsg) except Exception as e: traceback.print_exc()
def ConnectedFinish(self): logger.Info("%s Connected finish" % (self.m_ID)) timer.Unschedule(self.m_ConnectedFlag) self.Heartbeat() self.StartCheckHeartbeat()
g_Data = bytes() g_Exit = False def NetworkThread(): global g_Data, g_Exit while True: recvdata = s.recv(1024) if not recvdata: return g_Data += recvdata print(type(recvdata), recvdata) data, pkglist = GetRecvPackage(g_Data) if not pkglist: continue g_Data = data print(pkglist) for pkgdata in pkglist: entry.OnEntry(s, pkgdata) g_Exit = True t = threading.Thread(target=NetworkThread, args=()) t.start() while not g_Exit: timer.Frame() timer.MillisecondSleep(1) s.close() logger.Info("Exit! Bye!~")