fabfire_adapter/single.py
2022-06-16 16:01:10 +02:00

79 lines
3.7 KiB
Python

import asyncio
import logging
from asyncio_mqtt import Client
import json
import fabapi
from timer import Timer
BFFHD_HOST = "127.0.0.1"
MQTT_HOST = "127.0.0.1"
MACHINE_URN = ""
READER_ID = ""
async def main():
done = False
auth_cap = None
session = None
msg = None
async with Client(MQTT_HOST) as client:
await client.publish("/cmnd/reader", payload='{"Cmd":"haltPICC"}', qos=2, retain=False)
await client.publish("/cmnd/reader", payload='{"Cmd": "message", "MssgID": 0, "AddnTxt":" Karte auflegen"}', qos=2, retain=False)
async with client.filtered_messages(f"/rfid_reader/{READER_ID}") as messages:
await client.subscribe("/rfid_reader/#")
async for message in messages:
response_for_reader = None
if not auth_cap:
timeout_timer = Timer(10, lambda: handle_timeout(client))
auth_cap, response_for_reader = await fabapi.connect_with_fabfire_initial(
BFFHD_HOST, 59961, message.payload)
elif not session:
response_for_reader, session = await fabapi.connect_with_fabfire_step(auth_cap,
message.payload)
if session:
timeout_timer.cancel()
await client.publish(f"/cmnd/reader/{READER_ID}", payload='{"Cmd":"haltPICC"}', qos=2,
retain=False)
info = session.machineSystem.info
ma = await info.getMachineURN(f"{MACHINE_URN}").a_wait()
if ma.which() == "just":
ma = ma.just
else:
logging.critical(
f"Could not get machine {MACHINE_URN}. Machine does not exist or insufficient permissions")
raise Exception(
f"Could not get machine {MACHINE_URN}. Machine does not exist or insufficient permissions")
if ma.state == "inUse":
await ma.inuse.giveBack().a_wait()
await client.publish(f"/cmnd/reader/{READER_ID}",
payload='{"Cmd":"message","MssgID":0,"AddnTxt":""}', qos=2,
retain=False)
else:
await ma.use.use().a_wait()
await client.publish(f"/cmnd/reader/{READER_ID}", payload=response_for_reader, qos=2,
retain=False)
await asyncio.sleep(2)
await client.publish(f"/cmnd/reader/{READER_ID}",
payload='{"Cmd":"message","MssgID":3,"AddnTxt":""}', qos=2,
retain=False)
session = None
auth_cap = None
response_for_reader = None
if response_for_reader:
await client.publish(f"/cmnd/reader/{READER_ID}", payload=response_for_reader, qos=2, retain=False)
await client.publish("/cmnd/reader", payload=msg, qos=2, retain=False)
async def handle_timeout(client, reader_id):
await client.publish(f"/cmnd/reader/{reader_id}", payload='{"Cmd":"haltPICC"}', qos=2,
retain=False)
logging.critical(f"authentication timed out on reader {reader_id}")
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())