1. 存量监控AI升级的底层逻辑与方案选型
1.1 为什么"零硬件替换"是当前存量监控改造的核心命题
做过安防项目的朋友都清楚,国内存量监控摄像头的保有量是个天文数字,其中大量设备是三五年前甚至更早部署的。这些设备有个共同特点:能出图、能录像、RTSP和GB28181协议基本都支持,但本身没有任何AI算力。你让甲方把几百上千路摄像头全部换成AI相机,预算根本批不下来,施工周期也扛不住。
我去年接手的一个园区项目就是典型情况:现场286路海康和大华的老款枪机、球机,最老的设备是2017年装的,固件版本停留在V5.5.x。甲方要求实现周界入侵检测、人员离岗检测、安全帽识别三类AI功能,但明确说了"摄像头一个不换,布线一根不加"。这个约束条件基本上就把方案框死了——你只能在现有网络架构上做文章。
核心思路其实就一句话:把AI算力从摄像头端抽离出来,放到边缘侧或中心侧统一处理。摄像头继续干它最擅长的事——采集视频流,AI分析交给后端的边缘计算盒子或服务器。这样既不用换硬件,也不用改现有网络拓扑,成本能压到最低。
1.2 边缘计算 vs 云端推理:为什么我最终选了边缘侧方案
这里有个关键选型问题:AI推理到底放在哪里做?
云端推理的方案听起来很美——算力无限、模型随便换、运维集中。但实际落地时会撞上几堵墙。第一是带宽,286路1080P视频流全部推到云端,按每路4Mbps算,出口带宽需求超过1Gbps,专线费用一年就是几十万。第二是延迟,从摄像头到云端再返回结果,端到端延迟普遍在500ms以上,周界入侵这种场景要求200ms内响应,根本来不及。第三是数据合规,视频流出了本地网络,很多甲方在安全审计这一关就过不了。
边缘计算的思路是把推理能力下沉到离摄像头最近的节点。具体到我的方案里,就是在每个弱电间部署一台边缘计算盒子,就近接入该区域的摄像头RTSP流,本地完成AI推理,只把结构化结果(比如"区域A检测到人员入侵,时间戳XXX")上传到中心平台。这样做的好处很直接:带宽占用降低90%以上,延迟控制在100ms以内,视频数据不出本地网络。
注意:边缘计算盒子选型时不要盲目追求高算力。我见过有人上来就买带A100的工控机,结果功耗和散热根本扛不住弱电间的环境。实际项目中,INT8量化后的YOLOv5s模型,单路1080P视频推理大概需要0.5TOPS算力,16路并发用一颗瑞芯微RV1106或算能BM1684就够了。
1.3 RTSP与GB28181的取流策略:两条腿走路
存量监控设备的取流方式无非两种:RTSP和GB28181。这两个协议各有各的脾气,实际项目中必须两条腿走路。
RTSP的优势是通用性强,几乎所有的网络摄像头都支持,取流地址格式也很固定。海康的RTSP地址通常是rtsp://admin:password@ip:554/Streaming/Channels/101,大华的是rtsp://admin:password@ip:554/cam/realmonitor?channel=1&subtype=0。但RTSP的坑在于:每路流都要单独建连接,设备数量一多,摄像头的并发连接数就成了瓶颈。我实测过,海康某款老枪机最多支持6路RTSP并发连接,超过之后直接拒绝新连接。
GB28181的优势是标准化程度高,支持信令控制、设备注册、心跳保活,适合大规模部署。但它的坑在于配置复杂,尤其是心跳周期这个参数。很多老设备的默认心跳是60秒,如果平台侧的心跳超时设置也是60秒,网络稍微抖一下设备就掉线了。我一般会把摄像头侧心跳改成30秒,平台侧超时设成90秒,留出足够的容错空间。
实际方案里,我是这样分配的:支持GB28181的设备优先走GB28181接入,不支持的走RTSP拉流。边缘计算盒子上同时运行GB28181客户端和RTSP拉流模块,统一转换成内部格式后送给AI推理引擎。这样既利用了GB28181的标准化优势,又保证了老设备的兼容性。
1.4 整体架构设计:从摄像头到AI结果的完整链路
整个方案的架构可以分成四层:
第一层是设备接入层。摄像头通过RTSP或GB28181把视频流送到边缘计算盒子。这一层的关键是协议适配和流媒体转发,我用的方案是边缘盒子上跑一个轻量级流媒体服务,把不同协议的流统一转成RTSP内部流,方便后续处理。
第二层是AI推理层。这是核心中的核心。边缘计算盒子上部署推理引擎,从流媒体服务拉取视频帧,送进AI模型做推理。推理结果包括目标检测框、类别、置信度等信息。这一层需要考虑模型选型、推理框架、硬件加速等问题。
第三层是业务逻辑层。原始推理结果只是"画面里有人",业务逻辑层要把它变成"周界区域有人入侵"这样的业务事件。这层需要做区域映射、规则判断、事件去重、告警联动等处理。
第四层是中心管理平台。所有边缘节点的事件汇总到这里,做统一展示、存储、检索和联动。中心平台不参与AI推理,只做管理和展示,负载很轻。
这个架构最大的好处是可扩展。今天加10路摄像头,只需要在对应弱电间加一台边缘盒子;明天要换AI模型,只需要在边缘侧更新模型文件,中心平台完全不用动。
2. 核心细节解析与实操要点
2.1 边缘计算盒子的选型与配置要点
边缘计算盒子的选型直接决定了整个方案的成败。我踩过的坑包括:算力不够导致帧率掉到5fps以下、散热不行导致夏天频繁死机、网口太少导致要额外加交换机。
先说算力。AI推理的算力需求取决于三个因素:模型复杂度、输入分辨率、目标帧率。以YOLOv5s为例,输入640x640,INT8量化后,单帧推理大约需要10ms(在BM1684上)。如果要做25fps的实时分析,单路需要250ms的算力,也就是0.25TOPS。16路并发就是4TOPS。但实际项目中不需要每路都做25fps分析,周界入侵这种场景5fps就够了,所以16路实际只需要0.8TOPS。选型时留一倍余量,2TOPS左右的盒子就够用了。
再说接口。边缘盒子至少需要两个千兆网口,一个接摄像头网段,一个接中心平台网段。如果摄像头数量超过16路,建议用双网口做链路聚合,或者直接上万兆光口。我遇到过最坑的情况是盒子只有一个网口,结果所有视频流和平台通信都挤在一条千兆链路上,高峰期丢包严重。
散热是个容易被忽视的问题。弱电间通常没有空调,夏天温度能到45度以上。我选盒子的时候会特别关注两个指标:工作温度范围和散热方式。无风扇被动散热的盒子在45度环境下基本都会降频,最好选带温控风扇的型号,或者把盒子装在弱电间靠近通风口的位置。
配置方面,我的标准配置清单是这样的:
| 配置项 | 推荐规格 | 说明 |
|---|---|---|
| CPU | 四核ARM Cortex-A76或以上 | 负责流媒体处理和业务逻辑 |
| NPU | 2-4TOPS INT8算力 | 负责AI推理加速 |
| 内存 | 4GB LPDDR4以上 | 16路并发需要至少4GB |
| 存储 | 64GB eMMC + 可选SSD | 存模型文件和日志 |
| 网口 | 2x千兆 | 分离摄像头网段和平台网段 |
| 工作温度 | -20°C ~ 60°C | 适应弱电间环境 |
2.2 RTSP拉流的关键参数与稳定性优化
RTSP拉流看起来简单,实际上坑最多。我见过太多项目因为RTSP拉流不稳定导致AI分析时断时续。
第一个关键参数是传输协议。RTSP支持TCP和UDP两种传输方式。UDP延迟低但容易丢包,TCP可靠但延迟稍高。在监控场景下,我强烈建议用TCP。原因很简单:AI分析对帧的完整性要求高,丢一帧可能导致漏检,而TCP的重传机制能保证帧完整。虽然TCP会增加一点延迟,但监控场景对延迟的容忍度比视频会议高得多。
第二个关键参数是超时设置。RTSP拉流的超时包括连接超时、读取超时、心跳超时。默认值通常偏大,导致摄像头断线后要等很久才能重连。我的经验值是:连接超时5秒,读取超时10秒,心跳间隔15秒。这样摄像头断线后最多15秒就能检测到并触发重连。
第三个关键参数是缓冲策略。拉流端需要设置合理的缓冲区大小。缓冲区太小会导致网络抖动时丢帧,太大则会增加延迟。我一般设置200ms的缓冲,既能吸收网络抖动,又不会引入明显延迟。
实际配置时,我用的是FFmpeg做拉流和转码。关键参数如下:
ffmpeg -rtsp_transport tcp \ -stimeout 5000000 \ -i "rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101" \ -f rawvideo -pix_fmt bgr24 -s 640x640 -r 5 \ -an -sn -dn \ pipe:1这里解释几个参数:-rtsp_transport tcp指定TCP传输;-stimeout 5000000设置5秒超时;-r 5把帧率降到5fps,减少推理压力;-s 640x640统一分辨率,方便模型处理。
实操心得:不要用OpenCV的VideoCapture直接拉RTSP流,它的超时控制和重连机制很弱,摄像头断线后经常卡死。用FFmpeg子进程拉流,配合Python的subprocess管理,稳定性高一个数量级。
2.3 GB28181接入的配置细节与心跳调优
GB28181接入比RTSP复杂得多,但大规模部署时优势明显。核心配置项包括SIP服务器地址、设备编码、心跳周期、注册有效期等。
设备编码是GB28181接入的第一个门槛。编码规则是20位数字,前8位是中心编码,中间8位是行业编码,后4位是设备序号。很多老设备不支持自动获取编码,需要手动配置。我遇到过最离谱的情况是设备编码重复,导致平台侧两个设备互相顶掉线。配置前一定要做好编码规划,确保全网唯一。
心跳周期是GB28181稳定性的关键。默认60秒的心跳在理想网络下没问题,但实际网络中路由器、交换机的ARP表老化时间通常是300秒,如果心跳间隔太长,中间设备可能已经把MAC地址表项老化掉了,导致心跳包丢失。我的建议是把心跳周期改成30秒,注册有效期设成3600秒。
远程修改心跳周期是个技术活。对于海康设备,可以通过ISAPI接口修改:
import requests from requests.auth import HTTPDigestAuth url = "http://192.168.1.100/ISAPI/System/Network/GB28181" data = """<?xml version="1.0" encoding="UTF-8"?> <GB28181> <HeartbeatInterval>30</HeartbeatInterval> <RegisterExpires>3600</RegisterExpires> </GB28181>""" response = requests.put(url, data=data, auth=HTTPDigestAuth('admin', 'password'))对于不支持ISAPI的老设备,只能通过Web界面或配置工具手动改。批量修改时可以用设备厂商提供的配置工具,或者写脚本模拟Web登录操作。
2.4 AI模型选型与推理优化
模型选型要平衡三个指标:精度、速度、模型大小。监控场景常用的模型有YOLO系列、SSD、Faster R-CNN等。我的经验是:周界入侵、人员检测用YOLOv5s或YOLOv8n,安全帽识别用YOLOv5m,人脸识别用RetinaFace。
推理优化有几个立竿见影的手段:
量化是最有效的优化手段。FP32模型转成INT8,推理速度能提升2-3倍,模型大小缩小到1/4,精度损失通常在1%以内。我用瑞芯微的RKNN工具链做量化,流程是:PyTorch模型 → ONNX → RKNN。量化时需要准备校准数据集,用实际监控画面截图200-500张就够了。
输入分辨率对速度影响很大。640x640的输入比1280x1280快4倍。监控场景中,周界入侵检测用640x640足够了,因为人形目标在画面中占比通常超过10%。但安全帽识别需要更高分辨率,因为安全帽在画面中可能只有几十个像素。
帧率控制是另一个优化点。不是所有场景都需要25fps分析。周界入侵5fps足够,人员离岗检测1fps都行。我一般会根据业务场景动态调整分析帧率,比如白天10fps、夜间5fps,进一步降低算力消耗。
多模型调度是进阶技巧。边缘盒子上可能同时跑多个模型,需要合理调度NPU资源。我的做法是按优先级排队:周界入侵最高优先级,安全帽识别次之,人员离岗最低。高优先级任务可以抢占低优先级任务的NPU时间片。
3. 实操过程与核心环节实现
3.1 环境准备与依赖安装
先说一下我的测试环境:边缘计算盒子用的是瑞芯微RK3588开发板,8GB内存,6TOPS NPU算力。操作系统是Ubuntu 20.04 ARM64版本。摄像头用的是海康DS-2CD3T46WD-I5,支持RTSP和GB28181。
系统准备的第一步是更新源和安装基础依赖:
sudo apt update && sudo apt upgrade -y sudo apt install -y python3-pip python3-dev ffmpeg libopencv-dev \ cmake build-essential git wget curl然后安装Python依赖。这里要注意,ARM64平台上有些包需要从源码编译,不能直接pip install:
pip3 install numpy opencv-python-headless requests pip3 install rknn-toolkit2 # 瑞芯微NPU推理库FFmpeg的安装要确保支持RTSP和GB28181。Ubuntu自带的FFmpeg通常已经支持RTSP,但GB28181需要额外编译。我一般直接用系统自带的FFmpeg处理RTSP,GB28181用专门的SIP客户端库处理。
注意:RK3588的NPU驱动需要单独安装,Ubuntu官方镜像里不带。驱动安装包在瑞芯微的开发者网站可以下载,安装后需要重启生效。安装完可以用
cat /sys/kernel/debug/rknpu/version检查驱动版本。
3.2 RTSP拉流与视频帧提取的完整实现
拉流模块是整个系统的入口,稳定性至关重要。我的实现方案是用FFmpeg子进程拉流,Python读取标准输出获取视频帧。
import subprocess import numpy as np import cv2 class RTSPStream: def __init__(self, url, width=640, height=640, fps=5): self.url = url self.width = width self.height = height self.fps = fps self.process = None def start(self): cmd = [ 'ffmpeg', '-rtsp_transport', 'tcp', '-stimeout', '5000000', '-i', self.url, '-f', 'rawvideo', '-pix_fmt', 'bgr24', '-s', f'{self.width}x{self.height}', '-r', str(self.fps), '-an', '-sn', '-dn', 'pipe:1' ] self.process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=self.width * self.height * 3 * 2 ) def read(self): frame_size = self.width * self.height * 3 raw = self.process.stdout.read(frame_size) if len(raw) != frame_size: return None frame = np.frombuffer(raw, dtype=np.uint8) frame = frame.reshape((self.height, self.width, 3)) return frame def stop(self): if self.process: self.process.terminate() self.process.wait()这个实现有几个关键点:bufsize设置成两帧大小,避免缓冲区太小导致阻塞;stderr=subprocess.DEVNULL屏蔽FFmpeg的日志输出,避免日志写满管道导致卡死;读取时严格按帧大小读取,不足则返回None触发重连。
重连逻辑也很重要。我一般用一个独立的监控线程,检测到连续10帧读取失败就重启FFmpeg进程:
import time import threading class StreamManager: def __init__(self, url): self.url = url self.stream = RTSPStream(url) self.fail_count = 0 self.running = True def run(self): self.stream.start() while self.running: frame = self.stream.read() if frame is None: self.fail_count += 1 if self.fail_count > 10: self.stream.stop() time.sleep(2) self.stream.start() self.fail_count = 0 else: self.fail_count = 0 # 送AI推理 self.process_frame(frame)3.3 AI推理引擎的部署与调用
推理引擎我用的是RKNN Runtime,这是瑞芯微NPU的官方推理库。模型需要先转换成RKNN格式。
模型转换的流程是:PyTorch训练 → 导出ONNX → RKNN工具链转换。转换脚本如下:
from rknn.api import RKNN rknn = RKNN() rknn.config( mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588', quantized_dtype='asymmetric_quantized-8' ) rknn.load_onnx(model='yolov5s.onnx') rknn.build(do_quantization=True, dataset='calibration.txt') rknn.export_rknn('yolov5s.rknn')calibration.txt是校准图片列表,每行一张图片的路径。校准图片要从实际监控画面中截取,覆盖不同光照、不同场景,至少200张。
推理调用代码:
from rknnlite.api import RKNNLite rknn = RKNNLite() rknn.load_rknn('yolov5s.rknn') rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0) def infer(frame): # 预处理:resize、归一化、转NCHW input_data = preprocess(frame) outputs = rknn.inference(inputs=[input_data]) # 后处理:解码、NMS detections = postprocess(outputs) return detectionsRK3588有三个NPU核心,可以通过core_mask参数指定用哪个核心。多路并发时,可以把不同路分配到不同核心,避免互相抢占。
3.4 业务规则引擎与告警联动
AI推理出来的是原始检测框,业务规则引擎负责把检测框变成业务事件。
以周界入侵为例,规则引擎的处理流程是:
- 区域映射:把检测框的坐标映射到预定义的周界区域。区域用多边形表示,存在配置文件里。
- 目标过滤:只保留"人"这个类别的检测框,过滤掉车辆、动物等。
- 入侵判断:如果检测框的中心点落在周界区域内,且置信度超过阈值(我一般设0.5),判定为入侵。
- 去重:同一目标连续多帧都判定为入侵时,只产生一个告警事件。去重逻辑用IOU匹配,IOU超过0.5认为是同一目标。
- 告警联动:产生告警后,触发录像、抓图、推送消息等动作。
区域映射的代码实现:
import cv2 import numpy as np class RegionRule: def __init__(self, polygon_points, confidence_threshold=0.5): self.polygon = np.array(polygon_points, dtype=np.int32) self.threshold = confidence_threshold def check(self, detections): events = [] for det in detections: if det['class'] != 'person': continue if det['confidence'] < self.threshold: continue cx = (det['x1'] + det['x2']) / 2 cy = (det['y1'] + det['y2']) / 2 if cv2.pointPolygonTest(self.polygon, (cx, cy), False) >= 0: events.append({ 'type': 'intrusion', 'bbox': det, 'timestamp': time.time() }) return events告警去重我用一个简单的状态机:每个目标分配一个ID,连续5帧检测到同一ID才触发告警,连续30帧未检测到则删除ID。
3.5 中心平台对接与数据上报
边缘节点产生的告警事件需要上报到中心平台。上报协议我用的是MQTT,轻量且可靠。
上报的数据格式:
{ "device_id": "edge-001", "camera_id": "cam-101", "event_type": "intrusion", "timestamp": 1699999999, "confidence": 0.87, "bbox": [100, 200, 300, 400], "snapshot_url": "http://edge-001/snapshots/1699999999.jpg" }MQTT客户端用paho-mqtt库,配置QoS=1保证消息至少送达一次:
import paho.mqtt.client as mqtt import json client = mqtt.Client(client_id="edge-001") client.connect("mqtt.center.com", 1883, 60) def report_event(event): topic = f"monitor/events/{event['camera_id']}" payload = json.dumps(event) client.publish(topic, payload, qos=1)中心平台侧订阅monitor/events/#主题,接收所有边缘节点的事件。平台侧做统一存储、展示和联动。
4. 常见问题与排查技巧实录
4.1 RTSP拉流失败的排查思路
RTSP拉流失败是最常见的问题,排查时按以下顺序逐项检查:
| 排查项 | 检查方法 | 常见原因 |
|---|---|---|
| 网络连通性 | ping摄像头IP | 网线松动、IP冲突 |
| 端口开放 | telnet IP 554 | 防火墙拦截、端口被改 |
| 认证信息 | 用VLC测试拉流 | 密码错误、账户锁定 |
| 并发连接数 | 查看摄像头Web界面 | 超过设备最大连接数 |
| 编码格式 | 查看摄像头配置 | H.265不支持、分辨率过高 |
我遇到最多的坑是并发连接数超限。海康老设备默认最多6路RTSP连接,超过之后新连接直接被拒绝。解决办法有两个:一是用流媒体服务器做中转,摄像头只推一路流到服务器,其他消费者从服务器拉流;二是错峰拉流,不同路之间间隔几秒启动。
另一个坑是H.265编码兼容性。有些老设备的H.265实现不规范,FFmpeg解码时报错。解决办法是在摄像头侧把编码改成H.264,或者用支持H.265的FFmpeg版本。
4.2 AI推理结果不稳定的调优方法
AI推理结果不稳定表现为:同一画面时而检测到目标时而检测不到,或者检测框位置跳动。
置信度阈值是第一个要调的参数。阈值太高会漏检,太低会误检。我的经验值是:周界入侵0.5,安全帽识别0.6,人脸识别0.7。实际项目中要根据现场测试结果微调。
NMS阈值影响重叠框的合并。默认0.45,如果发现同一目标出现多个框,可以降到0.3;如果发现相邻目标被合并成一个框,可以升到0.6。
输入分辨率对稳定性影响很大。分辨率太低,小目标检测不到;分辨率太高,推理速度慢导致丢帧。640x640是监控场景的甜点值。
光照变化是导致不稳定的常见原因。白天训练模型在夜间表现差,解决办法是在训练数据中加入夜间样本,或者用自动曝光控制。
实操心得:模型上线前一定要做现场测试,用实际监控画面跑至少24小时,统计漏检率和误检率。我见过太多项目在实验室表现完美,一到现场就各种问题。
4.3 GB28181设备频繁掉线的处理
GB28181设备频繁掉线通常有三个原因:心跳超时、网络抖动、编码冲突。
心跳超时是最常见的。排查方法是抓包看心跳包是否正常发送和响应。如果摄像头侧心跳正常但平台侧显示离线,说明平台侧的超时设置太短。我的建议是平台侧超时设成心跳周期的3倍。
网络抖动导致的心跳丢失,可以通过调整心跳周期来缓解。把心跳周期从60秒改成30秒,丢一个心跳包还有一次重试机会。
编码冲突比较隐蔽。如果两个设备用了相同的设备编码,平台侧会认为它们是同一个设备,导致互相顶掉线。排查方法是检查平台侧的设备列表,看是否有重复编码。
4.4 边缘盒子散热与稳定性问题
边缘盒子在弱电间高温环境下死机,是夏季高发问题。排查和解决思路:
温度监控:在盒子上跑一个温度监控脚本,记录CPU和NPU温度。超过80度就要警惕。
#!/bin/bash while true; do cpu_temp=$(cat /sys/class/thermal/thermal_zone0/temp) npu_temp=$(cat /sys/class/thermal/thermal_zone1/temp) echo "$(date) CPU: $((cpu_temp/1000))°C NPU: $((npu_temp/1000))°C" sleep 60 done降频策略:温度超过85度时,主动降低推理帧率,减少NPU负载。我的做法是动态调整分析帧率,温度正常时10fps,超过80度降到5fps,超过85度降到2fps。
物理散热:如果弱电间温度实在太高,可以考虑加装小风扇或者把盒子移到通风更好的位置。我见过最极端的案例是弱电间温度55度,最后在盒子上加了一个半导体制冷片才解决。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| RTSP拉流失败 | 网络不通 | ping测试 | 检查网线、IP配置 |
| RTSP拉流失败 | 认证失败 | VLC测试 | 核对用户名密码 |
| RTSP拉流失败 | 并发超限 | 查看设备连接数 | 流媒体中转或错峰拉流 |
| AI漏检严重 | 置信度太高 | 降低阈值测试 | 调整到0.4-0.5 |
| AI误检严重 | 置信度太低 | 提高阈值测试 | 调整到0.6-0.7 |
| 推理速度慢 | 模型太大 | 查看推理耗时 | 量化或换小模型 |
| 推理速度慢 | 分辨率太高 | 查看输入尺寸 | 降到640x640 |
| GB28181掉线 | 心跳超时 | 抓包分析 | 调整心跳周期 |
| GB28181掉线 | 编码冲突 | 检查设备列表 | 重新分配编码 |
| 盒子死机 | 温度过高 | 查看温度日志 | 降频或加强散热 |
| 盒子死机 | 内存不足 | 查看内存占用 | 减少并发路数 |
| 告警重复 | 去重失效 | 检查去重逻辑 | 调整IOU阈值 |
4.6 几个容易被忽视的细节
时间同步是个大坑。边缘盒子和摄像头的时间必须同步,否则告警时间戳会乱。我一般用NTP同步,边缘盒子作为NTP客户端,从中心平台同步时间。
日志管理也很重要。边缘盒子的存储有限,日志写满会导致系统崩溃。我的做法是日志按天轮转,保留最近7天,超过自动删除。
固件版本要统一。同一批摄像头固件版本不一致,可能导致RTSP地址格式不同。上线前统一升级固件,能省很多事。
密码管理要规范。我见过用默认密码admin/admin的摄像头,被扫描到之后直接被人改了配置。所有设备上线前必须改密码,密码复杂度要符合等保要求。
这个方案我从去年到现在已经在三个项目中落地,累计接入摄像头超过800路,稳定运行时间最长的已经超过一年。最大的体会是:存量改造的核心不是技术有多先进,而是对现有环境的适应能力。你永远不知道现场会遇到什么奇葩设备、什么诡异网络,只有把兼容性做到极致,方案才能真正落地。