診斷小系統(tǒng)通信設(shè)計(jì)(初步)--Apple的學(xué)習(xí)筆記
昨天做了需求分析递惋,今天進(jìn)行python客戶端架構(gòu)設(shè)計(jì)鲫售,做了個(gè)最小雛形泡徙,驗(yàn)證設(shè)計(jì)方案椿疗。創(chuàng)建2個(gè)類漏峰,一個(gè)是TCPsocket通信,一個(gè)HMI顯示届榄。
后續(xù)注意點(diǎn)浅乔,需要學(xué)習(xí)下的
1.python私有變量貌似是加下劃線前綴,當(dāng)前我加self的都是public變量铝条。2.需要使用try except進(jìn)行安全保障靖苇,添加打印提示信息。
3.添加裝飾函數(shù)保存log.txt文件班缰。
最小雛形功能簡(jiǎn)介贤壁,主函數(shù)中有GUI按鈕通過TCPsocket進(jìn)行發(fā)送數(shù)據(jù),并且創(chuàng)建一個(gè)心跳監(jiān)控線程埠忘,超過3s沒有收到服務(wù)器發(fā)來的信息則斷線重連脾拆。本來創(chuàng)建了GUI傳入TCPcom對(duì)象作為參數(shù),但是需要添加timeout斷線重連莹妒,重連后又是另外一個(gè)TCPcom對(duì)象了名船,為了避免GUI更新,所以索性把com對(duì)象作為全局變量旨怠。反正2個(gè)類的關(guān)系就是GUI依賴TCPcom包帚。
image.png
#client demo code
import socket
from tkinter import *
from tkinter.ttk import *
import threading
import time
__author__ = 'AppleCai'
class TCPcom():
def __init__(self,host,port):
self.host = host
self.port = port
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def ConnCom(self):
self.s.connect((self.host, self.port))
print("Connect %s:%d ok" % (self.host, self.port))
def CloseCom(self):
self.s.close()
def SendCom(self,data):
self.s.send(data)
def RecviveCom(self):
self.s.settimeout(5)
ret = self.s.recv(1024) #10
print(ret)
return ret
class GUI():
def __init__(self):
self.rectime = 0
pass
def update_table(self):
global com
com.SendCom(b'00 01 02')
resp = com.RecviveCom()
self.rectime = time.time()
def setupWin(self):
Button(text="send", width=5, command=self.update_table).grid(row=1, column=3, sticky='w')
def showWin(self):
root = Tk()
root.title("IG Sim")
root.geometry('420x300')
self.setupWin()
root.mainloop()
def heatDetect( threadName, delay):
while True:
global com
time.sleep(delay)
#print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
now = time.time()
delta = now - tool.rectime
print(now,tool.rectime,delta)
if(delta>3):
print("reconnect!")
com.CloseCom()
com = TCPcom('127.0.0.1',2345)
ret = com.ConnCom()
if __name__=="__main__":
# connect with server
com = TCPcom('127.0.0.1',2345)
ret = com.ConnCom()
# init for GUI
tool = GUI()
print(ret)
# start heart moniter
th1 = threading.Thread(target=heatDetect, args=("thread1", 3), name="thread1")
th1.start()
# run GUI
tool.showWin()
最小雛形,運(yùn)行效果
image.png