import logging import socket from apscheduler.schedulers.asyncio import AsyncIOScheduler from models import DrugStateEnum, Drug from pytz import timezone class ChannelGate(): def __init__(self): # 创建一个TCP/IP套接字 self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器的IP地址和端口号 self.server_address = ('192.168.1.161', 6012) # 连接服务器 self.client_socket.connect(self.server_address) # 激活声光报警 self.cmd_warning = bytes.fromhex('05 09 FF 48 AA 11 20 00 77 D6') self.cmd_get_rfid = bytes.fromhex('05 08 FF 53 AA 11 12 DE EF') def read_data(self): try: # 激活声光报警 # cgcmd_warning = bytes.fromhex('05 09 FF 48 AA 11 20 00 77 D6') # 获取RFID标签 # cgcmd_get_rfid=bytes.fromhex('05 08 FF 53 AA 11 12 DE EF') self.client_socket.sendall(self.cmd_get_rfid) # 接收服务器的响应 data = self.client_socket.recv(1024) if len(data)> 15: print('Received:', data.hex(),len(data)) return data except: self.client_socket.connect(self.server_address) def parse_uid(self,data): if len(data)>15: rfid_label = data[19:27].hex() return [rfid_label] else: return [] async def check_uid_status(instance,rfid_labels): for rfid_label in rfid_labels: drug = await Drug.filter(rfid=rfid_label).get_or_none() if drug is None or drug.state != DrugStateEnum.OUT: print("发送警报") instance.client_socket.sendall(instance.cmd_warning) async def worker(): instance = ChannelGate() await check_uid_status(instance,instance.read_data()) def start(): scheduler = AsyncIOScheduler(timezone=timezone('Asia/Shanghai')) scheduler.add_job(worker, 'interval', seconds=0.1) logging.basicConfig() logging.getLogger('apscheduler').setLevel(logging.WARNING) # scheduler.add_job(environment_log_job, 'cron', hour="8,20") scheduler.start()