fabfire_adapter/single.py

85 lines
3.9 KiB
Python
Raw Permalink Normal View History

2022-03-12 10:46:38 +01:00
import asyncio
2022-06-16 16:01:10 +02:00
import logging
2022-06-16 19:50:24 +02:00
import os
2022-03-12 10:46:38 +01:00
from asyncio_mqtt import Client
import json
import fabapi
2022-06-16 16:01:10 +02:00
from timer import Timer
2022-03-12 10:46:38 +01:00
2022-06-16 19:50:24 +02:00
BFFHD_HOST = "localhost"
2022-06-16 16:01:10 +02:00
MQTT_HOST = "127.0.0.1"
2022-06-16 19:50:24 +02:00
MACHINE_URN = "urn:fabaccess:resource:MachineA2"
READER_ID = "111"
auth_cap = None
session = None
2022-03-12 10:46:38 +01:00
async def main():
2022-06-16 19:50:24 +02:00
global auth_cap
global session
2022-03-12 10:46:38 +01:00
2022-06-16 16:01:10 +02:00
async with Client(MQTT_HOST) as client:
2022-06-16 19:50:24 +02:00
await client.publish(f"/cmnd/reader/{READER_ID}", payload='{"Cmd":"haltPICC"}', qos=2, retain=False)
await client.publish(f"/cmnd/reader/{READER_ID}", payload='{"Cmd": "message", "MssgID": 0, "AddnTxt":" Karte auflegen"}', qos=2, retain=False)
2022-06-16 16:01:10 +02:00
async with client.filtered_messages(f"/rfid_reader/{READER_ID}") as messages:
2022-03-12 10:46:38 +01:00
await client.subscribe("/rfid_reader/#")
2022-06-16 19:50:24 +02:00
logging.info(f"Connected to reader {READER_ID} on MQTT Broker {MQTT_HOST}")
2022-03-12 10:46:38 +01:00
async for message in messages:
2022-06-16 16:01:10 +02:00
response_for_reader = None
if not auth_cap:
2022-06-16 19:50:24 +02:00
timeout_timer = Timer(2, lambda: handle_timeout(client))
2022-06-16 16:01:10 +02:00
auth_cap, response_for_reader = await fabapi.connect_with_fabfire_initial(
2022-06-16 19:50:24 +02:00
BFFHD_HOST, 59661, message.payload)
2022-06-16 16:01:10 +02:00
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)
2022-03-12 10:46:38 +01:00
else:
2022-06-16 16:01:10 +02:00
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)
2022-03-12 10:46:38 +01:00
2022-06-16 19:50:24 +02:00
async def handle_timeout(client):
global auth_cap
global session
await client.publish(f"/cmnd/reader/{READER_ID}", payload='{"Cmd":"haltPICC"}', qos=2,
2022-06-16 16:01:10 +02:00
retain=False)
2022-06-16 19:50:24 +02:00
logging.critical(f"authentication timed out on reader {READER_ID}")
auth_cap = None
session = None
2022-03-12 10:46:38 +01:00
if __name__ == "__main__":
2022-06-16 19:50:24 +02:00
LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper()
logging.basicConfig(level=LOGLEVEL)
2022-03-12 10:46:38 +01:00
loop = asyncio.get_event_loop()
loop.run_until_complete(main())