更新心跳回复函数
This commit is contained in:
parent
ac787a2fde
commit
a6ff83f9b7
50
server.py
50
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()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user