From 7c945b4ac211aafb6e90645a0364c12d7373522e Mon Sep 17 00:00:00 2001 From: Sekiya Date: Tue, 25 Jun 2024 17:30:30 +0900 Subject: [PATCH] feat: modified OCPP2.0 test --- tests/ocpp-server/README.md | 29 ++++++++++++++++-------- tests/ocpp-server/server.py | 45 ++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/tests/ocpp-server/README.md b/tests/ocpp-server/README.md index 1b642475..e4a810d8 100644 --- a/tests/ocpp-server/README.md +++ b/tests/ocpp-server/README.md @@ -1,18 +1,11 @@ # OCPP2 Mock Server This project includes an Open Charge Point Protocol (OCPP) version 2.0.1 mock server implemented in Python. -https://github.com/mobilityhouse/ocpp/blob/master/ocpp/v201/enums.py ## Prerequisites This project requires Python 3.7+ and [poetry](https://python-poetry.org/) to install the required packages: -```shell -pip install poetry -``` - -then - ```shell poetry install ``` @@ -25,13 +18,31 @@ To start the server, run the `server.py` script: poetry run task server ``` -or +The server will start listening for connections on port 9000. + +## Running the server with command sending + +You can also specify a command and a period duration with the --request and --period options respectively when running the server. The server will then send your chosen command to the connected client every period seconds. + +### GetBaseReport Command + +To run the server and send a GetBaseReport command every 5 seconds, use: ```shell poetry run task server --request GetBaseReport --period 5 ``` -The server will start listening for connections on port 9000. +======= + +### ClearCache Command + +To run the server and send a ClearCache command every 5 seconds, use: + +```shell +poetry run task server --request 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. ## Overview of the Server Scripts diff --git a/tests/ocpp-server/server.py b/tests/ocpp-server/server.py index d1771754..f48adb21 100644 --- a/tests/ocpp-server/server.py +++ b/tests/ocpp-server/server.py @@ -96,10 +96,8 @@ class ChargePoint(ocpp.v201.ChargePoint): return ocpp.v201.call_result.MeterValues() @on(Action.GetBaseReport) - async def on_get_base_report( - self, request_id: int, report_base: ReportBaseType, **kwargs - ): - logging.info("Received GetBaseReport") + async def on_get_base_report(self, request_id: int, report_base: ReportBaseType, **kwargs): + logging.info("Received %s", Action.GetBaseReport) return ocpp.v201.call_result.GetBaseReport(status="Accepted") # Request handlers to emit OCPP messages. @@ -149,12 +147,28 @@ async def send_ocpp_command(cp, command_name, delay=None, period=None): # If period is not None, send command repeatedly with period interval if period: - while True: - if command_name == "GetBaseReport": - logging.info("GetBaseReport parser working") - await cp.send_get_base_report() + async def send_command_repeatedly(): + while True: + command_name = await charge_point.receive_command() + try: + match command_name: + case 'ClearCache': + logging.info("ClearCache parser working") + await charge_point.send_clear_cache() + case 'GetBaseReport': + logging.info("GetBaseReport parser working") + await charge_point.send_get_base_report() + case _: + logging.warning(f"Unsupported command {command_name}") + except Exception as e: + 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 - await asyncio.sleep(period) else: if command_name == "GetBaseReport": await cp.send_get_base_report() @@ -184,18 +198,13 @@ async def on_connect(websocket, path): charge_point_id = path.strip("/") cp = ChargePoint(charge_point_id, websocket) - # Check if request argument is specified - if args.request: - asyncio.create_task( - send_ocpp_command(cp, args.request, args.delay, args.period) - ) - - # Start the ChargePoint instance to listen for incoming messages. - await cp.start() - 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) -- 2.34.1