同一Python脚本实现WebSocket客户端与服务器双连接问题
问题:Python脚本同时作为WebSocket服务端与ESP32客户端的作用域问题
需求
- 编写Python脚本,同时承担两个角色:
- 作为WebSocket服务器,为网页端客户端提供服务
- 作为WebSocket客户端,连接接收指令的ESP32开发板
当前问题
基于websockets库编写的初步代码遇到作用域问题:Client_handler函数无法访问ESPWebsocket对象,客户端连接时触发NameError: name 'ESPWebsocket' is not defined错误,无法同时实现向硬件发送指令和向网页客户端返回状态更新。
尝试使用websocket-client库结合webhook实现,但这种方式无法向网页客户端发送实时反馈,已搜索多日未找到有效解决方案。
相关代码
初始代码(基于websockets库)
#!/usr/local/bin/python import asyncio import itertools import json import websockets async def Client_handler(ClientWebsocket): # Initialize a Connect Four game. async for message in ClientWebsocket: print(message) # Send data to the control board await ESPWebsocket.send('Message to Hardware') ClientUpdate = { "type": "Motion", "Direction": 1, } await ClientWebsocket.send(json.dumps(ClientUpdate)) async def main(): async with websockets.serve(Client_handler, "", 8001) as ClientWebsocket, websockets.connect("ws://192.168.1.192/ws") as ESPWebsocket: await asyncio.Future() # run forever if __name__ == "__main__": asyncio.run(main())
替代尝试代码(websocket-client+webhook)
#!/usr/local/bin/python import time import webhook_listener import websocket import threading import rel ###################################### # Global Vars ###################################### MagicNumber = 0 StopServer = False ###################################### # Setup defs ###################################### def on_message(ws, message): print(message) def on_error(ws, error): print(error) def on_close(ws, close_status_code, close_msg): print("### closed ###") def on_open(ws): global StopServer print("Opened connection") webhooks = webhook_listener.Listener(handlers={"POST": process_post_request}) webhooks.start() while StopServer == False: # print("Still alive...") print(MagicNumber) print(time.time()) def process_post_request(request, *args, **kwargs): global MagicNumber, StopServer print(kwargs) if kwargs['StopServer']: StopServer = True MagicNumber = kwargs['Number'] return websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://192.168.1.192/ws", on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close) ws.run_forever(dispatcher=rel, reconnect=5) # Set dispatcher to automatic reconnection, 5 second reconnect delay if connection closed unexpectedly rel.signal(2, rel.abort) # Keyboard Interrupt rel.dispatch()
内容的提问来源于stack exchange,提问作者mcgyvrfan121
相关产品推荐
相关产品推荐

