From 299eb3fafb21481e38e963ff6080d0822ae6a3ae Mon Sep 17 00:00:00 2001 From: Sekiya Date: Thu, 27 Jun 2024 16:18:21 +0900 Subject: [PATCH] fix: issue 39 --- tests/ocpp-server/README.md | 4 +- tests/ocpp-server/server.py | 91 ++++++++++++++----------------------- 2 files changed, 35 insertions(+), 60 deletions(-) diff --git a/tests/ocpp-server/README.md b/tests/ocpp-server/README.md index 67942a07..e6a4dfa1 100644 --- a/tests/ocpp-server/README.md +++ b/tests/ocpp-server/README.md @@ -29,7 +29,7 @@ You can also specify a command and a period duration with the --request and --pe To run the server and send a GetBaseReport command every 5 seconds, use: ```shell -poetry run task server --request GetBaseReport --period 5 +poetry run task server --command GetBaseReport --period 5 ``` ### ClearCache Command @@ -37,7 +37,7 @@ poetry run task server --request GetBaseReport --period 5 To run the server and send a ClearCache command every 5 seconds, use: ```shell -poetry run task server --request ClearCache --period 5 +poetry run task server --command ClearCache --period 5 ``` Please be mindful that these commands were examples according to the provided scenario, the available commands and their syntax might vary depending on the ocpp version and the implemented functionalities on your server. diff --git a/tests/ocpp-server/server.py b/tests/ocpp-server/server.py index c6ea6e13..5738c7e3 100644 --- a/tests/ocpp-server/server.py +++ b/tests/ocpp-server/server.py @@ -118,65 +118,41 @@ class ChargePoint(ocpp.v201.ChargePoint): async def send_get_base_report(self): request = ocpp.v201.call.GetBaseReport( reportBase=ReportBaseType.ConfigurationInventory - ) # Use correct ReportBaseType - try: - response = await self.call(request) - logging.info("Send %s", Action.GetBaseReport) - - if response.status == ReportBaseType.accepted: - logging.info("%s successful", Action.GetBaseReport) - else: - logging.info("%s failed", Action.GetBaseReport) - - except ConnectionClosed as e: - logging.error("Connection closed: %s", str(e)) + ) + response = await self.call(request) - except Exception as e: - logging.error("Unexpected error occurred: %s", str(e)) + if response.status == ReportBaseType.accepted: + logging.info("%s successful", Action.GetBaseReport) + else: + logging.info("%s filed", Action.GetBaseReport) - logging.info("send_get_base_report done.") # Function to send OCPP command async def send_ocpp_command(cp, command_name, delay=None, period=None): - # If delay is not None, sleep for delay seconds + try: + match command_name: + case Action.ClearCache: + logging.info("%s Send:", Action.ClearCache) + await cp.send_clear_cache() + case Action.GetBaseReport: + logging.info("%s Send:", Action.GetBaseReport) + await cp.send_get_base_report() + case _: + logging.warning(f"Unsupported command {command_name}") + except Exception: + logging.exception(f"Failure while processing command {command_name}") + if delay: await asyncio.sleep(delay) - # If period is not None, send command repeatedly with period interval if period: - - async def send_command_repeatedly(): - while True: - command_name = await cp.receive_command() - try: - match command_name: - case Action.ClearCache: - logging.info("ClearCache parser working") - await cp.send_clear_cache() - case Action.GetBaseReport: - logging.info("GetBaseReport parser working") - await cp.send_get_base_report() - case _: - logging.warning(f"Unsupported command {command_name}") - except Exception: - logging.exception( - f"Failure while processing command {command_name}" - ) - finally: - await asyncio.sleep(period) - - timer = RepeatTimer(period, send_command_repeatedly) - await timer.start() - await timer.wait_closed() # Wait for timer to finish before exiting - - else: - if command_name == "GetBaseReport": - await cp.send_get_base_report() + my_timer = RepeatTimer(period, asyncio.create_task, [cp.send_ocpp_command(command_name)]) + my_timer.start() # Function to handle new WebSocket connections. -async def on_connect(websocket, path, args): +async def on_connect(websocket, path): """For every new charge point that connects, create a ChargePoint instance and start listening for messages.""" try: @@ -202,39 +178,38 @@ async def on_connect(websocket, path, args): ChargePoints.add(cp) try: await cp.start() - # Check if request argument is specified - if args.request: - asyncio.create_task( - send_ocpp_command(cp, args.request, args.delay, args.period) - ) except ConnectionClosed: logging.info("ChargePoint %s closed connection", cp.id) ChargePoints.remove(cp) logging.debug("Connected ChargePoint(s): %d", len(ChargePoints)) - # Main function to start the WebSocket server. async def main(): # Define argument parser - parser = argparse.ArgumentParser(description="OCPP Charge Point Simulator") - parser.add_argument("--request", type=str, help="OCPP 2 Command Name") + parser = argparse.ArgumentParser(description="OCPP2 Charge Point Simulator") + parser.add_argument("--command", type=str, help="OCPP2 Command Name") parser.add_argument("--delay", type=int, help="Delay in seconds") parser.add_argument("--period", type=int, help="Period in seconds") - args = parser.parse_args() - - on_connect_bound = partial(on_connect, args=args) # Add args to on_connect # Create the WebSocket server and specify the handler for new connections. server = await websockets.serve( - on_connect_bound, + on_connect, "127.0.0.1", # Listen on loopback. 9000, # Port number. subprotocols=["ocpp2.0", "ocpp2.0.1"], # Specify OCPP 2.0.1 subprotocols. ) logging.info("WebSocket Server Started") + args = parser.parse_args() + + if args.command: + for cp in ChargePoints: + asyncio.create_task( + send_ocpp_command(cp, args.command, args.delay, args.period) + ) + # Wait for the server to close (runs indefinitely). await server.wait_closed() -- 2.34.1