def requestVideoCall(self): try: reqMsg = Message() reqMsg.Body = BodyEmpty() reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_VIDEO_STREAMING reqMsg.Header.BODYLEN = 0 # 스트리밍 연결 요청 MessageUtil.send(self.sockServer, reqMsg) # 통화음 또는 연결 화면 보이는 로직 필요 # 연결 수락 대기 rspMsg = MessageUtil.receive(self.sockServer) if rspMsg.Header.MSGTYPE != message.REP_VIDEO_STREAMING: print('Error') return False # 서버에서 수락하면 if rspMsg.Body.RESPONSE == message.ACCEPTED: return True # 서버에서 거절하면 else: return False except Exception as err: print("Exception") print(err) return False
def requestVoice(self): try: reqMsg = Message() reqMsg.Body = BodyEmpty() reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_GET_TOKEN reqMsg.Header.BODYLEN = 0 # 토큰 요청 MessageUtil.send(self.sockServer, reqMsg) # 요청 결과 rspMsg = MessageUtil.receive(self.sockServer) if rspMsg.Header.MSGTYPE != message.REP_GET_TOKEN: print('Error') return False # 서버에서 수락하면 if rspMsg.Body.RESPONSE == message.ACCEPTED: print('voice accept') # 보이스 전송 return True # 서버에서 거절하면 else: print('voice denied') return False except Exception as err: print("Exception") print(err) return False
def connectServer(self): self.sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: ret = -1 while ret != 0: ret = self.sockServer.connect_ex( (self.serverIp, self.serverPort)) time.sleep(2) reqMsg = Message() reqMsg.Body = BodyConnectRequest(None) reqMsg.Body.RESQUER_ID = '1' reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_CONNECT reqMsg.Header.BODYLEN = reqMsg.Body.getSize() MessageUtil.send(self.sockServer, reqMsg) rspMsg = MessageUtil.receive(self.sockServer) if rspMsg.Header.MSGTYPE != message.REP_CONNECT: print("Error") exit(0) if rspMsg.Body.RESPONSE != message.ACCEPTED: print("Connection is refused.") exit(0) print("Connected with server") return True except Exception as err: print("Exception") print(err) return False
def requestExitVideo(self): reqMsg = Message() reqMsg.Body = BodyEmpty() reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_EXIT_VIDEO_STREAMING reqMsg.Header.BODYLEN = 0 # Ending Video Stream MessageUtil.send(self.sockServer, reqMsg) # 요청 결과 rspMsg = MessageUtil.receive(self.sockServer) if rspMsg.Header.MSGTYPE != message.REP_EXIT_VIDEO_STREAMING: print('Error') return False print('exit video') return True
def returnToken(self): reqMsg = Message() reqMsg.Body = BodyEmpty() reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_RETURN_TOKEN reqMsg.Header.BODYLEN = 0 print("x") # 토큰 반납 요청 MessageUtil.send(self.sockServer, reqMsg) print("y") # 요청 결과 rspMsg = MessageUtil.receive(self.sockServer) if rspMsg.Header.MSGTYPE != message.REP_RETURN_TOKEN: print('Error') return False print('return accepted') return True
def handle(self): client = self.request try: while True: reqMsg = MessageUtil.receive(client) print(reqMsg.Header.MSGTYPE) if reqMsg == None: continue if reqMsg.Header.MSGTYPE == message.REQ_CALL: global REMOTE print(self.client_address[0]) REMOTE = self.client_address[0] q1.put(0) isAccepted = q2.get() rspMsg = Message() rspMsg.Body = BodyCommonResponse(None) if isAccepted: rspMsg.Body.RESPONSE = message.ACCEPTED else: rspMsg.Body.RESPONSE = message.DENIED rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_CALL print(message.REP_CALL) rspMsg.Header.BODYLEN = rspMsg.Body.getSize() MessageUtil.send(client, rspMsg) continue elif reqMsg.Header.MSGTYPE == message.REQ_CALL_STOP: q3.put(0) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.connect((REMOTE, 8001)) sock.close() continue except Exception as err: print(err)
def handle(self): print("클라이언트 접속: {0}".format(self.client_address[0])) client = self.request # client socket while True: reqMsg = MessageUtil.receive(client) if reqMsg == None: continue if reqMsg.Header.MSGTYPE == message.REQ_CONNECT: # 전송 요청 처리 rspMsg = Message() rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_CONNECT rspMsg.Header.BODYLEN = rspMsg.Body.getSize() MessageUtil.send(client, rspMsg) continue elif reqMsg.Header.MSGTYPE == message.REQ_GET_TOKEN: # 음성 토큰 요청 rspMsg = Message() rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_GET_TOKEN rspMsg.Header.BODYLEN = rspMsg.Body.getSize() if self.rm.getTokenStatus() == True: self.rm.lockToken() print('token 방출') else: rspMsg.Body.RESPONSE = message.DENIED print('token 없음') MessageUtil.send(client, rspMsg) continue elif reqMsg.Header.MSGTYPE == message.REQ_RETURN_TOKEN: None elif reqMsg.Header.MSGTYPE == message.REQ_VIDEO_STREAMING: if self.rm.getCallStatus() == False: self.rm.lockCall() requestDialog = RequestDialog("구조대원 4") # ret == 0: 연결 수락 / ret == 1: 연결 거절 ret = requestDialog.showDialog() rspMsg = Message() rspMsg.Header = Header(None) rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header.MSGTYPE = message.REP_VIDEO_STREAMING rspMsg.Header.BODYLEN = rspMsg.Body.getSize() print(ret) if (ret == 0): MessageUtil.send(client, rspMsg) #VLC 플레이어 실행 instance = vlc.Instance() player = instance.media_player_new() media = instance.media_new('rtp://141.223.84.110:1234') media.get_mrl() player.set_media(media) player.play() print("abcd") else: rspMsg.Body.RESPONSE = message.DENIED MessageUtil.send(client, rspMsg) self.rm.freeCall() else: print("통화 거절") continue elif reqMsg.Header.MSGTYPE == message.REQ_EXIT_VIDEO_STREAMING: None elif reqMsg.Header.MSGTYPE == message.REP_EXIT_VIDEO_STREAMING: None
def handle(self): print("클라이언트 접속: {0}".format(self.client_address[0])) client = self.request # client socket try: while True: reqMsg = MessageUtil.receive(client); if reqMsg == None: continue if reqMsg.Header.MSGTYPE == message.REQ_CONNECT: # 전송 요청 처리 rspMsg = Message() rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_CONNECT rspMsg.Header.BODYLEN = rspMsg.Body.getSize() MessageUtil.send(client, rspMsg) continue # 음성 토큰 요청 처리 elif reqMsg.Header.MSGTYPE == message.REQ_GET_TOKEN: rspMsg = Message() rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_GET_TOKEN rspMsg.Header.BODYLEN = rspMsg.Body.getSize() (hasToken, tokenLender) = self.rm.getTokenStatus() if hasToken: self.rm.lockToken(self.client_address[0]) print('token 방출') else: rspMsg.Body.RESPONSE = message.DENIED print('token 없음') MessageUtil.send(client, rspMsg) continue # 음성 토큰 반납 처리 elif reqMsg.Header.MSGTYPE == message.REQ_RETURN_TOKEN: rspMsg = Message() rspMsg.Body = BodyEmpty() rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_RETURN_TOKEN rspMsg.Header.BODYLEN = rspMsg.Body.getSize() self.rm.freeToken() print("토큰 획득") MessageUtil.send(client, rspMsg) continue elif reqMsg.Header.MSGTYPE == message.REQ_VIDEO_STREAMING: if not self.rm.getCallStatus(): self.rm.lockCall() requestDialog = RequestDialog("구조대원") # ret == 0: 연결 수락 / ret == 1: 연결 거절 ret = requestDialog.showDialog() rspMsg = Message() rspMsg.Header = Header(None) rspMsg.Body = BodyCommonResponse(None) rspMsg.Body.RESPONSE = message.ACCEPTED rspMsg.Header.MSGTYPE = message.REP_VIDEO_STREAMING rspMsg.Header.BODYLEN = rspMsg.Body.getSize() print(ret) if (ret == 0): MessageUtil.send(client, rspMsg) # 플레이어 실행 #os.system("D:\\gstreamer\\1.0\\x86_64\\bin\\gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false") self.gstreamer = subprocess.Popen('D:\\gstreamer\\1.0\\x86_64\\bin\\gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false', shell=True) else: rspMsg.Body.RESPONSE = message.DENIED MessageUtil.send(client, rspMsg) self.rm.freeCall() else: None continue elif reqMsg.Header.MSGTYPE == message.REQ_EXIT_VIDEO_STREAMING: if self.rm.getCallStatus(): self.rm.freeCall() rspMsg = Message() rspMsg.Body = BodyEmpty() rspMsg.Header = Header(None) rspMsg.Header.MSGTYPE = message.REP_EXIT_VIDEO_STREAMING rspMsg.Header.BODYLEN = rspMsg.Body.getSize() MessageUtil.send(client, rspMsg) #self.gstreamer.kill() subprocess.Popen("TASKKILL /F /PID {pid} /T".format(pid=self.gstreamer.pid)) print('통화종료 요청') continue elif reqMsg.Header.MSGTYPE == message.REP_EXIT_VIDEO_STREAMING: None except Exception as err: print("Exception") print(err); (hasToken, tokenLender) = self.rm.getTokenStatus() if not hasToken and tokenLender == self.client_address[0]: self.rm.freeToken() return False
sockMulticast = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sockMulticast.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) mreq = struct.pack("4sl", socket.inet_aton(multicastIp), socket.INADDR_ANY) sockMulticast.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) try: ret = -1 while ret != 0: ret = sockServer.connect_ex((serverIp, serverPort)) time.sleep(2) reqMsg = Message() reqMsg.Body = BodyConnectRequest(None) reqMsg.Body.RESQUER_ID = '1' reqMsg.Header = Header(None) reqMsg.Header.MSGTYPE = message.REQ_CONNECT reqMsg.Header.BODYLEN = reqMsg.Body.getSize() MessageUtil.send(sockServer, reqMsg) rspMsg = MessageUtil.receive(sockServer) if rspMsg.Header.MSGTYPE != message.REP_CONNECT: print("Error") exit(0) if rspMsg.Body.RESPONSE != message.ACCEPTED: print("Connection is refused.") exit(0) print("Connected with server")