You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:52:38