Отправка сообщения с помощью websockets в мультисессионном подключении

Дано: Сервер на webosockets который слушает один порт, от которого ожидает сообщения от клиента №1, для обработки сообщений от которого имеется отдельный класс ChargePoint. Так же сервер слушает другой порт, при подключении клиента №2 к этому порту, сервер должен отправлять все, что случается с клиентом № 1. Как это можно реализовать. Вот мои попытки...

import asyncio
import logging
from datetime import datetime
from ocpp.routing import on
from ocpp.v16 import ChargePoint as cp
from ocpp.v16.enums import Action, RegistrationStatus
from ocpp.v16 import call_result
import DataBase

try:
    import websockets
except ModuleNotFoundError:
    print("This example relies on the 'websockets' package.")
    print("Please install it by running: ")
    print()
    print(" $ pip install websockets")
    import sys
    sys.exit(1)


logging.basicConfig(level=logging.INFO)

User = 0
class ChargePoint(cp):
    @on(Action.BootNotification)
    def on_boot_notification(self, charge_point_vendor: str, charge_point_model: str, **kwargs):
        CP=DataBase.connect(DataBase.Get_ChargePoint())
        for row in CP:
            if charge_point_vendor == row[2] and charge_point_model == row[1]:
                B=call_result.BootNotificationPayload(
                    current_time=datetime.utcnow().isoformat(),
                    interval=10,
                    status=RegistrationStatus.accepted
                )
                break
            else:
                B=call_result.BootNotificationPayload(
                    current_time=datetime.utcnow().isoformat(),
                    interval=10,
                    status=RegistrationStatus.rejected
                )
        return B

    @on(Action.StatusNotification)
    def on_status_notification(self, connector_id: int, error_code: str, status: str, timestamp:str, **kwargs):
        return call_result.StatusNotificationPayload()

    @on(Action.Authorize)
    def on_autorize(self, id_tag: str, **kwargs):
        global User
        Client = DataBase.connect(DataBase.Get_Client())
        for row in Client:
            if row[2] == id_tag:
                User = row[0]
                print('another connection')
                return call_result.AuthorizePayload(
                    id_tag_info={
                        'status': 'Accepted'
                        }
                        )
            else:
                print('Denied')
                return call_result.AuthorizePayload(
                    id_tag_info={
                        'status': 'Invalid'
                        }
                        )
            break

    @on(Action.Heartbeat)
    def on_hearbeat(self):
        print('Got a Heartbeat!')
        return call_result.HeartbeatPayload(
            current_time=datetime.utcnow().isoformat()
        )

    @on(Action.MeterValues)
    def on_meter_values(self, connector_id: int, meter_value: list, **kwargs):
        return call_result.MeterValuesPayload()

    @on(Action.StartTransaction)
    def on_start_transaction(self, connector_id: int, id_tag: str, meter_start: int, timestamp: str, **kwargs):
        idt = DataBase.connect(DataBase.Get_Trans())
        DataBase.connect(DataBase.Insert(User))
        return call_result.StartTransactionPayload(
            transaction_id=idt+1,
            id_tag_info={'status': 'Accepted'}
        )


    @on(Action.StopTransaction)
    def on_stop_transaction(self, meter_stop: int, timestamp: str, transaction_id: int, **kwargs):
        return call_result.StopTransactionPayload()



async def on_connect(websocket, path):
    global crack
    try:
        requested_protocols = websocket.request_headers[
            'Sec-WebSocket-Protocol']
    except KeyError:
        logging.error(
            "Client hasn't requested any Subprotocol. Closing Connection"
        )
        return await websocket.close()
    if websocket.subprotocol:
        logging.info("Protocols Matched: %s", websocket.subprotocol)
    else:
        logging.warning('Protocols Mismatched | Expected Subprotocols: %s,'
                        ' but client supports  %s | Closing connection',
                        websocket.available_subprotocols,
                        requested_protocols)
        return await websocket.close()

    charge_point_id = path.strip('/')
    cp = ChargePoint(charge_point_id, websocket)
    await cp.start()

async def main():
    server = await websockets.serve(
        on_connect,
        '0.0.0.0',
        9000,
        subprotocols=['ocpp1.6']
    )
    logging.info("Server Started listening to new connections...")
    start_server = await websockets.serve(hi, "localhost", 7890)

    await start_server.wait_closed()
    await server.wait_closed()


async def hi(websocket):
    print("Server listening on Port " + str(7890))
    print("A client just connected")
    try:
        async for message in websocket:
            print("Received message from client: " + message)
            await websocket.send("Hi")
    except websockets.exceptions.ConnectionClosed:
        print("A client just disconnected")


if __name__ == "__main__":
    asyncio.run(main())

Ответы (0 шт):