树莓派Seek热像仪WebSocket推流遇Errno 111连接拒绝问题求助
排查树莓派+Seek热像仪WebSocket视频传输系统的
Errno 111 连接被拒绝错误 问题背景
开发一套基于树莓派3B+与Seek热像仪的实时视频传输系统:树莓派作为客户端采集热像仪实时帧,通过WebSocket推送到PC端服务器;PC端接收帧后用YOLOv8执行人形检测并展示。但运行两端代码时始终出现Errno 111 连接被拒绝错误。
核心错误原因与修复步骤
1. WebSocket服务未正确搭建
服务器端代码错误地启动了一个WebSocket客户端,完全没有在PC上部署WebSocket服务端。需要用专门的库搭建服务,而非反向连接。
2. 连接地址不匹配
- 树莓派客户端代码中连接的是
127.0.0.1(本地回环地址),这只会连接树莓派自身,应替换为PC的局域网IP(比如你代码里的192.168.1.8) - 服务器端错误地尝试连接自己的IP,逻辑完全颠倒
3. 基础语法错误
- 类初始化方法应为
__init__(双下划线),你写成了_init_ if __name__ == "__main__"的变量名缺少双下划线,写成了_name_和_main_- OpenCV常量
IMREAD_COLOR被写成IMREADCOLOR(缺少下划线) - Supervision库的
LabelAnnotator和from_ultralytics方法名被写错,导致无法调用
修正后的客户端代码
import cv2 import numpy as np from threading import Condition import websocket from seekcamera import ( SeekCameraIOType, SeekCameraColorPalette, SeekCameraManager, SeekCameraManagerEvent, SeekCameraFrameFormat, SeekCamera, SeekFrame, ) class Renderer: def __init__(self): # 修正双下划线 self.busy = False self.frame = SeekFrame() self.camera = SeekCamera() self.frame_condition = Condition() self.first_frame = True def on_frame(_camera, camera_frame, renderer): with renderer.frame_condition: renderer.frame = camera_frame.color_argb8888 renderer.frame_condition.notify() def on_event(camera, event_type, event_status, renderer): print("{}: {}".format(str(event_type), camera.chipid)) if event_type == SeekCameraManagerEvent.CONNECT: if renderer.busy: return renderer.busy = True renderer.camera = camera renderer.first_frame = True camera.color_palette = SeekCameraColorPalette.WHITE_HOT camera.register_frame_available_callback(on_frame, renderer) camera.capture_session_start(SeekCameraFrameFormat.COLOR_ARGB8888) elif event_type == SeekCameraManagerEvent.DISCONNECT: if renderer.camera == camera: camera.capture_session_stop() renderer.camera = None renderer.frame = None renderer.busy = False elif event_type == SeekCameraManagerEvent.ERROR: print("{}: {}".format(str(event_status), camera.chipid)) def stream_video(renderer): # 替换为PC的实际局域网IP ws = websocket.create_connection("ws://192.168.1.8:8080/stream") try: while True: with renderer.frame_condition: renderer.frame_condition.wait(150.0 / 1000.0) frame = renderer.frame if frame is not None: # 避免发送空帧导致错误 ws.send_binary(frame) except Exception as e: print(f"连接异常: {e}") finally: ws.close() if __name__ == "__main__": # 修正双下划线 renderer = Renderer() with SeekCameraManager(SeekCameraIOType.USB) as manager: manager.register_event_callback(on_event, renderer) stream_video(renderer)
修正后的服务器端代码(基于websockets库搭建服务)
先安装依赖:
pip install websockets ultralytics supervision opencv-python
import asyncio import websockets import cv2 import numpy as np from ultralytics import YOLO import supervision as sv # 预加载YOLO模型和标注器 model = YOLO('yolov8n.pt') label_annotator = sv.LabelAnnotator( border_radius=1, text_thickness=2, text_scale=1 ) async def handle_client(websocket): print("客户端已连接") try: async for frame_data in websocket: # 将二进制帧转换为OpenCV格式 frame = cv2.imdecode(np.frombuffer(frame_data, np.uint8), cv2.IMREAD_COLOR) if frame is None: continue # 执行人形检测(只保留类别0:人) results = model(frame)[0] detections = sv.Detections.from_ultralytics(results) detections = detections[detections.class_id == 0] # 标注并显示帧 annotated_frame = label_annotator.annotate(scene=frame, detections=detections) cv2.imshow('Seek热像仪 - 人形检测', annotated_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break except websockets.exceptions.ConnectionClosed: print("客户端断开连接") finally: cv2.destroyAllWindows() async def main(): # 绑定PC所有网卡的8080端口,等待客户端连接 async with websockets.serve(handle_client, "0.0.0.0", 8080): print("WebSocket服务已启动,端口8080") await asyncio.Future() # 保持服务运行 if __name__ == "__main__": asyncio.run(main())
额外注意事项
- 确保树莓派和PC在同一局域网内,PC防火墙允许8080端口的入站连接
- 运行顺序:先启动PC端的WebSocket服务,再启动树莓派客户端代码
- 先通过
ping 192.168.1.8验证树莓派与PC的网络连通性
内容的提问来源于stack exchange,提问作者Nancy Mohammed
相关产品推荐
相关产品推荐

