如何在一个Python脚本中使用WebSocket和Web服务器

问题描述

我想创建一个EV充电器(电动汽车)服务器的原型,以便可以通过网站管理EV充电杆。因此,我创建了一个非常简单的Python脚本,其中充电杆可以通过websocket连接到服务器。同时,Web服务器应连接到同一服务器。因此,该脚本应该能够通过websocket和http(s)接受传入的连接。

我在下面创建了脚本,并且可以正常工作。如果执行netstat,我可以看到端口8000和9000正在侦听并接受连接。但是,问题在于函数on_connect没有被触发。那里出了什么问题或我想念什么?

仅作记录,我是Python的新手。任何帮助深表感谢!

import asyncio
import websockets
import json
import requests
import http.server
import socketserver
from datetime import datetime

import MysqL.connector
from MysqL.connector import Error
from MysqL.connector import errorcode

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

connection = MysqL.connector.connect(host='localhost',database='[name_database]',user='[username]',password='[password]')

PORT1 = 9000    # EV CHARGER SERVER
PORT2 = 8000    # WEB SERVER
SERVERADDRESS = '[server_address]'

def closeMysqL():
    if (connection.is_connected()):
                connection.close()
                print("MysqL connection closed")
                print("-----------------------------------------------------")

class ChargePoint(cp):
    @on(Action.BootNotification)
    def on_boot_notitication(self,charge_point_vendor,charge_point_model,**kwargs):
        return call_result.BootNotificationPayload(
            current_time=datetime.utcNow().isoformat(),interval=10,status=RegistrationStatus.accepted
        )

async def on_connect(websocket,path):

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

    print("EV Charge point '"+charge_point_id+ "' has connected!")

    try:
        cursor = connection.cursor()
        MysqL_query = """DO SOME sql STUFF"""
        cursor.execute(MysqL_query)
        connection.commit()
        cursor.close()

    except MysqL.connector.Error as error:
        print("Something went wrong: {}".format(error))

    finally:
        closeMysqL()

    await cp.start()

async def main():
    server = await websockets.serve(
        on_connect,SERVERADDRESS,PORT1,subprotocols=['ocpp1.6']
    )
    with socketserver.Tcpserver((SERVERADDRESS,PORT2),http.server.SimpleHTTPRequestHandler) as httpd:
        print("Websockets EV Server is serving at port",PORT1)
        print("Webserver is serving at port",PORT2)
        httpd.serve_forever()
    await server.wait_closed()

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)