You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1 KiB

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()