From a6ff83f9b7e7856d76c770694e9174931508ee94 Mon Sep 17 00:00:00 2001 From: murmur Date: Mon, 13 Mar 2023 17:20:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BF=83=E8=B7=B3=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.py | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/server.py b/server.py index 3f9e3d5..fd8dcf3 100755 --- a/server.py +++ b/server.py @@ -4,6 +4,8 @@ import socketserver import subprocess import pickle from collections import defaultdict +import datetime +import time cache = defaultdict(list) offs = 0 # 偏移量 @@ -13,7 +15,8 @@ p = {} # 地址 ==ccid pp = {} - +def add_timestamp(): + print(datetime.datetime.now(),":") def save_cache(dic): @@ -53,6 +56,7 @@ def update_pairs(addr, ccid, clear=0): del p[ccid] del pp[addr] + print("ccid已更新注册。") # 打印在线终端 for i in p: print(i, "<--->", p[i]) @@ -85,9 +89,9 @@ def get_ccid(addr): +--------+--------------+----------+----------+--------------+------------------------+--------+ | ff | 长度 | 地址信息 | 信令 | 内容 | 校验位 | +--------+--------------+----------+----------+--------------+------------------------+--------+ -| | 2Bytes | 4Bytes | 心跳 | 0x01 | 时间戳32bit(单位ms) | 2Bytes | +| | 2Bytes | 4Bytes | 心跳 | 0x01 | 时间戳32bit(单位ms) | 1Bytes | + $TTMS +--------------+----------+----------+--------------+------------------------+--------+ -| | 2Bytes | 4Bytes | 传输数据 | 0xaa | 载荷 | 2Bytes | +| | 2Bytes | 4Bytes | 传输数据 | 0xaa | 载荷 | 1Bytes | +--------+--------------+----------+----------+--------------+------------------------+--------+ """ @@ -98,8 +102,18 @@ def tt_hh(addr, data): ccid = data[7 + offs : 11 + offs] update_pairs(addr, ccid) # 组帧再返回 + msg=data[:] + msg[12:-1]=val = '%04x'%int(time.time()) + # 计算校验和 + crc = 0 + for i in msg[:-1]: + crc = crc ^ i + msg[-1] = crc + add_timestamp() + addr.send(msg) + print("回复心跳。") - # 从缓存中匹配数据并重发 + # 从缓存中匹配到数据才重发 # 仅有新终端上线时才重发 if ccid in cache: msgs = cache[ccid][:] # 浅拷贝 @@ -107,6 +121,7 @@ def tt_hh(addr, data): print("有",len(msgs),"包缓存数据待发。",sccid,"-->",ccid) for i in range(len(msgs)): try: + add_timestamp() # 按缓存先后顺序发送 addr.send(msgs[i]) # 成功则清空已发送成功的缓存数据 @@ -121,8 +136,13 @@ def tt_hh(addr, data): del cache[ccid] save_cache(cache) + return 0 +def check_valid(data): + # 检查数据有效性 + + return bytearray(data[:]) def tt_trans(addr, data): """发送数据到指定ccid""" @@ -133,7 +153,7 @@ def tt_trans(addr, data): tccid = data[7 + offs : 11 + offs] taddr = get_addr(tccid) # 组帧 - msg = bytearray(data[:]) + msg = check_valid(data) msg[:5] = b"$TTMX" msg[7 + offs : 11 + offs] = sccid @@ -157,6 +177,7 @@ def tt_trans(addr, data): # 发送 try: + add_timestamp() taddr.send(msg) print("数据发送成功。",sccid,"-->",tccid) except Exception: @@ -180,7 +201,7 @@ def data_split(data): dlist= data.split(h)[1:] for i in range(len(dlist)): dlist[i] = h + dlist[i] - print("收到",len(dlist),"包连续数据。") + print("解析为",len(dlist),"包数据。") return dlist @@ -193,17 +214,11 @@ def tt_decode(addr, data): flag = -1 # 依据帧头和最小长度初判数据有效性 - # 即使是多条数据组成的长数据也默认帧格式是完整的,前几个字节必须是帧头 + # 只要接收数据给的缓存足够大,即使是多条数据组成的长数据也默认帧格式是完整的,前几个字节必须是帧头 if data[:5] != b"$TTMS" or len(data) < 12 : return -1 - if len(data)<200: - # 可能大多数场景是小包 - # 小包数据不处理分包,速度快 - dlist=[data] - else: - # 长数据需要分包 - dlist = data_split(data) + dlist = data_split(data) for data in dlist: cmd = data[11 + offs] # 回退到if-elif而不用match,因服务器默认版本3.8 @@ -224,7 +239,9 @@ def tt_decode(addr, data): class MyServer(socketserver.BaseRequestHandler): + def handle(self): # 回调 + add_timestamp() print("终端", self.client_address,"已上线,等待上报心跳注册ccid。") conn = self.request # print(type(conn),conn.fd) @@ -233,6 +250,7 @@ class MyServer(socketserver.BaseRequestHandler): data = conn.recv(1024000) if not data: break + add_timestamp() print( "接收到新数据", self.client_address, ",长度", len(data), ":\r\n", data.hex(" ") ) @@ -247,8 +265,8 @@ if __name__ == "__main__": cache = load_cache() server = socketserver.ThreadingTCPServer(("", 7222), MyServer) - ip, port = server.server_address - print("服务端初始化成功。", ip, port) + add_timestamp() + print("服务端初始化成功。",server.server_address) server.serve_forever()