original push
This commit is contained in:
119
algorithm_V0/datacollect/zmqServer.py
Normal file
119
algorithm_V0/datacollect/zmqServer.py
Normal file
@@ -0,0 +1,119 @@
|
||||
import numpy as np
|
||||
import zmq
|
||||
import threading
|
||||
import json
|
||||
from SunnyLinker import SunnyLinker64
|
||||
|
||||
class zmqServer(threading.Thread):
|
||||
def __init__(self, host='0.0.0.0', port=8099):
|
||||
threading.Thread.__init__(self)
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.running = False
|
||||
self.get_Impedance = False # 是否返回阻抗值
|
||||
self.open_Impedance = None # 是否开启阻抗检测功能
|
||||
self.StartDecode = False # false 停止解码,true=开始解码
|
||||
self.StartTrain = False # False未进入训练状态,True处于训练状态
|
||||
self.state_mode = None # 'train'为训练状态,’rest'为休息状态,'test'为测试状态
|
||||
self.currentLabel = -1 # 接收刺激端消息,了解刺激端当前的训练标签
|
||||
self.IsExitApp = False # 当socket收到2的时候,就置为True,代表遥退出系统了。
|
||||
self.getReport = False # 获取训练报告内容
|
||||
self.mat_generate = False # 保存mat文件,True开始,False暂停
|
||||
self.reset_mat_buffer = False # 重置缓冲区标志,True表示下次开始采集需要清空旧数据
|
||||
self.subject_id = None #受试者ID
|
||||
self.session_id = None #Session ID
|
||||
self.save_win = 0 #保存数据时长
|
||||
|
||||
self.daemon = True
|
||||
# 创建 ZeroMQ 上下文
|
||||
self.context = zmq.Context()
|
||||
# 创建 REP 套接字(响应端)
|
||||
self.socket = self.context.socket(zmq.ROUTER)
|
||||
self.socket.bind(f"tcp://{self.host}:{self.port}") # 绑定到端口 8099
|
||||
self.targetFreqs = []
|
||||
self.changeTarget = False # 更换目标频率
|
||||
self.sunnyLinker = SunnyLinker64(None, None, None, None,None) #单例模式类,已在Decoder实例化
|
||||
self.labels = [0x01, 0x02,0x03]
|
||||
|
||||
self.decoder_switch = False #更换解码器
|
||||
self.decoder_class = None #解码器类别 'ssvep','ssmvep','mi'
|
||||
def run(self):
|
||||
self.running = True
|
||||
print(f"Server is running on {self.host}:{self.port}")
|
||||
try:
|
||||
while self.running:
|
||||
# 等待客户端请求
|
||||
_,_,message = self.socket.recv_multipart()
|
||||
message = json.loads(message.decode('utf-8'))
|
||||
print(f"Received request: {message}")
|
||||
# 处理请求
|
||||
method = message.get("method")
|
||||
params = message.get("params")
|
||||
if method == "sync":
|
||||
self.state_mode = 'sync'
|
||||
if method == "targetFreqs":
|
||||
if not isinstance(params,list):
|
||||
print('targetFreqs must be a list')
|
||||
continue
|
||||
if params != self.targetFreqs:
|
||||
self.targetFreqs = params
|
||||
self.changeTarget = True
|
||||
if method == "decoderClass":
|
||||
if not isinstance(params,str):
|
||||
print('decoderClass must be a str')
|
||||
continue
|
||||
# if params != self.decoder_class:
|
||||
self.decoder_class = params
|
||||
self.decoder_switch = True
|
||||
if method == "getReport":
|
||||
self.getReport = True
|
||||
if method == "train":#训练状态
|
||||
self.state_mode = 'train'
|
||||
self.StartTrain = True
|
||||
self.currentLabel = params # 当前刺激端的训练标签
|
||||
self.sunnyLinker.push_trigger(self.labels[self.currentLabel])
|
||||
elif method == "predict":#预测状态
|
||||
self.state_mode = 'predict'
|
||||
if params == 1: #开始解码
|
||||
self.StartDecode = True
|
||||
self.sunnyLinker.push_trigger(0x63)
|
||||
elif params == 2: #停止解码
|
||||
self.IsExitApp = True
|
||||
self.running = False
|
||||
elif method == "rest": #休息状态
|
||||
self.state_mode = 'rest'
|
||||
elif method == "impedance":
|
||||
if params == 1:
|
||||
self.open_Impedance = True # 开启阻抗
|
||||
self.get_Impedance = True # 返回阻抗
|
||||
elif params == 2:
|
||||
self.open_Impedance = False # 关闭阻抗
|
||||
self.get_Impedance = False # 停止返回阻抗
|
||||
elif method == "matGenerate":
|
||||
self.subject_id = str(params['subject_id'])
|
||||
self.session_id = str(params['session_id'])
|
||||
self.save_win = int(params['time'])
|
||||
self.mat_generate = True
|
||||
self.reset_mat_buffer = True # 每次发送 matGenerate 都重置缓冲区
|
||||
elif method == "stop": # 停止
|
||||
self.mat_generate = False
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print(f"An socket error occurred: {e}")
|
||||
finally:
|
||||
self.running = False
|
||||
# 关闭套接字和上下文
|
||||
self.socket.close()
|
||||
self.context.term()
|
||||
print("Server socket and context closed.")
|
||||
def stop(self):
|
||||
"""显式关闭服务器"""
|
||||
self.running = False
|
||||
self.socket.close()
|
||||
self.context.term()
|
||||
print("Server closed explicitly.")
|
||||
|
||||
if __name__ == '__main__':
|
||||
server = zmqServer()
|
||||
server.start()
|
||||
Reference in New Issue
Block a user