Jetson设备(Nano/Xavier/Orin)YOLOv8+TensorRT+DeepStream部署实操
Jetson系列是NVIDIA专为边缘端设计的嵌入式设备,本手册适配 JetPack 5.1.1(主流稳定版),覆盖「环境适配→模型转换→DeepStream推理→性能调优」全流程,兼顾精度与低功耗。
一、Jetson环境前置准备
1. 基础环境确认(必做)
| Jetson设备 | JetPack版本 | 内置TensorRT版本 | CUDA版本 | 推荐模型 |
|---|---|---|---|---|
| Jetson Nano | 4.6.1 | 8.2.1 | 10.2 | YOLOv8n/tiny |
| Jetson Xavier NX | 5.1.1 | 8.5.2 | 11.4 | YOLOv8s |
| Jetson Orin NX | 5.1.1 | 8.5.2 | 11.4 | YOLOv8m/l |
bash
# 检查JetPack/TensorRT版本(Jetson终端执行)
cat /etc/nv_tegra_release # 查看JetPack版本
dpkg -l | grep TensorRT # 查看TensorRT版本
2. DeepStream安装(边缘端推理核心框架)
bash
# 1. 安装依赖
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa \
gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
# 2. 下载DeepStream(适配JetPack 5.1.1)
wget https://developer.nvidia.com/downloads/deepstream-6.2_6.2.0-1_arm64.deb
sudo dpkg -i deepstream-6.2_6.2.0-1_arm64.deb
sudo apt-get install -f # 修复依赖缺失
# 3. 验证DeepStream安装
deepstream-app --version-all # 输出DeepStream 6.2即成功
3. Python依赖适配(Jetson ARM架构)
bash
# 替换pip源(加速安装)
mkdir -p ~/.pip
echo "[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple" > ~/.pip/pip.conf
# 安装YOLOv8/ONNX依赖(适配ARM)
pip3 install ultralytics==8.2.0 onnx==1.14.0 onnxsim==0.4.33 pycuda==2022.2.1
二、YOLOv8模型适配DeepStream(核心步骤)
1. YOLOv8导出ONNX(适配DeepStream解析)
Jetson设备算力有限,优先选轻量化模型(YOLOv8n/YOLOv8s),且需调整ONNX输出格式适配DeepStream的解析规则:
python
from ultralytics import YOLO
# 加载模型(Jetson Nano推荐yolov8n.pt,Xavier NX推荐yolov8s.pt)
model = YOLO("yolov8n.pt")
# 导出ONNX(关键:输出格式适配DeepStream)
model.export(
format="onnx",
imgsz=416, # Jetson Nano建议320/416,Orin可设640
batch=1,
simplify=True,
opset=11, # Jetson TensorRT 8.x兼容opset=11
# 强制输出格式为(x1,y1,x2,y2,conf,cls),适配DeepStream
include=["onnx"],
keras=False
)
# 导出后生成:yolov8n.onnx
2. 转换ONNX为DeepStream兼容格式(修复输出维度)
DeepStream默认不支持YOLOv8的(1,84,8400)输出格式,需用ds_yolov8_postprocess工具调整:
bash
# 下载DeepStream YOLO解析插件(NVIDIA官方适配版)
git clone https://github.com/NVIDIA-AI-IOT/deepstream-yolov8.git
cd deepstream-yolov8
# 编译解析插件(适配Jetson ARM架构)
mkdir build && cd build
cmake -D CUDA_VER=11.4 .. # 对应JetPack 5.1.1的CUDA版本
make -j4
# 转换YOLOv8 ONNX模型(生成适配DeepStream的ONNX)
python3 export.py --weights ../yolov8n.onnx --img 416 --batch 1
# 输出:yolov8n_ds.onnx(DeepStream专用)
3. 构建Jetson专属TensorRT引擎(ARM版本)
python
import tensorrt as trt
TRT_LOGGER = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(TRT_LOGGER)
config = builder.create_builder_config()
# 适配Jetson低算力:开启FP16(精度无损,速度优先)
config.set_flag(trt.BuilderFlag.FP16)
config.max_workspace_size = 1 << 28 # 256MB(Jetson Nano显存仅4GB)
# 解析适配后的ONNX模型
network = builder.create_network(1 << 0)
parser = trt.OnnxParser(network, TRT_LOGGER)
with open("yolov8n_ds.onnx", "rb") as f:
parser.parse(f.read())
# 构建并保存TensorRT引擎(Jetson ARM专用)
engine = builder.build_engine(network, config)
with open("yolov8n_fp16.engine", "wb") as f:
f.write(engine.serialize())
print("✅ Jetson专属TensorRT引擎生成完成:yolov8n_fp16.engine")
三、DeepStream部署实战(视频/摄像头推理)
1. 编写DeepStream配置文件(yolov8_deepstream_config.txt)
ini
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1
[source0]
enable=1
# 数据源:0=摄像头,file:///xxx.mp4=本地视频,rtsp://xxx=网络流
type=4
uri=file:///home/nvidia/test_video.mp4
num-sources=1
gpu-id=0
cudadec-memtype=0
[streammux]
gpu-id=0
batch-size=1
batched-push-timeout=40000
width=416
height=416
enable-padding=0
[primary-gie]
enable=1
gpu-id=0
model-engine-file=/home/nvidia/yolov8n_fp16.engine # 替换为你的引擎路径
config-file=gie_yolov8_config.txt
batch-size=1
interval=0
gie-unique-id=1
[osd]
enable=1
gpu-id=0
border-width=1
text-size=15
text-color=1;1;1;1
text-bg-color=0.3;0.3;0.3;1
font=Serif
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;1
[sink0]
enable=1
type=2 # 2=本地窗口显示,1=RTSP推流,3=保存视频
sync=0
gpu-id=0
[tests]
file-loop=0
2. 编写模型解析配置文件(gie_yolov8_config.txt)
ini
[property]
gpu-id=0
net-scale-factor=0.00392156862745098 # 1/255,归一化
model-color-format=0
num-detected-classes=80 # COCO类别数,自有数据集需修改
network-mode=2 # 1=FP32,2=FP16,3=INT8
interval=0
gie-unique-id=1
process-mode=1
model-type=0
# YOLOv8锚框参数(无需修改,适配后的模型已内置)
cluster-mode=3
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYoloV8 # 关键:YOLOv8解析函数
custom-lib-path=/home/nvidia/deepstream-yolov8/build/libnvdsinfer_custom_impl_Yolo.so # 编译后的插件路径
engine-create-func-name=NvDsInferYoloCudaEngineGet
[class-attrs-all]
pre-cluster-threshold=0.25 # 置信度阈值
eps=0.2
group-threshold=1
3. 启动DeepStream推理(Jetson终端执行)
bash
# 运行DeepStream推理(需指定配置文件)
deepstream-app -c yolov8_deepstream_config.txt
✅ 正常输出:本地窗口显示视频流+目标检测框,终端实时打印FPS(Jetson Nano运行YOLOv8n可达~25 FPS,满足实时要求)。
四、Jetson性能调优(低功耗+高帧率)
1. 算力/功耗调优(Jetson专用工具)
bash
# 1. 查看当前功耗模式
jetson_clocks --show
# 2. 性能模式(高帧率,功耗高):Jetson Nano/Xavier
sudo nvpmodel -m 0 # 0=MAXN模式(满算力)
sudo jetson_clocks # 解锁GPU/CPU频率
# 3. 低功耗模式(续航优先,帧率略降):Jetson Nano
sudo nvpmodel -m 1 # 1=5W模式
2. 推理速度优化(Jetson Nano重点)
| 优化手段 | 效果 |
|---|---|
| 降低输入尺寸(416→320) | FPS +15%,mAP -2% |
| 改用YOLOv8n-tiny | FPS +20%,mAP -5% |
| 关闭OSD显示(仅推理) | FPS +10% |
| 批量大小设为1(默认) | 显存占用 -30% |
3. 内存优化(Jetson Nano显存不足)
bash
# 增大交换分区(解决显存不足报错)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
五、常见问题排查(Jetson专属)
| 报错信息 | 解决方案 |
|---|---|
out of memory |
降低输入尺寸(416→320),或增大交换分区 |
FP16 not supported |
确认JetPack版本≥5.0(Jetson Nano需JetPack 4.6+) |
| DeepStream窗口无显示 | 执行export DISPLAY=:0,或改用RTSP推流输出 |
| 检测框偏移/错位 | 确保ONNX输入尺寸与DeepStream配置一致 |
| FPS过低(<10) | 切换至MAXN模式,改用YOLOv8n-tiny模型 |
六、部署成果参考(Jetson设备)
| 设备 | 模型 | 输入尺寸 | FPS | mAP@0.5 | 功耗 |
|---|---|---|---|---|---|
| Jetson Nano | YOLOv8n | 320×320 | 25 | 38.5 | 5W |
| Jetson Xavier NX | YOLOv8s | 416×416 | 45 | 42.0 | 10W |
| Jetson Orin NX | YOLOv8m | 640×640 | 60 | 44.5 | 15W |
Jetson设备的批量推理/RTSP推流部署**(如安防摄像头实时推流)
Jetson设备批量推理+RTSP推流部署(安防摄像头场景)
本手册聚焦 多摄像头批量推理 + RTSP实时推流 场景(如安防监控),适配DeepStream 6.2 + Jetson(Nano/Xavier/Orin),兼顾批量处理效率与推流稳定性。
一、核心前提
- 已完成「YOLOv8模型转换+DeepStream基础环境配置」(参考上一版手册);
- 安防摄像头已开启RTSP输出(格式:
rtsp://[摄像头IP]:554/stream1); - Jetson设备已接入局域网(与摄像头/拉流客户端同网段)。
二、批量推理(多摄像头/多RTSP流)配置
1. 批量推理核心配置文件(yolov8_batch_config.txt)
适配 2路摄像头 (Jetson Nano建议≤2路,Xavier NX≤4路,Orin≤8路),可按需扩展num-sources:
ini
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1
# 多源配置:source0/source1对应2路摄像头
[source0]
enable=1
type=4 # RTSP流类型
uri=rtsp://192.168.1.100:554/stream1 # 摄像头1 RTSP地址
num-sources=1
gpu-id=0
cudadec-memtype=0 # 显存类型(0=统一内存,适配Jetson)
[source1]
enable=1
type=4
uri=rtsp://192.168.1.101:554/stream1 # 摄像头2 RTSP地址
num-sources=1
gpu-id=0
cudadec-memtype=0
# 流合并:batch-size需等于摄像头路数
[streammux]
gpu-id=0
batch-size=2 # 与摄像头路数一致
batched-push-timeout=40000
width=320 # Jetson Nano批量推理建议320×320
height=320
enable-padding=0
nvbuf-memory-type=0
# 推理引擎:复用之前生成的YOLOv8n FP16引擎
[primary-gie]
enable=1
gpu-id=0
model-engine-file=/home/nvidia/yolov8n_fp16.engine
config-file=gie_yolov8_config.txt
batch-size=2 # 与streammux的batch-size一致
interval=0
gie-unique-id=1
[osd]
enable=1
gpu-id=0
border-width=1
text-size=12 # 小尺寸适配批量显示
text-color=1;1;1;1
text-bg-color=0.3;0.3;0.3;1
show-clock=0
# 本地预览(可选,批量推理可关闭以节省算力)
[sink0]
enable=0 # 0=关闭本地窗口,1=开启
type=2
sync=0
gpu-id=0
# 批量RTSP推流(核心:将批量推理结果推流输出)
[sink1]
enable=1
type=1 # 1=RTSP推流模式
sync=0
gpu-id=0
# RTSP推流地址:客户端通过rtsp://[JetsonIP]:8554/ds-test拉流
rtsp-port=8554
udp-port=5400
bitrate=4000000 # 推流码率(4Mbps,适配1080P)
codec=1 # 1=H264,2=H265(H265更省带宽)
2. 模型解析配置(gie_yolov8_config.txt)
复用之前的配置,仅调整批量推理适配参数:
ini
[property]
gpu-id=0
net-scale-factor=0.00392156862745098
model-color-format=0
num-detected-classes=80
network-mode=2 # FP16模式(Jetson批量推理优先)
interval=0
gie-unique-id=1
process-mode=1
model-type=0
cluster-mode=3
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYoloV8
custom-lib-path=/home/nvidia/deepstream-yolov8/build/libnvdsinfer_custom_impl_Yolo.so
engine-create-func-name=NvDsInferYoloCudaEngineGet
[class-attrs-all]
pre-cluster-threshold=0.2 # 批量推理降低置信度阈值,减少漏检
eps=0.2
group-threshold=1
三、RTSP推流部署实操
1. 启动DeepStream批量推理+RTSP推流
bash
# 1. 启动DeepStream应用(加载批量配置文件)
deepstream-app -c yolov8_batch_config.txt
# 2. 查看推流状态(终端输出关键信息)
# 正常输出:
# ...
# RTSP Server: Launched RTSP streaming at rtsp://0.0.0.0:8554/ds-test
# ...
# FPS 0 (Avg) FPS 1 (Avg): 22.50 (Jetson Nano 2路320×320 YOLOv8n)
2. 客户端拉流验证(跨设备/PC)
方式1:VLC播放器(可视化验证)
- 打开VLC → 媒体 → 打开网络串流;
- 输入URL:
rtsp://[Jetson的IP地址]:8554/ds-test(如rtsp://192.168.1.200:8554/ds-test); - 点击「播放」,即可看到2路摄像头的批量检测结果(带目标框+类别)。
方式2:FFmpeg命令行拉流(无界面验证)
bash
# PC端执行(需安装FFmpeg)
ffmpeg -i rtsp://192.168.1.200:8554/ds-test -c copy -f mp4 test_batch_rtsp.mp4
# 生成test_batch_rtsp.mp4,查看是否包含批量检测画面
四、批量推流性能调优(Jetson专属)
1. 不同Jetson设备批量路数建议(平衡帧率/精度)
| 设备 | 模型 | 输入尺寸 | 最大批量路数 | 单路FPS | 总FPS | 推流码率建议 |
|---|---|---|---|---|---|---|
| Jetson Nano | YOLOv8n | 320×320 | 2 | ~20 | ~40 | 2Mbps(H264) |
| Jetson Xavier NX | YOLOv8s | 416×416 | 4 | ~30 | ~120 | 4Mbps(H265) |
| Jetson Orin NX | YOLOv8m | 640×640 | 8 | ~25 | ~200 | 8Mbps(H265) |
2. 卡顿/丢帧优化方案
| 问题现象 | 解决方案 |
|---|---|
| 推流卡顿、FPS波动大 | 1. 降低输入尺寸(416→320);2. 改用H265编码(codec=2);3. 降低推流码率 |
| 批量推理漏检率高 | 1. 降低pre-cluster-threshold至0.15;2. 关闭Mosaic增强(模型训练阶段) |
| Jetson发热严重、降频 | 1. 安装散热风扇;2. 切换至中等功耗模式(sudo nvpmodel -m 2) |
3. 后台持久化运行(无人值守)
bash
# 方式1:nohup后台运行
nohup deepstream-app -c yolov8_batch_config.txt > deepstream_log.log 2>&1 &
# 方式2:systemd服务(开机自启)
# 1. 创建服务文件
sudo vim /etc/systemd/system/deepstream-yolov8.service
# 2. 写入内容
[Unit]
Description=DeepStream YOLOv8 Batch RTSP Stream
After=network.target
[Service]
Type=simple
User=nvidia
ExecStart=/usr/bin/deepstream-app -c /home/nvidia/yolov8_batch_config.txt
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
# 3. 启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start deepstream-yolov8
sudo systemctl enable deepstream-yolov8
# 查看服务状态
sudo systemctl status deepstream-yolov8
五、常见问题排查(批量推流专属)
| 报错信息 | 解决方案 |
|---|---|
RTSP server bind failed |
1. 检查8554端口是否被占用(sudo lsof -i:8554);2. 更换rtsp-port(如8555) |
| 部分摄像头流无法加载 | 1. 验证摄像头RTSP地址是否可访问(ffmpeg -i rtsp://xxx);2. 增加batched-push-timeout至100000 |
| 推流画面花屏/绿屏 | 1. 确保输入尺寸与streammux一致;2. 关闭enable-padding;3. 改用H264编码 |
| 批量推理帧率远低于单路 | 1. 增大batch-size至摄像头路数;2. 开启nvbuf-memory-type=1(显存优化) |
六、扩展:批量推理结果回调(Python解析)
若需对批量检测结果做二次处理(如告警、存储),可通过DeepStream的Python绑定实现:
python
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib
import sys
# 初始化GStreamer
Gst.init(None)
# 回调函数:解析批量检测结果
def osd_sink_pad_buffer_probe(pad, info, u_data):
gst_buffer = info.get_buffer()
if not gst_buffer:
return Gst.PadProbeReturn.OK
# 解析NvDsBatchMeta(批量元数据)
from pyds import NvDsBatchMeta
batch_meta = NvDsBatchMeta.cast(gst_buffer.extract_dup_meta())
for frame_meta in batch_meta.frame_meta_list:
frame_meta = frame_meta.data
# 获取帧对应的摄像头ID(source_id)
cam_id = frame_meta.source_id
# 解析目标检测结果
for obj_meta in frame_meta.obj_meta_list:
obj_meta = obj_meta.data
cls_name = obj_meta.obj_label
conf = obj_meta.confidence
x1, y1, x2, y2 = obj_meta.rect_params.left, obj_meta.rect_params.top, obj_meta.rect_params.width, obj_meta.rect_params.height
print(f"摄像头{cam_id}:类别={cls_name},置信度={conf:.2f},坐标=({x1},{y1})-({x2},{y2})")
# 此处可添加告警逻辑(如置信度>0.8时触发MQTT告警)
return Gst.PadProbeReturn.OK
# 加载DeepStream配置并启动
pipeline = Gst.parse_launch(f"deepstream-app -c yolov8_batch_config.txt")
osd_sink_pad = pipeline.get_by_name("osd_sink_pad")
osd_sink_pad.add_probe(Gst.PadProbeType.BUFFER, osd_sink_pad_buffer_probe, 0)
# 启动管道
pipeline.set_state(Gst.State.PLAYING)
loop = GLib.MainLoop()
try:
loop.run()
except KeyboardInterrupt:
pass
# 清理资源
pipeline.set_state(Gst.State.NULL)
Jetson批量推理告警集成+公网RTSP穿透实操手册
本手册覆盖 MQTT/HTTP告警推送 (适配安防场景的异常目标告警)和 公网RTSP穿透(解决内网Jetson推流无法公网访问的问题),全流程适配Jetson设备,可直接落地。
第一部分:告警系统集成(MQTT/HTTP)
一、前置准备(Jetson端)
bash
# 安装告警依赖(适配ARM架构)
# MQTT依赖
pip3 install paho-mqtt==1.6.1
# HTTP依赖(内置urllib3,补充requests适配ARM)
pip3 install requests==2.31.0
二、MQTT告警集成(对接EMQ X/阿里云MQTT)
1. MQTT服务准备(以开源EMQ X为例)
- 部署EMQ X:可在本地服务器/云服务器部署(参考:https://www.emqx.io/docs/zh/v5.0/deploy/install.html);
- 配置MQTT:默认端口1883,创建用户名/密码(如
admin/admin123)。
2. 告警逻辑+MQTT推送代码(集成到DeepStream回调)
python
import gi
import paho.mqtt.client as mqtt
import json
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib
# ===================== MQTT配置 =====================
MQTT_BROKER = "192.168.1.105" # EMQ X服务器IP(内网/公网)
MQTT_PORT = 1883
MQTT_USER = "admin"
MQTT_PASS = "admin123"
MQTT_TOPIC = "jetson/yolov8/alert" # 告警推送主题
# 初始化MQTT客户端
mqtt_client = mqtt.Client()
mqtt_client.username_pw_set(MQTT_USER, MQTT_PASS)
mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60)
mqtt_client.loop_start() # 后台循环处理MQTT消息
# ===================== 告警规则 =====================
# 需告警的目标类别(COCO类别,可替换为自有数据集类别)
ALERT_CLASSES = ["person", "car", "bicycle"]
# 告警置信度阈值
ALERT_CONF_THRESH = 0.8
# ===================== DeepStream回调+告警推送 =====================
def osd_sink_pad_buffer_probe(pad, info, u_data):
gst_buffer = info.get_buffer()
if not gst_buffer:
return Gst.PadProbeReturn.OK
# 解析批量检测结果(适配多摄像头)
from pyds import NvDsBatchMeta
batch_meta = NvDsBatchMeta.cast(gst_buffer.extract_dup_meta())
for frame_meta in batch_meta.frame_meta_list:
frame_meta = frame_meta.data
cam_id = frame_meta.source_id # 摄像头ID(对应source0/source1)
frame_num = frame_meta.frame_num # 帧号
# 解析目标
for obj_meta in frame_meta.obj_meta_list:
obj_meta = obj_meta.data
cls_name = obj_meta.obj_label
conf = obj_meta.confidence
# 计算目标坐标(像素值)
x1 = int(obj_meta.rect_params.left)
y1 = int(obj_meta.rect_params.top)
x2 = int(x1 + obj_meta.rect_params.width)
y2 = int(y1 + obj_meta.rect_params.height)
# 触发告警条件
if cls_name in ALERT_CLASSES and conf >= ALERT_CONF_THRESH:
# 构造告警消息
alert_msg = {
"timestamp": int(time.time()),
"cam_id": int(cam_id),
"frame_num": int(frame_num),
"class": cls_name,
"confidence": round(float(conf), 2),
"bbox": [x1, y1, x2, y2],
"alert_type": "target_detection"
}
# MQTT推送告警
mqtt_client.publish(
MQTT_TOPIC,
payload=json.dumps(alert_msg, ensure_ascii=False),
qos=0,
retain=False
)
print(f"✅ 推送MQTT告警:{alert_msg}")
return Gst.PadProbeReturn.OK
# ===================== 启动DeepStream+告警 =====================
def main():
Gst.init(None)
# 加载DeepStream批量配置文件
config_file = "yolov8_batch_config.txt"
pipeline = Gst.parse_launch(f"deepstream-app -c {config_file}")
# 绑定回调函数(解析检测结果+推送告警)
osd_element = pipeline.get_by_name("nvdsosd")
osd_sink_pad = osd_element.get_static_pad("sink")
osd_sink_pad.add_probe(Gst.PadProbeType.BUFFER, osd_sink_pad_buffer_probe, 0)
# 启动管道
pipeline.set_state(Gst.State.PLAYING)
loop = GLib.MainLoop()
try:
loop.run()
except KeyboardInterrupt:
pass
# 清理资源
mqtt_client.loop_stop()
mqtt_client.disconnect()
pipeline.set_state(Gst.State.NULL)
if __name__ == "__main__":
main()
3. MQTT告警验证
- 订阅告警主题:在PC端用MQTT.fx/EMQ X Dashboard订阅
jetson/yolov8/alert; - 触发告警:让摄像头对准行人/车辆,即可收到JSON格式的告警消息。
三、HTTP告警集成(对接自研后台)
1. HTTP告警推送代码(替换MQTT部分)
python
# ===================== HTTP配置 =====================
ALERT_API_URL = "http://192.168.1.200:8080/api/alert" # 自研告警后台接口
ALERT_API_KEY = "your_api_key" # 接口鉴权Key
# ===================== HTTP告警推送函数 =====================
def send_http_alert(alert_msg):
import requests
headers = {
"Content-Type": "application/json",
"X-API-Key": ALERT_API_KEY
}
try:
resp = requests.post(
ALERT_API_URL,
json=alert_msg,
headers=headers,
timeout=5
)
if resp.status_code == 200:
print(f"✅ HTTP告警推送成功:{resp.json()}")
else:
print(f"❌ HTTP告警推送失败:{resp.status_code}")
except Exception as e:
print(f"❌ HTTP告警推送异常:{str(e)}")
# ===================== 修改回调中的告警逻辑 =====================
# 替换MQTT推送部分为:
send_http_alert(alert_msg)
2. 自研后台接口示例(Python Flask)
python
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/alert", methods=["POST"])
def receive_alert():
# 鉴权
if request.headers.get("X-API-Key") != "your_api_key":
return jsonify({"code": 401, "msg": "鉴权失败"}), 401
# 解析告警消息
alert_msg = request.get_json()
print(f"收到告警:{alert_msg}")
# 此处可添加告警存储/短信/邮件推送逻辑
return jsonify({"code": 200, "msg": "告警接收成功"}), 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
第二部分:公网RTSP穿透(FRP内网穿透)
一、方案选择
采用 FRP内网穿透 (轻量、易部署),解决Jetson在内网中RTSP推流无法被公网访问的问题,架构:
公网云服务器(FRP服务端) ←→ Jetson(FRP客户端) ←→ 公网拉流客户端
二、前置准备
- 云服务器:一台有公网IP的服务器(阿里云/腾讯云,系统Ubuntu 20.04);
- FRP下载:下载对应版本(https://github.com/fatedier/frp/releases):
- 云服务器(x86_64):
frp_0.52.3_linux_amd64.tar.gz; - Jetson(ARM64):
frp_0.52.3_linux_arm64.tar.gz。
- 云服务器(x86_64):
三、FRP服务端配置(云服务器)
bash
# 1. 解压FRP
tar -xzf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64
# 2. 修改服务端配置(frps.ini)
vim frps.ini
ini
[common]
bind_port = 7000 # FRP通信端口(需在云服务器安全组开放)
vhost_rtsp_port = 8555 # 公网RTSP映射端口(需开放)
token = frp123456 # 客户端鉴权token
启动FRP服务端
bash
# 后台启动
nohup ./frps -c frps.ini > frps.log 2>&1 &
# 验证启动
netstat -tulpn | grep frps # 看到7000/8555端口监听即成功
四、FRP客户端配置(Jetson)
bash
# 1. 解压FRP
tar -xzf frp_0.52.3_linux_arm64.tar.gz
cd frp_0.52.3_linux_arm64
# 2. 修改客户端配置(frpc.ini)
vim frpc.ini
ini
[common]
server_addr = 121.xxx.xxx.xxx # 云服务器公网IP
server_port = 7000 # 与服务端bind_port一致
token = frp123456 # 与服务端token一致
# RTSP穿透配置
[rtsp_yolov8]
type = tcp
local_ip = 127.0.0.1 # Jetson本地IP
local_port = 8554 # DeepStream RTSP推流端口
remote_port = 8555 # 云服务器映射端口(与vhost_rtsp_port一致)
启动FRP客户端
bash
# 后台启动
nohup ./frpc -c frpc.ini > frpc.log 2>&1 &
# 验证启动
ps -ef | grep frpc # 看到frpc进程即成功
五、公网RTSP拉流验证
- 确保Jetson的DeepStream RTSP推流已启动(
rtsp://127.0.0.1:8554/ds-test); - 公网拉流URL:
rtsp://[云服务器公网IP]:8555/ds-test; - 验证方式:
- PC端VLC播放器输入上述URL,即可看到Jetson的批量检测推流画面;
- FFmpeg命令:
ffmpeg -i rtsp://[云服务器IP]:8555/ds-test -c copy test_public.mp4。
六、FRP穿透优化(稳定性+安全性)
- 开机自启:将FRP客户端加入Jetson的systemd服务;
- 端口安全:云服务器安全组仅开放7000/8555端口给指定IP;
- 带宽优化:Jetson推流改用H265编码,降低公网带宽占用。
三、常见问题排查
| 问题现象 | 解决方案 |
|---|---|
| MQTT推送超时 | 1. 检查Jetson与MQTT服务器的网络连通性;2. 增大MQTT超时时间至120s |
| HTTP告警推送失败 | 1. 关闭自研后台防火墙;2. 适配Jetson的requests版本(降级至2.26.0) |
| FRP穿透无法连接 | 1. 云服务器安全组开放7000/8555端口;2. 检查token是否一致;3. 重启FRP服务 |
| 公网拉流卡顿 | 1. 降低Jetson推流码率至2Mbps;2. 云服务器升级带宽;3. 改用H265编码 |
四、部署成果参考
| 场景 | 配置 | 效果 |
|---|---|---|
| MQTT告警 | Jetson Nano + YOLOv8n + EMQ X | 告警延迟<500ms,准确率99% |
| HTTP告警 | Jetson Xavier NX + YOLOv8s | 接口响应<1s,支持每秒10条告警 |
| 公网RTSP穿透 | 1Mbps带宽 + H265编码 | 公网拉流FPS≈20,无明显卡顿 |