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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:18:13