mirror of
https://gitlab.com/fabinfra/fabaccess/fabfire_adapter.git
synced 2025-03-12 23:01:44 +01:00
Added: New Protocol
This commit is contained in:
parent
65e56a26ff
commit
8652b244ff
@ -1,16 +1,16 @@
|
|||||||
[mqtt]
|
[mqtt]
|
||||||
hostname = "192.168.178.31"
|
hostname = "127.0.0.1"
|
||||||
port = 1883
|
port = 1883
|
||||||
|
|
||||||
[bffhd]
|
[bffhd]
|
||||||
hostname = "192.168.178.31"
|
hostname = "127.0.0.1"
|
||||||
port = 59662
|
port = 59661
|
||||||
|
|
||||||
[readers]
|
[readers]
|
||||||
[readers.abc]
|
[readers.00001]
|
||||||
id = "001"
|
id = "00001"
|
||||||
machine = "urn:fabaccess:resource:Testmachine"
|
machine = "urn:fabaccess:resource:MachineA1"
|
||||||
|
|
||||||
[readers.def]
|
[readers.00002]
|
||||||
id = "222"
|
id = "00002"
|
||||||
machine = "urn:fabaccess:resource:Another"
|
machine = "urn:fabaccess:resource:MachineA2"
|
@ -85,7 +85,7 @@ async def connect_with_fabfire_initial(host, port, uid):
|
|||||||
asyncio.gather(*coroutines, return_exceptions=True)
|
asyncio.gather(*coroutines, return_exceptions=True)
|
||||||
|
|
||||||
boot = client.bootstrap().cast_as(connection_capnp.Bootstrap)
|
boot = client.bootstrap().cast_as(connection_capnp.Bootstrap)
|
||||||
auth = await boot.createSession("X-FABFIRE").a_wait()
|
auth = await boot.createSession("X-FABFIRE-BIN").a_wait()
|
||||||
response = await auth.authentication.step(uid).a_wait()
|
response = await auth.authentication.step(uid).a_wait()
|
||||||
logging.debug(f"got response type: {response.which()}")
|
logging.debug(f"got response type: {response.which()}")
|
||||||
if response.which() == "challenge":
|
if response.which() == "challenge":
|
||||||
|
10
main.py
10
main.py
@ -21,18 +21,16 @@ async def run_adapter(mqtt_host: Host, readers: list[Reader]):
|
|||||||
stack.push_async_callback(cancel_tasks, tasks)
|
stack.push_async_callback(cancel_tasks, tasks)
|
||||||
|
|
||||||
# Connect to the MQTT broker
|
# Connect to the MQTT broker
|
||||||
client = Client(hostname=mqtt_host.hostname, port=mqtt_host.port, username=mqtt_host.username,
|
client = Client(hostname=mqtt_host.hostname, port=mqtt_host.port, username=mqtt_host.username, password=mqtt_host.password)
|
||||||
password=mqtt_host.password)
|
|
||||||
await stack.enter_async_context(client)
|
await stack.enter_async_context(client)
|
||||||
|
|
||||||
# setup async handler for readers
|
# setup async handler for readers
|
||||||
for reader in readers:
|
for reader in readers:
|
||||||
manager = client.filtered_messages(f"/rfid_reader/{reader.reader_id}")
|
manager = client.filtered_messages(f"/fabreader/{reader.reader_id}")
|
||||||
messages = await stack.enter_async_context(manager)
|
messages = await stack.enter_async_context(manager)
|
||||||
task = asyncio.create_task(reader.handle_messages(messages, client))
|
task = asyncio.create_task(reader.handle_messages(messages, client))
|
||||||
tasks.add(task)
|
tasks.add(task)
|
||||||
await client.publish(f"/cmnd/reader/{reader.reader_id}", payload='{"Cmd":"haltPICC"}', qos=2,
|
await client.publish(f"fabreader/{reader.reader_id}/stopOTA", payload=None, qos=2, retain=False)
|
||||||
retain=False) # reset readers
|
|
||||||
logging.info(f"Registered handler for reader {reader.reader_id}")
|
logging.info(f"Registered handler for reader {reader.reader_id}")
|
||||||
|
|
||||||
# Messages that doesn't match a filter will get logged here
|
# Messages that doesn't match a filter will get logged here
|
||||||
@ -43,7 +41,7 @@ async def run_adapter(mqtt_host: Host, readers: list[Reader]):
|
|||||||
# Subscribe to topic(s)
|
# Subscribe to topic(s)
|
||||||
# 🤔 Note that we subscribe *after* starting the message
|
# 🤔 Note that we subscribe *after* starting the message
|
||||||
# loggers. Otherwise, we may miss retained messages.
|
# loggers. Otherwise, we may miss retained messages.
|
||||||
await client.subscribe("/rfid_reader/#")
|
await client.subscribe("fabreader/#")
|
||||||
|
|
||||||
logging.info("Initialization done")
|
logging.info("Initialization done")
|
||||||
|
|
||||||
|
37
reader.py
37
reader.py
@ -21,17 +21,14 @@ class Reader:
|
|||||||
try:
|
try:
|
||||||
async for message in messages:
|
async for message in messages:
|
||||||
response_for_reader = None
|
response_for_reader = None
|
||||||
if not self.auth_cap:
|
if message.topic == f"fabreader/{self.reader_id}/startOTA":
|
||||||
self.timeout_timer = Timer(10, lambda: self.handle_timeout(client))
|
self.timeout_timer = Timer(10, lambda: self.handle_timeout(client))
|
||||||
self.auth_cap, response_for_reader = await fabapi.connect_with_fabfire_initial(
|
self.auth_cap, response_for_reader = await fabapi.connect_with_fabfire_initial(self.bffhd_address.hostname, self.bffhd_address.port, message.payload)
|
||||||
self.bffhd_address.hostname, self.bffhd_address.port, message.payload)
|
elif not self.session and message.topic == f"fabreader/{self.reader_id}/responseOTA":
|
||||||
elif not self.session:
|
response_for_reader, self.session = await fabapi.connect_with_fabfire_step(self.auth_cap, message.payload)
|
||||||
response_for_reader, self.session = await fabapi.connect_with_fabfire_step(self.auth_cap,
|
|
||||||
message.payload)
|
|
||||||
if self.session:
|
if self.session:
|
||||||
self.timeout_timer.cancel()
|
self.timeout_timer.cancel()
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"haltPICC"}', qos=2,
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload=None, qos=2, retain=False)
|
||||||
retain=False)
|
|
||||||
|
|
||||||
info = self.session.machineSystem.info
|
info = self.session.machineSystem.info
|
||||||
ma = await info.getMachineURN(f"{self.machine_urn}").a_wait()
|
ma = await info.getMachineURN(f"{self.machine_urn}").a_wait()
|
||||||
@ -44,32 +41,32 @@ class Reader:
|
|||||||
|
|
||||||
if ma.state == "inUse":
|
if ma.state == "inUse":
|
||||||
await ma.inuse.giveBack().a_wait()
|
await ma.inuse.giveBack().a_wait()
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"message","MssgID":0,"AddnTxt":""}', qos=2,
|
#await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"message","MssgID":0,"AddnTxt":""}', qos=2, retain=False)
|
||||||
retain=False)
|
|
||||||
else:
|
else:
|
||||||
await ma.use.use().a_wait()
|
await ma.use.use().a_wait()
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload=response_for_reader, qos=2,
|
#await client.publish(f"/cmnd/reader/{self.reader_id}", payload=response_for_reader, qos=2, retain=False)
|
||||||
retain=False)
|
|
||||||
await asyncio.sleep(2)
|
await asyncio.sleep(2)
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}",
|
#await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"message","MssgID":3,"AddnTxt":""}', qos=2, retain=False)
|
||||||
payload='{"Cmd":"message","MssgID":3,"AddnTxt":""}', qos=2,
|
|
||||||
retain=False)
|
|
||||||
self.session = None
|
self.session = None
|
||||||
self.auth_cap = None
|
self.auth_cap = None
|
||||||
response_for_reader = None
|
response_for_reader = None
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
if response_for_reader:
|
if response_for_reader:
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload=response_for_reader, qos=2, retain=False)
|
await client.publish(f"fabreader/{self.reader_id}/requestOTA", payload=response_for_reader, qos=2, retain=False)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Caught exception {e}")
|
logging.error(f"Caught exception {e}")
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"haltPICC"}', qos=2,
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload=None, qos=2, retain=False)
|
||||||
retain=False)
|
|
||||||
self.session = None
|
self.session = None
|
||||||
self.auth_cap = None
|
self.auth_cap = None
|
||||||
|
|
||||||
async def handle_timeout(self, client):
|
async def handle_timeout(self, client):
|
||||||
await client.publish(f"/cmnd/reader/{self.reader_id}", payload='{"Cmd":"haltPICC"}', qos=2,
|
await client.publish(f"fabreader/{self.reader_id}/stopOTA", payload=None, qos=2, retain=False)
|
||||||
retain=False)
|
|
||||||
logging.critical(f"authentication timed out on reader {self.reader_id}")
|
logging.critical(f"authentication timed out on reader {self.reader_id}")
|
||||||
self.auth_cap = None
|
self.auth_cap = None
|
||||||
self.session = None
|
self.session = None
|
Loading…
x
Reference in New Issue
Block a user