|
@@ -19,14 +19,13 @@ class RFIDClient:
|
|
|
self._last_tag: Optional[str] = None
|
|
self._last_tag: Optional[str] = None
|
|
|
self._stable_count = 0
|
|
self._stable_count = 0
|
|
|
self._last_time = time.time()
|
|
self._last_time = time.time()
|
|
|
- self._last_receive_time = time.time() # 最后一次收到数据的时间
|
|
|
|
|
- self._reconnect_interval = 5 # 重连尝试间隔(秒)
|
|
|
|
|
|
|
+ self._last_receive_time = time.time() # 最后一次收到数据的时间
|
|
|
|
|
+ self._reconnect_interval = 5 # 重连尝试间隔(秒)
|
|
|
self._last_connect_attempt = 0
|
|
self._last_connect_attempt = 0
|
|
|
self.thread = None
|
|
self.thread = None
|
|
|
self.buffer = b""
|
|
self.buffer = b""
|
|
|
self.on_state_changed = on_state_changed
|
|
self.on_state_changed = on_state_changed
|
|
|
|
|
|
|
|
-
|
|
|
|
|
def connect(self) -> bool:
|
|
def connect(self) -> bool:
|
|
|
"""尝试建立连接,若已连接则直接返回 True,否则尝试重连(有间隔限制)"""
|
|
"""尝试建立连接,若已连接则直接返回 True,否则尝试重连(有间隔限制)"""
|
|
|
if self.sock:
|
|
if self.sock:
|
|
@@ -37,7 +36,7 @@ class RFIDClient:
|
|
|
self._last_connect_attempt = time.time()
|
|
self._last_connect_attempt = time.time()
|
|
|
try:
|
|
try:
|
|
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
- self.sock.settimeout(3) # 设置接收超时,避免阻塞
|
|
|
|
|
|
|
+ self.sock.settimeout(3) # 设置接收超时,避免阻塞
|
|
|
self.sock.connect((self.config.ip, self.config.port))
|
|
self.sock.connect((self.config.ip, self.config.port))
|
|
|
self.running = True
|
|
self.running = True
|
|
|
self.thread = threading.Thread(target=self._read_loop, daemon=True)
|
|
self.thread = threading.Thread(target=self._read_loop, daemon=True)
|
|
@@ -54,7 +53,6 @@ class RFIDClient:
|
|
|
self.on_state_changed(False)
|
|
self.on_state_changed(False)
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
-
|
|
|
|
|
def disconnect(self):
|
|
def disconnect(self):
|
|
|
"""主动断开连接"""
|
|
"""主动断开连接"""
|
|
|
self.running = False
|
|
self.running = False
|
|
@@ -64,6 +62,7 @@ class RFIDClient:
|
|
|
logger.info("RFID已断开")
|
|
logger.info("RFID已断开")
|
|
|
if self.on_state_changed:
|
|
if self.on_state_changed:
|
|
|
self.on_state_changed(False)
|
|
self.on_state_changed(False)
|
|
|
|
|
+ self.on_tag_callback(None) # 通知上层
|
|
|
|
|
|
|
|
def _read_loop(self):
|
|
def _read_loop(self):
|
|
|
while self.running and self.sock:
|
|
while self.running and self.sock:
|
|
@@ -71,7 +70,7 @@ class RFIDClient:
|
|
|
data = self.sock.recv(1024)
|
|
data = self.sock.recv(1024)
|
|
|
if not data:
|
|
if not data:
|
|
|
break
|
|
break
|
|
|
- self._last_receive_time = time.time() # 收到任何数据都更新时间
|
|
|
|
|
|
|
+ self._last_receive_time = time.time() # 收到任何数据都更新时间
|
|
|
self.buffer += data
|
|
self.buffer += data
|
|
|
while True:
|
|
while True:
|
|
|
start = self.buffer.find(b"CT")
|
|
start = self.buffer.find(b"CT")
|
|
@@ -84,7 +83,7 @@ class RFIDClient:
|
|
|
self.buffer = self.buffer[next_start:]
|
|
self.buffer = self.buffer[next_start:]
|
|
|
self._process_packet(packet)
|
|
self._process_packet(packet)
|
|
|
except socket.timeout:
|
|
except socket.timeout:
|
|
|
- continue # 超时不影响循环
|
|
|
|
|
|
|
+ continue # 超时不影响循环
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
logger.error(f"RFID读取错误: {e}")
|
|
logger.error(f"RFID读取错误: {e}")
|
|
|
break
|
|
break
|
|
@@ -93,9 +92,9 @@ class RFIDClient:
|
|
|
logger.info("RFID读取循环结束,将触发重连")
|
|
logger.info("RFID读取循环结束,将触发重连")
|
|
|
if self.on_state_changed:
|
|
if self.on_state_changed:
|
|
|
self.on_state_changed(False)
|
|
self.on_state_changed(False)
|
|
|
- self.on_tag_callback(None) # 通知上层
|
|
|
|
|
|
|
+ self.on_tag_callback(None) # 通知上层
|
|
|
|
|
|
|
|
- def _process_packet(self, packet: bytes):
|
|
|
|
|
|
|
+ def _process_packet(self, packet):
|
|
|
hex_str = packet.hex()
|
|
hex_str = packet.hex()
|
|
|
logger.debug(f"RFID包 长度 {len(packet)} 十六进制: {hex_str}")
|
|
logger.debug(f"RFID包 长度 {len(packet)} 十六进制: {hex_str}")
|
|
|
|
|
|
|
@@ -123,7 +122,7 @@ class RFIDClient:
|
|
|
logger.debug(f"提取卡号: {tag}")
|
|
logger.debug(f"提取卡号: {tag}")
|
|
|
self._process_tag(tag)
|
|
self._process_tag(tag)
|
|
|
|
|
|
|
|
- def _process_tag(self, tag: str):
|
|
|
|
|
|
|
+ def _process_tag(self, tag):
|
|
|
now = time.time()
|
|
now = time.time()
|
|
|
if tag == self._last_tag:
|
|
if tag == self._last_tag:
|
|
|
self._stable_count += 1
|
|
self._stable_count += 1
|
|
@@ -160,4 +159,3 @@ class RFIDClient:
|
|
|
if (time.time() - self._last_receive_time) > 10:
|
|
if (time.time() - self._last_receive_time) > 10:
|
|
|
logger.warning("RFID长时间未收到数据,主动重连")
|
|
logger.warning("RFID长时间未收到数据,主动重连")
|
|
|
self.disconnect()
|
|
self.disconnect()
|
|
|
- # 下次 check_idle 会触发重连
|
|
|