2022-03-16 05:59:18 +01:00
|
|
|
import asyncio
|
|
|
|
import logging
|
|
|
|
|
|
|
|
import asyncio_mqtt
|
|
|
|
|
|
|
|
import fabapi
|
|
|
|
from host import Host
|
|
|
|
from timer import Timer
|
|
|
|
|
|
|
|
|
|
|
|
class Reader:
|
|
|
|
def __init__(self, reader_id: str, machine_urn: str, bffhd_address: Host):
|
|
|
|
self.reader_id = reader_id
|
|
|
|
self.machine_urn = machine_urn
|
|
|
|
self.bffhd_address = bffhd_address
|
|
|
|
self.auth_cap = None
|
|
|
|
self.session = None
|
|
|
|
self.timeout_timer = None
|
|
|
|
|
|
|
|
async def handle_messages(self, messages, client: asyncio_mqtt.Client):
|
2022-10-01 21:31:18 +02:00
|
|
|
async for message in messages:
|
|
|
|
try:
|
|
|
|
print(message.topic)
|
2022-03-16 05:59:18 +01:00
|
|
|
response_for_reader = None
|
2022-09-28 20:16:24 +02:00
|
|
|
if message.topic == f"fabreader/{self.reader_id}/startOTA":
|
2022-03-16 05:59:18 +01:00
|
|
|
self.timeout_timer = Timer(10, lambda: self.handle_timeout(client))
|
2022-09-28 20:16:24 +02:00
|
|
|
self.auth_cap, response_for_reader = await fabapi.connect_with_fabfire_initial(self.bffhd_address.hostname, self.bffhd_address.port, message.payload)
|
|
|
|
elif not self.session and message.topic == f"fabreader/{self.reader_id}/responseOTA":
|
|
|
|
response_for_reader, self.session = await fabapi.connect_with_fabfire_step(self.auth_cap, message.payload)
|
2022-03-16 05:59:18 +01:00
|
|
|
if self.session:
|
|
|
|
self.timeout_timer.cancel()
|
2022-11-04 19:27:04 +01:00
|
|
|
|
2022-05-22 03:42:38 +02:00
|
|
|
info = self.session.machineSystem.info
|
|
|
|
ma = await info.getMachineURN(f"{self.machine_urn}").a_wait()
|
|
|
|
|
|
|
|
if ma.which() == "just":
|
|
|
|
ma = ma.just
|
|
|
|
else:
|
|
|
|
logging.critical(f"Could not get machine {self.machine_urn}. Machine does not exist or insufficient permissions")
|
|
|
|
raise Exception(f"Could not get machine {self.machine_urn}. Machine does not exist or insufficient permissions")
|
|
|
|
|
2022-03-16 05:59:18 +01:00
|
|
|
if ma.state == "inUse":
|
2023-03-01 15:13:40 +01:00
|
|
|
try:
|
|
|
|
await ma.inuse.giveBack().a_wait()
|
|
|
|
except:
|
2023-03-01 12:58:27 +01:00
|
|
|
await client.publish(f"fabreader/{self.reader_id}/display/info", payload="Wrong User", qos=1, retain=False)
|
|
|
|
await asyncio.sleep(2)
|
|
|
|
await client.publish(f"fabreader/{self.reader_id}/display/info", payload="", qos=1, retain=False)
|
2022-03-16 05:59:18 +01:00
|
|
|
else:
|
2023-03-01 15:13:40 +01:00
|
|
|
try:
|
|
|
|
await ma.use.use().a_wait()
|
|
|
|
except:
|
2023-03-01 12:58:27 +01:00
|
|
|
await client.publish(f"fabreader/{self.reader_id}/display/info", payload="No Authorization", qos=1, retain=False)
|
|
|
|
await asyncio.sleep(2)
|
|
|
|
await client.publish(f"fabreader/{self.reader_id}/display/info", payload="", qos=1, retain=False)
|
2023-03-01 15:13:40 +01:00
|
|
|
|
2022-11-04 19:27:04 +01:00
|
|
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload="", qos=2, retain=False)
|
|
|
|
|
2022-03-16 05:59:18 +01:00
|
|
|
self.session = None
|
|
|
|
self.auth_cap = None
|
|
|
|
response_for_reader = None
|
|
|
|
|
2022-09-28 20:16:24 +02:00
|
|
|
if message.topic == f"fabreader/{self.reader_id}/cancelOTA" or message.topic == f"fabreader/{self.reader_id}/cancelOTA":
|
|
|
|
self.session = None
|
|
|
|
self.auth_cap = None
|
|
|
|
response_for_reader = None
|
2022-10-01 21:31:18 +02:00
|
|
|
self.timeout_timer.cancel()
|
2022-09-28 20:16:24 +02:00
|
|
|
|
2022-03-16 05:59:18 +01:00
|
|
|
if response_for_reader:
|
2022-09-28 20:16:24 +02:00
|
|
|
await client.publish(f"fabreader/{self.reader_id}/requestOTA", payload=response_for_reader, qos=2, retain=False)
|
|
|
|
|
2022-10-01 21:31:18 +02:00
|
|
|
except Exception as e:
|
|
|
|
logging.error(f"Caught exception {e}")
|
|
|
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload="", qos=2, retain=False)
|
|
|
|
self.session = None
|
|
|
|
self.auth_cap = None
|
|
|
|
response_for_reader = None
|
|
|
|
self.timeout_timer.cancel()
|
2022-03-16 05:59:18 +01:00
|
|
|
|
|
|
|
async def handle_timeout(self, client):
|
2022-10-01 21:31:18 +02:00
|
|
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload="", qos=2, retain=False)
|
|
|
|
logging.error(f"authentication timed out on reader {self.reader_id}")
|
2022-03-16 05:59:18 +01:00
|
|
|
self.auth_cap = None
|
|
|
|
self.session = None
|