Commit 3c893d79 authored by liyuanhong's avatar liyuanhong

优化了日志输出

parent 41e4b06a
...@@ -44,6 +44,7 @@ class StreamH264Flv(): ...@@ -44,6 +44,7 @@ class StreamH264Flv():
self.isOpenVideoLog = 0 # 是否开启视频日志 0:不开启 1:开启 self.isOpenVideoLog = 0 # 是否开启视频日志 0:不开启 1:开启
self.isOpenAudioLog = 0 # 是否开启音频日志 0:不开启 1:开启 self.isOpenAudioLog = 0 # 是否开启音频日志 0:不开启 1:开启
self.protocal_1078 = Protocal_1078() self.protocal_1078 = Protocal_1078()
self.autoClose = 0 # 视频推流完是否自动关闭连接 0:否 1:是
def setMobile(self,data): def setMobile(self,data):
...@@ -76,6 +77,9 @@ class StreamH264Flv(): ...@@ -76,6 +77,9 @@ class StreamH264Flv():
self.isOpenVideoLog = data self.isOpenVideoLog = data
def setIsOpenAudioLog(self,data): def setIsOpenAudioLog(self,data):
self.isOpenAudioLog = data self.isOpenAudioLog = data
def setAutoClose(self,data):
self.autoClose = data
#################################################### ####################################################
...@@ -95,6 +99,7 @@ class StreamH264Flv(): ...@@ -95,6 +99,7 @@ class StreamH264Flv():
#################################################### ####################################################
def disConnectServer(self): def disConnectServer(self):
self.client.close() self.client.close()
self.client = None
#################################################### ####################################################
# 读取flv文件,并发送 (h264编码,并且音频为aac编码格式) # 读取flv文件,并发送 (h264编码,并且音频为aac编码格式)
...@@ -161,8 +166,13 @@ class StreamH264Flv(): ...@@ -161,8 +166,13 @@ class StreamH264Flv():
timeCur = self.getCurTime() timeCur = self.getCurTime()
self.multiPushStatus = self.multiPushStatus + 1 self.multiPushStatus = self.multiPushStatus + 1
self.timeStampSeek = timeStamp + 1000 self.timeStampSeek = timeStamp + 1000
self.logTextCtr.WriteText(timeCur + "视频推流完,自动结束推流!\n") self.logTextCtr.WriteText(timeCur + "视频推流结束,自动结束推流!\n")
# self.client.close() if self.autoClose == 1:
self.client.close()
self.client = None
curTime = self.getCurTime()
msgTxt = curTime + "视频推流结束,自动结束推流!(同时断开了连接)"
wx.CallAfter(pub.sendMessage, "closeMsg" + str(self.channel), msg=msgTxt)
#################################################### ####################################################
# 停止发送消息 # 停止发送消息
...@@ -178,7 +188,8 @@ class StreamH264Flv(): ...@@ -178,7 +188,8 @@ class StreamH264Flv():
res = json.loads(res) res = json.loads(res)
url = res["data"]["url"] url = res["data"]["url"]
# url = self.replaceHost(res["data"]["url"],"video-test.vandyo.com:") # url = self.replaceHost(res["data"]["url"],"video-test.vandyo.com:")
print("播放地址:" + url) wx.CallAfter(pub.sendMessage, "showLog" + str(self.channel), msg="播放地址:" + url + "\n")
# print("播放地址:" + url)
#################################################### ####################################################
# 替换url的host # 替换url的host
...@@ -217,7 +228,7 @@ class StreamH264Flv(): ...@@ -217,7 +228,7 @@ class StreamH264Flv():
if self.isOpenVideoLog != 0: if self.isOpenVideoLog != 0:
# print("发送视频消息:" + msg) # print("发送视频消息:" + msg)
msgTxt = "发送视频消息:" + msg msgTxt = "发送视频消息:" + msg
wx.CallAfter(pub.sendMessage, "showLog", msg=msgTxt) wx.CallAfter(pub.sendMessage, "showLog" + str(self.channel), msg=msgTxt)
try: try:
self.client.send(binascii.a2b_hex(msg)) self.client.send(binascii.a2b_hex(msg))
except: except:
...@@ -241,7 +252,7 @@ class StreamH264Flv(): ...@@ -241,7 +252,7 @@ class StreamH264Flv():
if self.isOpenAudioLog != 0: if self.isOpenAudioLog != 0:
# print("发送音频消息:" + msg) # print("发送音频消息:" + msg)
msgTxt = "发送音频消息:" + msg msgTxt = "发送音频消息:" + msg
wx.CallAfter(pub.sendMessage, "showLog", msg=msgTxt) wx.CallAfter(pub.sendMessage, "showLog" + str(self.channel), msg=msgTxt)
self.client.send(binascii.a2b_hex(msg)) self.client.send(binascii.a2b_hex(msg))
time.sleep(self.sendDur) time.sleep(self.sendDur)
...@@ -311,7 +322,6 @@ class StreamH264Flv(): ...@@ -311,7 +322,6 @@ class StreamH264Flv():
frameData["frames"] = frames frameData["frames"] = frames
elif frameData["AVCPkgType"] == 2: elif frameData["AVCPkgType"] == 2:
frameData["frames"] = [] frameData["frames"] = []
# print("2222222----------" + AVTag)
else: else:
frameData["frames"] = [] frameData["frames"] = []
return frameData return frameData
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
import ssl import ssl
import time import time
from gevent import thread import wx
from pubsub import pub
import websocket import websocket
...@@ -33,15 +34,18 @@ class ClientWebSocket(): ...@@ -33,15 +34,18 @@ class ClientWebSocket():
def on_message(self, message): def on_message(self, message):
print("收到消息:" + message) print("收到消息:" + message)
wx.CallAfter(pub.sendMessage, "msgRev", msg=message)
def on_error(self, error): def on_error(self, error):
print(error) print(error)
def on_close(self): def on_close(self):
print("websocket 已经断开!!!") curTime = self.getCurTime()
print(curTime + "websocket 已经断开!!!")
def on_open(self): def on_open(self):
print("websocket 已连接......") curTime = self.getCurTime()
print(curTime + "websocket 已连接......")
print(self.wsUrl + self.wsCode) print(self.wsUrl + self.wsCode)
################################################## ##################################################
...@@ -56,6 +60,16 @@ class ClientWebSocket(): ...@@ -56,6 +60,16 @@ class ClientWebSocket():
def close(self): def close(self):
self.ws.close() self.ws.close()
####################################################
# 获取当前时间
####################################################
def getCurTime(self):
timeCur = int(time.time() * 1000)
timeArray = time.localtime(timeCur / 1000)
timeCur = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
timeCur = "[" + timeCur + "] "
return timeCur
if __name__ == "__main__": if __name__ == "__main__":
ClientWebSocket().connect() ClientWebSocket().connect()
...@@ -15,6 +15,7 @@ import yaml ...@@ -15,6 +15,7 @@ import yaml
from pubsub import pub from pubsub import pub
from lib.service.StreamH264Flv import StreamH264Flv from lib.service.StreamH264Flv import StreamH264Flv
from ui import globalParams
class CameraArea(): class CameraArea():
...@@ -40,6 +41,7 @@ class CameraArea(): ...@@ -40,6 +41,7 @@ class CameraArea():
self.msgSendDurText = None # 发送间隔文本框 self.msgSendDurText = None # 发送间隔文本框
self.audioCombox = None # 音频开关按钮 self.audioCombox = None # 音频开关按钮
self.videoPlayText = None # 获取播放地址文本框 self.videoPlayText = None # 获取播放地址文本框
self.audioCloseCombox = None # 控制是否自动断连开关
self.isShowFrame = 0 # 是否展示帧预览画面 0:不显示 1:显示 self.isShowFrame = 0 # 是否展示帧预览画面 0:不显示 1:显示
def setDevId(self,data): def setDevId(self,data):
...@@ -47,6 +49,11 @@ class CameraArea(): ...@@ -47,6 +49,11 @@ class CameraArea():
def setChannel(self,data): def setChannel(self,data):
self.channel = data self.channel = data
def getDevIdText(self):
return self.devIdText
def getPushObj(self):
return self.pushObj
################################################# #################################################
# 创建一个顶级pannel # 创建一个顶级pannel
################################################# #################################################
...@@ -58,6 +65,10 @@ class CameraArea(): ...@@ -58,6 +65,10 @@ class CameraArea():
boxSizer.Add(topPanel,1,flag=wx.EXPAND | wx.ALL) boxSizer.Add(topPanel,1,flag=wx.EXPAND | wx.ALL)
boxSizer.Add(bottomPanel,2, flag=wx.EXPAND | wx.TOP , border=5) boxSizer.Add(bottomPanel,2, flag=wx.EXPAND | wx.TOP , border=5)
self.mainPanel.SetSizer(boxSizer) self.mainPanel.SetSizer(boxSizer)
pub.subscribe(self.showAVLog, "showLog" + str(self.channel))
pub.subscribe(self.processAutoClose, "closeMsg" + str(self.channel))
return self.mainPanel return self.mainPanel
################################################# #################################################
...@@ -96,6 +107,9 @@ class CameraArea(): ...@@ -96,6 +107,9 @@ class CameraArea():
self.msgSendDurText = wx.TextCtrl(paramView, pos=(150, 125), size=wx.Size(40, -1), value="7") # 消息发送间隔 self.msgSendDurText = wx.TextCtrl(paramView, pos=(150, 125), size=wx.Size(40, -1), value="7") # 消息发送间隔
wx.StaticText(paramView, label='音频:', pos=(200, 130)) wx.StaticText(paramView, label='音频:', pos=(200, 130))
self.audioCombox = wx.ComboBox(paramView, pos=(240,125), choices=['开', '关'],value="开",size=wx.Size(50,-1)) self.audioCombox = wx.ComboBox(paramView, pos=(240,125), choices=['开', '关'],value="开",size=wx.Size(50,-1))
wx.StaticText(paramView, label='推完自动断连:', pos=(300, 130))
self.audioCloseCombox = wx.ComboBox(paramView, pos=(390, 125), choices=['是', '否'], value="是", size=wx.Size(50, -1))
wx.StaticText(paramView, label='播放地址:', pos=(10, 190)) wx.StaticText(paramView, label='播放地址:', pos=(10, 190))
self.videoPlayText = wx.TextCtrl(paramView, pos=(70, 185), size=wx.Size(350, -1)) # 视频播放地址 self.videoPlayText = wx.TextCtrl(paramView, pos=(70, 185), size=wx.Size(350, -1)) # 视频播放地址
getPlayUrlButton = wx.Button(paramView, label="获取播放地址", pos=(425, 185)) getPlayUrlButton = wx.Button(paramView, label="获取播放地址", pos=(425, 185))
...@@ -180,11 +194,14 @@ class CameraArea(): ...@@ -180,11 +194,14 @@ class CameraArea():
boxSizer_bottom.Add(ctrArea, 40, flag=wx.EXPAND | wx.LEFT,border=10) boxSizer_bottom.Add(ctrArea, 40, flag=wx.EXPAND | wx.LEFT,border=10)
bottomPanel.SetSizer(boxSizer_bottom) bottomPanel.SetSizer(boxSizer_bottom)
pub.subscribe(self.showAVLog, "showLog")
return bottomPanel return bottomPanel
def showAVLog(self,msg): def showAVLog(self,msg):
self.logTextCtr.WriteText(msg + "\n") self.logTextCtr.WriteText(msg + "\n")
def processAutoClose(self,msg):
self.logTextCtr.WriteText(msg + "\n")
self.pushStatusText.SetValue("未连接")
self.pushObj = None
################################################# #################################################
# 打开文件选择对话框 # 打开文件选择对话框
################################################# #################################################
...@@ -208,6 +225,7 @@ class CameraArea(): ...@@ -208,6 +225,7 @@ class CameraArea():
# 获取视频播放地址 # 获取视频播放地址
#################################################### ####################################################
def doGetPlayUrl(self,textCtr): def doGetPlayUrl(self,textCtr):
self.setLogRedirect()
devId = self.devIdText.GetValue() devId = self.devIdText.GetValue()
channel = self.channelText.GetValue() channel = self.channelText.GetValue()
res = requests.post(self.getGetPlayUrl, data=json.dumps({'devId': devId, 'chan': str(channel)})).text res = requests.post(self.getGetPlayUrl, data=json.dumps({'devId': devId, 'chan': str(channel)})).text
...@@ -215,8 +233,6 @@ class CameraArea(): ...@@ -215,8 +233,6 @@ class CameraArea():
url = res["data"]["url"] url = res["data"]["url"]
textCtr.SetValue(url) textCtr.SetValue(url)
def getPlayUrl(self,evt,textCtr): def getPlayUrl(self,evt,textCtr):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doGetPlayUrl,args=(textCtr,)) threadObj = threading.Thread(target=self.doGetPlayUrl,args=(textCtr,))
else: else:
...@@ -238,8 +254,7 @@ class CameraArea(): ...@@ -238,8 +254,7 @@ class CameraArea():
# 连网 # 连网
#################################################### ####################################################
def connect(self,evt): def connect(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
isSendAudio = self.getAudioStatus() isSendAudio = self.getAudioStatus()
if self.pushObj == None: if self.pushObj == None:
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
...@@ -258,8 +273,6 @@ class CameraArea(): ...@@ -258,8 +273,6 @@ class CameraArea():
sendDur = self.msgSendDurText.GetValue() sendDur = self.msgSendDurText.GetValue()
isSendAudio = self.getAudioStatus() isSendAudio = self.getAudioStatus()
flvPath = self.videoPathText.GetValue() flvPath = self.videoPathText.GetValue()
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
obj = StreamH264Flv() obj = StreamH264Flv()
obj.setHost(host) obj.setHost(host)
obj.setPort(int(port)) obj.setPort(int(port))
...@@ -272,6 +285,8 @@ class CameraArea(): ...@@ -272,6 +285,8 @@ class CameraArea():
obj.setMainFrame(self.mainPanel) obj.setMainFrame(self.mainPanel)
obj.setLogTextCtr(self.logTextCtr) obj.setLogTextCtr(self.logTextCtr)
obj.setPushStatusText(self.pushStatusText) obj.setPushStatusText(self.pushStatusText)
if self.audioCloseCombox.GetValue() == "是":
obj.setAutoClose(1)
self.pushObj = obj self.pushObj = obj
self.pushObj.connectServer() self.pushObj.connectServer()
timeCur = self.getCurTime() timeCur = self.getCurTime()
...@@ -292,8 +307,7 @@ class CameraArea(): ...@@ -292,8 +307,7 @@ class CameraArea():
# 断网 # 断网
#################################################### ####################################################
def disConnect(self,evt): def disConnect(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
self.pushObj.disConnectServer() self.pushObj.disConnectServer()
self.pushObj = None self.pushObj = None
self.pushStatusText.SetValue("未连网") self.pushStatusText.SetValue("未连网")
...@@ -304,8 +318,7 @@ class CameraArea(): ...@@ -304,8 +318,7 @@ class CameraArea():
# 开始推流 # 开始推流
#################################################### ####################################################
def startPush(self,evt): def startPush(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
try: try:
timeCur = self.getCurTime() timeCur = self.getCurTime()
if self.pushObj != None: if self.pushObj != None:
...@@ -318,8 +331,6 @@ class CameraArea(): ...@@ -318,8 +331,6 @@ class CameraArea():
except: except:
traceback.print_exc() traceback.print_exc()
def pushStream(self): def pushStream(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
try: try:
self.pushObj.readFlvAndSend() self.pushObj.readFlvAndSend()
except: except:
...@@ -329,16 +340,13 @@ class CameraArea(): ...@@ -329,16 +340,13 @@ class CameraArea():
# 暂停推流 # 暂停推流
#################################################### ####################################################
def pausePush(self,evt): def pausePush(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doPausePush) threadObj = threading.Thread(target=self.doPausePush)
else: else:
threadObj = threading.Thread(target=self.doPausePush()) threadObj = threading.Thread(target=self.doPausePush())
threadObj.start() threadObj.start()
def doPausePush(self): def doPausePush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime() timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "暂停推流!\n") self.logTextCtr.WriteText(timeCur + "暂停推流!\n")
self.pushStatusText.SetValue("推流暂停") self.pushStatusText.SetValue("推流暂停")
...@@ -348,16 +356,13 @@ class CameraArea(): ...@@ -348,16 +356,13 @@ class CameraArea():
# 继续推流 # 继续推流
#################################################### ####################################################
def continuePush(self,evt): def continuePush(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doContinuePush) threadObj = threading.Thread(target=self.doContinuePush)
else: else:
threadObj = threading.Thread(target=self.doContinuePush()) threadObj = threading.Thread(target=self.doContinuePush())
threadObj.start() threadObj.start()
def doContinuePush(self): def doContinuePush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime() timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "继续推流!\n") self.logTextCtr.WriteText(timeCur + "继续推流!\n")
self.pushStatusText.SetValue("推流中") self.pushStatusText.SetValue("推流中")
...@@ -367,16 +372,13 @@ class CameraArea(): ...@@ -367,16 +372,13 @@ class CameraArea():
# 停止推流 # 停止推流
#################################################### ####################################################
def stopPush(self,evt): def stopPush(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doStopPush) threadObj = threading.Thread(target=self.doStopPush)
else: else:
threadObj = threading.Thread(target=self.doStopPush()) threadObj = threading.Thread(target=self.doStopPush())
threadObj.start() threadObj.start()
def doStopPush(self): def doStopPush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime() timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "推流停止!\n") self.logTextCtr.WriteText(timeCur + "推流停止!\n")
self.pushStatusText.SetValue("连网") self.pushStatusText.SetValue("连网")
...@@ -401,14 +403,14 @@ class CameraArea(): ...@@ -401,14 +403,14 @@ class CameraArea():
# 实时显示帧画面 # 实时显示帧画面
#################################################### ####################################################
def showFrame(self,evt): def showFrame(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doShowFrame) threadObj = threading.Thread(target=self.doShowFrame)
else: else:
threadObj = threading.Thread(target=self.doShowFrame()) threadObj = threading.Thread(target=self.doShowFrame())
threadObj.start() threadObj.start()
def doShowFrame(self): def doShowFrame(self):
self.setLogRedirect()
self.isShowFrame = 1 self.isShowFrame = 1
devId = self.devIdText.GetValue() devId = self.devIdText.GetValue()
channel = self.channelText.GetValue() channel = self.channelText.GetValue()
...@@ -439,8 +441,7 @@ class CameraArea(): ...@@ -439,8 +441,7 @@ class CameraArea():
# 停止显示帧画面 # 停止显示帧画面
#################################################### ####################################################
def stopShowFrame(self,evt): def stopShowFrame(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.stopDoShowFrame) threadObj = threading.Thread(target=self.stopDoShowFrame)
else: else:
...@@ -453,8 +454,7 @@ class CameraArea(): ...@@ -453,8 +454,7 @@ class CameraArea():
# 播放视频地址 # 播放视频地址
################################################### ###################################################
def playFrame(self,evt): def playFrame(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
if self.getOsName() == "Windows": if self.getOsName() == "Windows":
threadObj = threading.Thread(target=self.doPlayFrame) threadObj = threading.Thread(target=self.doPlayFrame)
else: else:
...@@ -480,6 +480,7 @@ class CameraArea(): ...@@ -480,6 +480,7 @@ class CameraArea():
# 控制是否显示视频日志 # 控制是否显示视频日志
################################################### ###################################################
def isVideoLogOpenChange(self,evt): def isVideoLogOpenChange(self,evt):
self.setLogRedirect()
val = evt.GetEventObject().GetValue() val = evt.GetEventObject().GetValue()
if val == "视频日志(开)": if val == "视频日志(开)":
self.pushObj.setIsOpenVideoLog(1) self.pushObj.setIsOpenVideoLog(1)
...@@ -490,6 +491,7 @@ class CameraArea(): ...@@ -490,6 +491,7 @@ class CameraArea():
# 控制是否显示音频日志 # 控制是否显示音频日志
################################################### ###################################################
def isAudioLogOpenChange(self,evt): def isAudioLogOpenChange(self,evt):
self.setLogRedirect()
val = evt.GetEventObject().GetValue() val = evt.GetEventObject().GetValue()
if val == "音频日志(开)": if val == "音频日志(开)":
self.pushObj.setIsOpenAudioLog(1) self.pushObj.setIsOpenAudioLog(1)
...@@ -500,6 +502,7 @@ class CameraArea(): ...@@ -500,6 +502,7 @@ class CameraArea():
# 改变消息发送间隔 # 改变消息发送间隔
#################################################### ####################################################
def changeSendDur(self,evt,textCtr): def changeSendDur(self,evt,textCtr):
self.setLogRedirect()
curVal = int(textCtr.GetValue()) curVal = int(textCtr.GetValue())
self.pushObj.setSendDur(curVal / 1000) self.pushObj.setSendDur(curVal / 1000)
self.msgSendDurText.SetValue(str(curVal)) self.msgSendDurText.SetValue(str(curVal))
...@@ -508,10 +511,19 @@ class CameraArea(): ...@@ -508,10 +511,19 @@ class CameraArea():
# 实时改变音频发送 # 实时改变音频发送
#################################################### ####################################################
def changeIsSendAudio(self,evt): def changeIsSendAudio(self,evt):
self.setLogRedirect()
val = evt.GetEventObject().GetValue() val = evt.GetEventObject().GetValue()
if val == "音频(开)": if val == "音频(开)":
self.pushObj.setIsSendAudio(1) self.pushObj.setIsSendAudio(1)
self.audioCombox.SetValue("开") self.audioCombox.SetValue("开")
else: else:
self.pushObj.setIsSendAudio(0) self.pushObj.setIsSendAudio(0)
self.audioCombox.SetValue("关") self.audioCombox.SetValue("关")
\ No newline at end of file
####################################################
# 日志重定向到日志框
####################################################
def setLogRedirect(self):
if globalParams.isLogRedirect == 1:
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
\ No newline at end of file
#coding: utf-8 #coding: utf-8
import hashlib
import json
import sys import sys
import threading import threading
import time
import wx import wx
from pubsub import pub
from lib.socket.ClientWebSocket import ClientWebSocket from lib.socket.ClientWebSocket import ClientWebSocket
from ui import globalParams
class HomeArea(): class HomeArea():
def __init__(self, frame): def __init__(self, frame):
self.frame = frame self.frame = frame
self.wsUrl = "ws://api-test.vandyo.com/mirror/websocket/" # webosocket 连接地址 self.wsUrl = "ws://api-test.vandyo.com/mirror/websocket/" # webosocket 连接地址
self.devCode = "868142043390091" # 设备id self.devCode = "868142043390091" # 设备id
self.ws = None self.ws = None
self.mainPanel = None self.mainPanel = None
self.heartBeatTime = 60 # 心跳时间
self.isHeartBeat = 1 # 是否开启心跳 0:不开启 1:开启
self.wsUrlText = None # webSocket 连接地址文本框 self.wsUrlText = None # webSocket 连接地址文本框
self.devCodeText = None # 设备号文本框 self.devCodeText = None # 设备号文本框
self.heartBeatTimeText = None # 心跳时间文本框
self.heartBeatCombox = None # 心跳开关设置
self.logTextCtr = None # 日志显示框 self.logTextCtr = None # 日志显示框
def setWsUrl(self,data): def setWsUrl(self,data):
self.wsUrl = data self.wsUrl = data
def setDevCode(self,data): def setDevCode(self,data):
...@@ -36,6 +48,8 @@ class HomeArea(): ...@@ -36,6 +48,8 @@ class HomeArea():
boxSizer.Add(topPanel,1,flag=wx.EXPAND | wx.ALL) boxSizer.Add(topPanel,1,flag=wx.EXPAND | wx.ALL)
boxSizer.Add(bottomPanel,2, flag=wx.EXPAND | wx.TOP , border=5) boxSizer.Add(bottomPanel,2, flag=wx.EXPAND | wx.TOP , border=5)
self.mainPanel.SetSizer(boxSizer) self.mainPanel.SetSizer(boxSizer)
pub.subscribe(self.processRevCmd, "msgRev")
return self.mainPanel return self.mainPanel
def getTopPanel(self): def getTopPanel(self):
...@@ -46,18 +60,23 @@ class HomeArea(): ...@@ -46,18 +60,23 @@ class HomeArea():
wx.StaticText(topPanel, label='设备 号:', pos=(430, 10)) wx.StaticText(topPanel, label='设备 号:', pos=(430, 10))
self.devCodeText = wx.TextCtrl(topPanel, pos=(485, 5), size=wx.Size(120, -1), value=self.devCode) self.devCodeText = wx.TextCtrl(topPanel, pos=(485, 5), size=wx.Size(120, -1), value=self.devCode)
setDevCodeButton = wx.Button(topPanel, label="设置设备号", pos=(610, 5)) setDevCodeButton = wx.Button(topPanel, label="设置设备号", pos=(610, 5))
connectButton = wx.Button(topPanel, label="连接设备", pos=(695, 5)) self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.setDevCode(evt),
setDevCodeButton)
wx.StaticText(topPanel, label='心跳时间(秒):', pos=(10, 40))
self.heartBeatTimeText = wx.TextCtrl(topPanel, pos=(110,35), size=wx.Size(60, -1), value=str(self.heartBeatTime))
wx.StaticText(topPanel, label='是否开启心跳:', pos=(180, 40))
self.heartBeatCombox = wx.ComboBox(topPanel, pos=(270, 35), choices=['开', '关'], value="关",
size=wx.Size(50, -1))
connectButton = wx.Button(topPanel, label="连接设备", pos=(610, 35))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.connect(evt), self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.connect(evt),
connectButton) connectButton)
disConnectButton = wx.Button(topPanel, label="断开连接", pos=(775, 5)) disConnectButton = wx.Button(topPanel, label="断开连接", pos=(690, 35))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.disConnect(evt), self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.disConnect(evt),
disConnectButton) disConnectButton)
wx.StaticText(topPanel, label='状态:',pos=(855, 10)) wx.StaticText(topPanel, label='状态:',pos=(780, 40))
self.connectStatusText = wx.TextCtrl(topPanel, pos=(895, 5), size=wx.Size(80, -1), value="未连接",style=wx.TE_READONLY) self.connectStatusText = wx.TextCtrl(topPanel, pos=(820, 35), size=wx.Size(80, -1), value="未连接",style=wx.TE_READONLY)
self.connectStatusText.SetForegroundColour(wx.RED) self.connectStatusText.SetForegroundColour(wx.RED)
connectButton1 = wx.Button(topPanel, label="连接设备", pos=(695, 100))
return topPanel return topPanel
################################################# #################################################
...@@ -69,8 +88,6 @@ class HomeArea(): ...@@ -69,8 +88,6 @@ class HomeArea():
logArea = wx.Panel(bottomPanel) logArea = wx.Panel(bottomPanel)
logStaticText = wx.StaticText(logArea, label='日志:') logStaticText = wx.StaticText(logArea, label='日志:')
self.logTextCtr = wx.TextCtrl(logArea, size=wx.Size(40, -1),style=wx.TE_MULTILINE) self.logTextCtr = wx.TextCtrl(logArea, size=wx.Size(40, -1),style=wx.TE_MULTILINE)
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
boxSizer_logArea = wx.BoxSizer(wx.VERTICAL) boxSizer_logArea = wx.BoxSizer(wx.VERTICAL)
boxSizer_logArea.Add(logStaticText, 2, flag=wx.EXPAND | wx.TOP ,border=10) boxSizer_logArea.Add(logStaticText, 2, flag=wx.EXPAND | wx.TOP ,border=10)
boxSizer_logArea.Add(self.logTextCtr, 100, flag=wx.EXPAND | wx.ALL) boxSizer_logArea.Add(self.logTextCtr, 100, flag=wx.EXPAND | wx.ALL)
...@@ -82,28 +99,42 @@ class HomeArea(): ...@@ -82,28 +99,42 @@ class HomeArea():
clearLogButton = wx.Button(ctrPanel, label="清空日志", pos=(5, 5)) clearLogButton = wx.Button(ctrPanel, label="清空日志", pos=(5, 5))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.clearLog(evt), self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.clearLog(evt),
clearLogButton) clearLogButton)
clearLogButton = wx.Button(ctrPanel, label="关闭心跳", pos=(85, 5))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.stopHeartBeat(evt),
clearLogButton)
boxSizer_ctrArea = wx.BoxSizer(wx.VERTICAL) boxSizer_ctrArea = wx.BoxSizer(wx.VERTICAL)
boxSizer_ctrArea.Add(ctrText,2, flag=wx.EXPAND | wx.TOP ,border=10) boxSizer_ctrArea.Add(ctrText,2, flag=wx.EXPAND | wx.TOP ,border=10)
boxSizer_ctrArea.Add(ctrPanel,100, flag=wx.EXPAND | wx.ALL) boxSizer_ctrArea.Add(ctrPanel,100, flag=wx.EXPAND | wx.ALL)
ctrArea.SetSizer(boxSizer_ctrArea) ctrArea.SetSizer(boxSizer_ctrArea)
boxSizer_bottom.Add(logArea,70,flag=wx.EXPAND | wx.ALL) boxSizer_bottom.Add(logArea,60,flag=wx.EXPAND | wx.ALL)
boxSizer_bottom.Add(ctrArea, 30, flag=wx.EXPAND | wx.LEFT,border=10) boxSizer_bottom.Add(ctrArea, 40, flag=wx.EXPAND | wx.LEFT,border=10)
bottomPanel.SetSizer(boxSizer_bottom) bottomPanel.SetSizer(boxSizer_bottom)
return bottomPanel return bottomPanel
#################################################
# 设置设备号
#################################################
def setDevCode(self,evt):
globalParams.camera_1.getDevIdText().SetValue(self.devCodeText.GetValue()[3:])
globalParams.camera_2.getDevIdText().SetValue(self.devCodeText.GetValue()[3:])
globalParams.camera_3.getDevIdText().SetValue(self.devCodeText.GetValue()[3:])
################################################# #################################################
# 连接设备 # 连接设备
################################################# #################################################
def connect(self,evt): def connect(self,evt):
sys.stdout = self.logTextCtr self.setLogRedirect()
sys.stderr = self.logTextCtr
self.ws = ClientWebSocket() self.ws = ClientWebSocket()
self.ws.setWsUrl(self.wsUrlText.GetValue()) self.ws.setWsUrl(self.wsUrlText.GetValue())
self.ws.setWsCode(self.devCodeText.GetValue()) self.ws.setWsCode(self.devCodeText.GetValue())
threadObj = threading.Thread(target=self.doConnect, args=()) threadObj = threading.Thread(target=self.doConnect, args=())
threadObj.start() threadObj.start()
if self.heartBeatCombox.GetValue() == "开":
self.isHeartBeat = 1
self.startHeartBeat()
self.connectStatusText.SetValue("已连接")
def doConnect(self): def doConnect(self):
self.ws.connect() self.ws.connect()
...@@ -112,11 +143,113 @@ class HomeArea(): ...@@ -112,11 +143,113 @@ class HomeArea():
# 断开连接 # 断开连接
################################################# #################################################
def disConnect(self,evt): def disConnect(self,evt):
self.setLogRedirect()
self.stopHeartBeat(None)
self.ws.close() self.ws.close()
self.connectStatusText.SetValue("未连接")
# self.stopHeartBeat(None)
# self.ws.close()
# self.connectStatusText.SetValue("未连接")
# curTime = self.getCurTime()
# self.logTextCtr.WriteText(curTime + "websocket连接已经断开")
################################################# #################################################
# 清空日志 # 清空日志
################################################# #################################################
def clearLog(self,evt): def clearLog(self,evt):
self.setLogRedirect()
self.logTextCtr.SetValue("") self.logTextCtr.SetValue("")
#################################################
# 启动发送心跳服务
#################################################
def startHeartBeat(self):
self.setLogRedirect()
threadObj = threading.Thread(target=self.sendHeartBeatService, args=())
threadObj.start()
#################################################
# 发送心跳服务
#################################################
def sendHeartBeatService(self):
self.setLogRedirect()
while self.isHeartBeat == 1:
time.sleep(int(self.heartBeatTimeText.GetValue()))
if self.isHeartBeat == 1:
timeCur = int(time.time() * 1000)
skeyOrg = str(timeCur) + self.devCodeText.GetValue()
m = hashlib.md5()
m.update(skeyOrg.encode("utf8"))
skey = m.hexdigest()
msg = {}
msg["data"] = {}
msg["skey"] = skey
msg["type"] = "9" # 心跳指令上报
msg = json.dumps(msg)
self.ws.sendMsg(msg)
curTime = self.getCurTime()
self.logTextCtr.WriteText(curTime + "发送心跳:" + msg + "\n")
#################################################
# 停止发送心跳服务
#################################################
def stopHeartBeat(self,evt):
self.setLogRedirect()
self.isHeartBeat = 0
curTime = self.getCurTime()
self.logTextCtr.WriteText(curTime + "停止了心跳服务!\n")
####################################################
# 获取当前时间
####################################################
def getCurTime(self):
timeCur = int(time.time() * 1000)
timeArray = time.localtime(timeCur / 1000)
timeCur = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
timeCur = "[" + timeCur + "] "
return timeCur
####################################################
# 处理服务端下发的指令
####################################################
def processRevCmd(self,msg):
self.setLogRedirect()
msgJson = json.loads(msg)
msgType = msgJson["type"]
if msgType == "1":
cam = msgJson["data"]["cam"]
if cam == 1:
if globalParams.camera_1.getPushObj() == None :
globalParams.camera_1.doConnect()
globalParams.camera_1.startPush(None)
else:
curTime = self.getCurTime()
self.logTextCtr.WriteText(curTime + "消息: 摄像头1连接中!!!\n")
elif cam == 2:
if globalParams.camera_2.getPushObj() == None:
globalParams.camera_2.doConnect()
globalParams.camera_2.startPush(None)
else:
curTime = self.getCurTime()
self.logTextCtr.WriteText(curTime + "消息: 摄像头2连接中!!!\n")
elif cam == 3:
if globalParams.camera_3.getPushObj() == None:
globalParams.camera_3.doConnect()
globalParams.camera_3.startPush(None)
else:
curTime = self.getCurTime()
self.logTextCtr.WriteText(curTime + "消息: 摄像头3连接中!!!\n")
####################################################
# 日志重定向到日志框
####################################################
def setLogRedirect(self):
if globalParams.isLogRedirect == 1:
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
...@@ -6,6 +6,7 @@ from ui.CameraArea import CameraArea ...@@ -6,6 +6,7 @@ from ui.CameraArea import CameraArea
from ui.CodecArea import CodecArea from ui.CodecArea import CodecArea
from ui.EventAndOtherArea import EventAndOtherArea from ui.EventAndOtherArea import EventAndOtherArea
from ui.HomeArea import HomeArea from ui.HomeArea import HomeArea
from ui import globalParams
''' '''
定义主窗体 定义主窗体
...@@ -45,15 +46,18 @@ class MainWindow(): ...@@ -45,15 +46,18 @@ class MainWindow():
nodeBook.AddPage(page0, "云镜首页") nodeBook.AddPage(page0, "云镜首页")
cameraArea1 = CameraArea(nodeBook) cameraArea1 = CameraArea(nodeBook)
globalParams.camera_1 = cameraArea1
page1 = cameraArea1.create() page1 = cameraArea1.create()
nodeBook.AddPage(page1,"摄像头1") nodeBook.AddPage(page1,"摄像头1")
cameraArea2 = CameraArea(nodeBook) cameraArea2 = CameraArea(nodeBook)
globalParams.camera_2 = cameraArea2
cameraArea2.setChannel(2) cameraArea2.setChannel(2)
page2 = cameraArea2.create() page2 = cameraArea2.create()
nodeBook.AddPage(page2, "摄像头2") nodeBook.AddPage(page2, "摄像头2")
cameraArea3 = CameraArea(nodeBook) cameraArea3 = CameraArea(nodeBook)
globalParams.camera_3 = cameraArea3
cameraArea3.setChannel(3) cameraArea3.setChannel(3)
page3 = cameraArea3.create() page3 = cameraArea3.create()
nodeBook.AddPage(page3, "摄像头3") nodeBook.AddPage(page3, "摄像头3")
......
# coding:utf-8
camera_1 = None # 相机1
camera_2 = None # 相机2
camera_3 = None # 相机3
isLogRedirect = 0 # 日志是否重定向到日志文本框 0: 不重定向 (用于调试) 1:重定向 (用于给别人用)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment