Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Removing FSM after successful reassembly #20

Merged
merged 6 commits into from
Jun 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion fragmentation_layer/code/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import binascii
import struct

from message import MESSAGE
from message import SHORT_MESSAGE as MESSAGE
from schc_handlers import SCHCNodeHandler
from schc_protocols import SCHCProtocol

Expand Down
19 changes: 12 additions & 7 deletions fragmentation_layer/code/schc_handlers/schc_gateway_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,18 @@ class SCHCGatewayHandler(SCHCHandler):
def __init__(self, protocol, mtu, on_receive_callback=None):
super().__init__(protocol, mtu)
if on_receive_callback:
def after_reassembly_processing(msg_bytes):
# TODO decompress before calling callback
on_receive_callback(msg_bytes)
used_callback = on_receive_callback
else:
used_callback = lambda msg: print("Message received", msg)

def create_after_processing_callback(rule_id, dtag):
def after_reassembly_processing(msg_bytes):
# TODO decompress before calling callback
print("Message received:", msg_bytes)
self.callback = after_reassembly_processing
used_callback(msg_bytes)
#self.__sessions__[rule_id].pop(dtag)
return after_reassembly_processing

self.callback_creator = create_after_processing_callback

def send_package(self, packet):
if self.__protocol__.id == SCHCProtocol.LoRaWAN:
Expand All @@ -36,7 +40,9 @@ def receive(self, rule_id, dtag, message):
if rule_id == LoRaWAN.ACK_ON_ERROR:
# message received
from schc_machines.lorawan import AckOnErrorReceiver
self.assign_session(rule_id, dtag, AckOnErrorReceiver(LoRaWAN(LoRaWAN.ACK_ON_ERROR), on_success=self.callback))
self.assign_session(rule_id, dtag, AckOnErrorReceiver(
LoRaWAN(LoRaWAN.ACK_ON_ERROR),
on_success=self.callback_creator(rule_id, dtag)))
self.__sessions__[rule_id][dtag].receive_message(message)
elif rule_id == LoRaWAN.ACK_ALWAYS:
# response received
Expand Down Expand Up @@ -64,7 +70,6 @@ def handle(self, message, f_port=None, url=None, dev_id=None):
"payload_raw": base64.b64encode(response[1:]).decode("utf-8")
}
r = requests.post(url, data=json.dumps(post_obj), headers={'content-type': 'application/json'})
print(r.status_code)

def generate_message(self, rule_id, dtag, mtu=512):
message = self.__sessions__[rule_id][dtag].generate_message(mtu)
Expand Down
2 changes: 1 addition & 1 deletion fragmentation_layer/code/schc_handlers/schc_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@ def receive(self, rule_id, dtag, message):
def assign_session(self, rule_id, dtag, machine):
if rule_id not in self.__sessions__.keys():
self.__sessions__[rule_id] = dict()
if dtag not in self.__sessions__[rule_id].keys():
if dtag not in self.__sessions__[rule_id].keys() or self.__sessions__[rule_id][dtag].is_active() == False:
self.__sessions__[rule_id][dtag] = machine
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ def generate_message(self, mtu):
if self.sm.__last_window__ and self.__success__:
self.sm.state = self.sm.states["end"]
self.sm.state.enter_state()
self.sm.inactivity_timer.reset()
self.sm.on_success(self.sm.payload.as_bytes())
if len(self.sm.message_to_send) > 0:
message = self.sm.message_to_send.pop(0)
self._logger_.schc_message(message)
Expand Down Expand Up @@ -153,7 +155,6 @@ def receive_all1_schc_fragment(self, schc_message):
self._logger_.debug("Integrity check successful")
compressed_bitmap = None
self.__success__ = True
self.sm.on_success(self.sm.payload.as_bytes())
else:
self._logger_.error("Integrity check failed:\tSender: {}\tReceiver:{}".format(
schc_message.header.rcs.rcs,
Expand Down
Loading