密胺计量程序
This commit is contained in:
103
Network.py
Normal file
103
Network.py
Normal file
@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
# @Time : 2025/2/18 10:08
|
||||
# @Author : hjw
|
||||
# @File : Network.py
|
||||
'''
|
||||
|
||||
import time
|
||||
import threading
|
||||
import socket
|
||||
import logging
|
||||
import json
|
||||
from queue import Queue
|
||||
|
||||
|
||||
# 配置日志系统
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler('controller.log'),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NetworkHandler:
|
||||
def __init__(self, config):
|
||||
self.host = config['network']['host']
|
||||
self.port = config['network']['port']
|
||||
self.sock = None
|
||||
self.command_queue = Queue()
|
||||
self.status = {
|
||||
'measuring': False,
|
||||
'error': None,
|
||||
'current_weight': 0,
|
||||
'target_weight': 0,
|
||||
'algorithm': 'pid',
|
||||
'set_tare': False,
|
||||
'set_tare_num_time': 0,
|
||||
'get_weight': False,
|
||||
'set_vibrate': False,
|
||||
'set_vibrate_time': 0
|
||||
}
|
||||
self.lock = threading.Lock()
|
||||
self.running = True
|
||||
|
||||
def start_server(self):
|
||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
try:
|
||||
self.sock.bind((self.host, self.port))
|
||||
self.sock.listen(5)
|
||||
logger.info(f"网络服务启动于 {self.host}:{self.port}")
|
||||
|
||||
while self.running:
|
||||
conn, addr = self.sock.accept()
|
||||
threading.Thread(target=self._handle_client, args=(conn, addr), daemon=True).start()
|
||||
except Exception as e:
|
||||
logger.error(f"网络服务异常: {str(e)}")
|
||||
finally:
|
||||
self.sock.close()
|
||||
|
||||
def _handle_client(self, conn, addr):
|
||||
try:
|
||||
data = conn.recv(1024)
|
||||
if data:
|
||||
cmd = json.loads(data.decode())
|
||||
self._process_command(cmd)
|
||||
time.sleep(0.5)
|
||||
# 返回当前状态
|
||||
with self.lock:
|
||||
response = json.dumps(self.status)
|
||||
conn.send(response.encode())
|
||||
except json.JSONDecodeError:
|
||||
logger.warning("收到无效的JSON指令")
|
||||
except Exception as e:
|
||||
logger.error(f"客户端处理异常: {str(e)}")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def _process_command(self, cmd):
|
||||
with self.lock:
|
||||
if cmd.get('command') == 'set_target':
|
||||
|
||||
self.status['target_weight'] = cmd['payload']['target_weight']
|
||||
self.status['algorithm'] = cmd['payload'].get('algorithm', 'pid')
|
||||
self.status['measuring'] = True
|
||||
print("收到指令set_target:", self.status['target_weight'])
|
||||
elif cmd.get('command') == 'stop':
|
||||
self.status['measuring'] = False
|
||||
|
||||
elif cmd.get('command') == 'set_zero':
|
||||
self.status['set_tare'] = True
|
||||
|
||||
elif cmd.get('command') == 'get_weight':
|
||||
self.status['get_weight'] = True
|
||||
|
||||
elif cmd.get('command') == 'set_vibrate':
|
||||
self.status['set_vibrate'] = True
|
||||
self.status['set_vibrate_time'] = cmd['payload']['time']
|
||||
Reference in New Issue
Block a user