用国标或者ONVIF协议库,做一个能被录像机认出来的摄像头
五个摄像头项目的协议库ONVIF 和国标GB/T 28181各有 Go、Rust、C 三种语言实现全部 MIT。它们不是从标准文档翻译出来的是从真实的摄像头固件和 NVR 里抽出来的。ONVIF 那个 C 库就是几个 ESP32 摄像头固件里重复实现的部分合并出来的国标那两个 Go 库来自 NVR 里跑了两年的代码。这篇讲怎么用它们做摄像头项目。不讲协议原理标准原文该查还是要查。先想清楚一个摄像头要对外提供什么自己做摄像头板子画面出来只是前半截。要让别人的软件用它得让它能被发现和取流。这里有两条路你的摄像头ONVIF 设备服务被发现、可取流GB28181 设备侧注册到平台通用录像机国标平台ONVIF 设备服务面向通用录像机。设备要回答你是谁“有哪些码流”“流地址在哪”还要能被 WS-Discovery 扫到也支持把移动侦测这类事件推给录像机。GB28181 设备侧面向国内的国标平台。设备主动 SIP 注册过去平台上就能看到你的目录、云台、录像。两条路不冲突很多项目两个都做。下面按语言分你按板子和团队选。Go 路线Go 这边两个库onvif-go的 server 包虚拟摄像机服务端和gb28181-go的 device 包。让录像机认出来onvif-go 的 server模块路径是github.com/mickeyzzc/onvif-go/v2要求 Go 1.26go get github.com/mickeyzzc/onvif-go/v2最短能跑的服务端就这么多examples/simple-server/main.go全文 19 行packagemainimport(contextfmtloggithub.com/mickeyzzc/onvif-go/v2/server)funcmain(){fmt.Println(Starting ONVIF Server on port 8081...)config:server.DefaultConfig()config.Port8081srv,err:server.New(config)iferr!nil{log.Fatal(err)}iferr:srv.Start(context.Background());err!nil{log.Fatal(err)}}跑起来之后这台机器在网络上就是一台 ONVIF 设备了。用 ONVIF Device Manager 或者现成录像机去扫能扫到它能拿到 profile 和流地址。不想写代码就先跑官方 CLI 摸形态它自带三个不同分辨率的 profile、PTZ 和 Imaging 服务gitclone https://github.com/mickeyzzc/onvif-gocdonvif-go go build-oonvif-server ./cmd/onvif-server ./onvif-server-passwordmy-secret# 密码必填没有默认值监听:8080用户名admin。把 MiBeeNvr、群晖或者 Home Assistant 指向这台机器它就该被扫出来了。用server包嵌进自己的二进制时几个设计点先说清楚写操作要凭据、读操作开放。Set*、Remove*、Create*、Go*、SystemReboot这类要求鉴权而发现类客户端常做的读操作放行不然很多 NVR 在添加设备那一步就卡住了。XAddr 按请求方 IP 回显。设备宣告自己的地址时用它看到的客户端 IP多网卡机器上不会把地址宣告错要固定的话有AdvertiseHost。事件自己注入srv.PublishEvent(server.Event{...})payload 用规范的双层wsnt:Message tt:Message形状库自己的 events 客户端能跟它跑回来回。反过来如果你要做的是接别人的摄像头这个库的客户端侧是现成的onvif.NewClient配上凭据就能读设备信息、拿主流地址发现支持多播、被动监听和跨子网定向探测三种。鉴权这块针对真机做了不少东西client,err:onvif.NewClient(endpoint,onvif.WithCredentials(admin,pass),onvif.WithAuthFallback(onvif.AuthPasswordText,onvif.AuthHTTPBasic,onvif.AuthNone),)有些固件不吃 digest得降级到 PasswordText 或 HTTP Basic有的设备密码没错但一直报未授权其实是时钟偏了。client.DiagnoseAuth(ctx)会把ok/clock-skew/bad-credentials分开告诉你省下半天排查。注册到国标平台gb28181-go 的 device 包模块路径github.com/mickeyzzc/gb28181-gogo get github.com/mickeyzzc/gb28181-go设备侧最简程序取自examples/device-register砍掉了合成视频那几行packagemainimport(contextloggithub.com/mickeyzzc/gb28181-go/device)funcmain(){cfg:device.Config{Enabled:true,PlatformSIPAddress:192.168.1.10,PlatformSIPPort:5060,DeviceID:34020000001320000001,ChannelID:34020000001310000001,SIPDomain:3402000000,Password:your-platform-password,LocalSIPPort:5060,RegisterIntervalSecs:3600,HeartbeatIntervalSecs:60,HeartbeatTimeoutCount:3,Transport:udp,// udp | tcp | tls (SIPS)}// 现成的 FrameSource有界通道、满了丢帧hub:device.NewFrameHub()srv:device.New(cfg,device.DeviceInfo{Name:Front Door,Manufacturer:MiBee Studio,Model:MiBee Eye,},hub)// 可选录像索引供 RecordInfo 与回放 INVITE 使用// srv.SetRecordingIndex(myIndex)ctx,cancel:context.WithCancel(context.Background())defercancel()gofunc(){log.Fatal(srv.Start(ctx))}()// Start 阻塞注册/心跳/目录/INVITE 都在里面// 这里换成你自己的编码器输出NALU 访问单元往 hub 里灌帧for{// hub.Write(myAccessUnit)}}这里最关键的是往那个 hub 里灌什么。库不做采集也不做编码它要的是已经编码好的 H.264 访问单元你的采集管线往这个接缝里灌帧库负责封装成 PS、切片成 RTP、按平台要求推过去。录像回放也一样实现RecordingSource提供分片索引就行不实现的话平台查录像会拿到空结果其他功能不受影响。想少写点胶水库里有现成的device.FrameHub有界通道、满了丢帧测试够用。分片文件格式是裸 Annex-B H.264 加每帧一个.ts.jsonlsidecardevice.OpenSegment读。examples/下有device-register、platform-uas、psmux-rtp三个可跑的示例。另外conformance/目录该读那是设备跟平台在 localhost 上跑的一致性套件从注册摘要认证一路到逐字节的 RTP/PS 往返你要验证自己的实现有没有跑偏拿它当参照最省事。国标要上安全等级还有个可选项GB35114 A 级SM2 证书双向认证需要-tags gb35114构建。只实现 A 级B/C 要求 SVAC 硬件编解码超出范围了。Rust 路线Rust 这边很容易踩的一个坑crate 名不叫 onvif-rs。crates.io 上onvif-rs被 2018 年一个废弃的占位项目占着所以实际发布名是onvif-device-rs仓库名还是 onvif-rs。[dependencies] onvif-device-rs 0.7.0 # ONVIF 设备端 gb28181-rs 0.12.0 # 国标设备侧两个都要 Rust 1.80 以上、edition 2021。上面这两个版本号请以各仓库的Cargo.toml和 Releases 为准两个仓库 README 里的依赖片段写的还是旧版本号我这边写的是 manifest 里的实际值。两个库各带一个能直接跑的入门示例而且都是自检式的起真服务然后像一个外来客户端那样把自己打一遍。ONVIF 这边gitclone https://github.com/mickeyzzc/onvif-rscdonvif-rscargorun--exampledevice_demo# 跑完自检全过退 0cargorun--exampledevice_demo ----serve# 服务留着用 curl / ONVIF Device Manager 手动戳它检查的顺序就是一台录像机添加摄像头会走的顺序未认证的GetSystemDateAndTime规范允许匿名、不带凭据的GetDeviceInformation必须被拒 401、带 WS-Security UsernameToken 摘要的同一动作要成功、GetCapabilities、GetProfiles与GetStreamUri拿到 profile 和 RTSP 地址最后发一次 WS-Discovery Probe 收 ProbeMatches。国标这边gitclone https://github.com/mickeyzzc/gb28181-rscdgb28181-rscargorun--exampledevice_demo# 一个进程里跑完设备与平台两侧cargorun--examplemanscdp_demo# 离线只看消息编解码cargorun--exampleps_mux# 离线看 PS 封装字节布局device_demo在一个进程里同时起了平台和真的设备服务REGISTER → 401 摘要挑战 → 带 Authorization 重注册平台会真的验那个摘要→ 目录查询 → INVITE带 SDP offer 和ySSRC→ 200 OK → ACK → RTP/PS 解回来还原成 NALU → BYE全程有断言退 0 就算通过。只想看协议消息层用manscdp_demo只想看封装用ps_mux。回到代码结构。onvif-device-rs 是配置 服务处理器 发现服务三件套DeviceConfig描述设备DeviceServiceHandlers和 media 那几个 handler 提供服务DiscoveryServer单独起 UDP 应答。它和 Go 版一样走 host seamImaging 要你实现ImagingParams的读写虚拟 PTZ 是个纯状态机给没有云台的设备用。几个我比较喜欢的地方WS-Security 密码校验是常数时间比较、空密码 fail-closedTLS 是可选的 cargo feature给了证书路径但没开 feature 会在启动时直接失败不会静默降级成明文 HTTP发现服务启动发 Hello、停止发 Bye。gb28181-rs 的思路跟 Go 版一致两个接缝换成 traitFrameSourcesubscribe_with_capacity/unsubscribe和RecordingSourcelookup(start_ms, end_ms)。它把 2016 和 2022 两版的设备控制子命令都解了包括IFrameCmd强制 IDR、RecordCmd、PTZ 位级解码通过DeviceControlHandler交给你默认 no-op硬件支持哪个就装哪个。C / ESP32 路线板子上跑 Linux 的话Go 和 Rust 都行。但如果是 ESP32 这类片子只有一条路onvif-c纯 C、给 ESP-IDF 用、约 10KB、零第三方依赖。它的来历就是几个 ESP32 摄像头固件里各写了一份 ONVIF最后合并成一个库。用法是 vendor 进工程把库的目录放到components/onvif-cmain 的REQUIRES里加上onvif-c想要 mDNS 再加espressif/mdns不加也能编那部分会自动裁掉填一个配置结构板级信息全在这里库本身不含任何写死的地址。这一段直接抄examples/onvif_cam/main.c全文 1381 字节#includeonvif_c.h#includeesp_http_server.h#includeesp_wifi.hstaticconstchar*my_ip(void){staticcharip[16]0.0.0.0;esp_netif_ip_info_tinfo;esp_netif_t*staesp_netif_get_handle_from_ifkey(WIFI_STA_DEF);if(staesp_netif_get_ip_info(sta,info)ESP_OK){snprintf(ip,sizeof(ip),IPSTR,IP2STR(info.ip));}returnip;/* 没连上就返回 0.0.0.0发现会等 */}staticconstchar*my_stream_uri(void){staticcharuri[64];snprintf(uri,sizeof(uri),http://%s:81/stream,my_ip());returnuri;}staticboolmy_events_gate(void){returntrue;/* 返回 false 就不提供事件服务 */}voidapp_main(void){/* ... 先把 WiFi 和 esp_http_server 起起来s_httpd ...... */constonvif_c_config_tcfg{.manufacturerMiBee,.modelMiBeeCam,.hardware_idESP32-S3,.firmware_versionv0.1.0,.serialaabbccddeeff,.uuidf472b01e-0000-1000-8000-aabbccddeeff,.ipmy_ip,.stream_urimy_stream_uri,.events_enabledmy_events_gate,.mdns_hostnamemibeecam-demo,};onvif_c_start(s_httpd,cfg);}三个函数都是回调库里不缓存它们的返回值所以在 WiFi 还没连上时也可以先onvif_c_start之后拿到 IP 它自己会用新的。serial和uuid是必填项uuid不要带urn:uuid:前缀。HTTP 服务起来之后调一次onvif_c_start之后从移动侦测回调里喂事件就行onvif_c_motion(true,87);/* Statetrue, Score87 */这个接口不阻塞可以从传感器回调上下文直接调没有订阅者的时候是安全的空操作。没有硬件也能先验证tools/onvif_probe.py 板子IP会把每个动作和完整的订阅周期跑一遍退出码 0 表示全通。有一点必须写在前面onvif-c 不实现 ONVIF 认证。没有 WS-UsernameToken、没有 Basic/Digest、没有 401 分支任何能访问到板子的机器都会被应答。这是为了把体积压到 10KB 刻意做的取舍所以它只适合放在你信得过的内网里。参考实现是 MiBee Cam 固件里的main/onvif_port.c一百来行可以直接照着抄结构。做出来之后怎么验证先用库自带的工具onvif-c 有那个 probe 脚本onvif-go 和 gb28181-go 各有conformance/和回环测试先确认协议面本身没问题。拿真客户端试ONVIF 侧最省事的是找一台现成录像机MiBeeNvr、群晖 Surveillance Station、Home Assistant 都行看能不能自动扫到并加上。国标侧没有真平台就用gb28181-go的examples/platform-uas起一个模拟平台。盯住回 200 但没反应这是最费时间的一类问题下面说。上真机才会遇到的几件事这几条都是我在真机上撞过、库里去修过的你自己写的时候大概率也会遇到命名空间错了设备会回 200 然后什么都不做。ONVIF 里有严格的设备收到命名空间不对的请求会给你一个 HTTP 200然后什么也不干客户端看起来一切正常。onvif-go 修这个的 issue 就是这条。排查时不要只看状态码要看设备有没有真的动作。onvif-rs 那边对入站请求做命名空间无关解析、出站用显式前缀也是同一个原因。密码没错但一直说未授权先查时钟。海康类设备时钟偏了会返回sender not authorized看着像密码问题。用WithAutoClockSkew让它自己测偏差并校正或者用DiagnoseAuth直接分类。国标平台的固件怪癖比标准多。摘要认证的 qop、Via 分支唯一性、本地 IP 检测、MANSCDP 的属性形式还是元素形式、SIP over TCP、REGISTER 的源端口轮换、长 GOP 场景下的 IDR 看门狗这些库里都处理了但你换一个新平台时还是要留出调试时间。国标的标识符不是随便编的。设备 ID、通道 ID、SIP 域是有编码规则的填错平台直接不理你。抄模拟器里的编号先通了再改。五个库的入门样例一览每个库都有一个可以立刻上手的东西先跑通再改库起步动作跑完你能看到什么onvif-go上面的 19 行或者go build ./cmd/onvif-server后带密码跑网络上多出一台能被扫到、能取流的 ONVIF 设备gb28181-gogo get后照着examples/device-register写相机注册上平台平台能点播、能查目录onvif-rscargo run --example device_demo自检从匿名请求一路打到 WS-Discovery退 0加--serve留着手动戳gb28181-rscargo run --example device_demo一个进程里跑完注册、目录、点播、推流、挂断退 0onvif-c把examples/onvif_cam编进固件板子被录像机扫到再用tools/onvif_probe.py自检一遍依赖信息库模块 / crate装什么工具链onvif-gogithub.com/mickeyzzc/onvif-go/v2go getGo 1.26onvif-rsonvif-device-rscargo addRust 1.80, edition 2021onvif-c组件 treevendor 进components/拷目录ESP-IDF v5.5.x / v6.0.xgb28181-gogithub.com/mickeyzzc/gb28181-gogo getGo 1.26gb28181-rsgb28181-rscargo addRust 1.80, edition 2021五个库的文档在文档中心的mibeelibs项目下onvif-go 的 server 指南里给的地址是 https://www.mlsbs.top/docs/mibeelibs 。仓库地址onvif-goGo客户端 服务端https://github.com/mickeyzzc/onvif-goonvif-rsRust设备端https://github.com/mickeyzzc/onvif-rsonvif-cC / ESP-IDF设备端https://github.com/mickeyzzc/onvif-cgb28181-goGo设备侧 平台侧 级联https://github.com/mickeyzzc/gb28181-gogb28181-rsRust设备侧https://github.com/mickeyzzc/gb28181-rs许可五个库全部 MIT可以放进闭源项目里商用。参考它们的产品实现是 MiBeeNvrAGPL-3.0和 MiBee Cam 固件系列GPL-3.0-or-later想找端到端例子可以去这两个地方翻。

相关新闻

Java 程序员第 49 阶段6:GPT 的「预测下一个 token」如何长出自回归能力

Java 程序员第 49 阶段6:GPT 的「预测下一个 token」如何长出自回归能力

1. 为什么「GPT 的「预测下一个 token」如何长出自回归能力」值得 Java 工程师专门吃透 在大模型工程落地里,这个话题绕不开。很多 Java 同学刚接触时容易只看结论、不究原理,一旦线上出问题就无从下手。先把「为什么重要」说清楚,后面才好理…

2026/9/29 18:06:55 阅读更多 →
独立验证指南——如何自己检查螺旋生成论的关键推导(手把手版)

独立验证指南——如何自己检查螺旋生成论的关键推导(手把手版)

摘要:上篇番外我们做了批判性对比,评论区最高赞问题是:"你说它没经过同行评议,那我能不能自己验证?从哪入手?" 本文给你一份可操作的独立验证指南:从螺旋生成论中挑一个最具体、最可算…

2026/9/28 18:06:29 阅读更多 →
解决Windows中msvcp140.dll丢失错误的专业指南

解决Windows中msvcp140.dll丢失错误的专业指南

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/9/28 18:06:29 阅读更多 →

最新新闻

AI辅助本科毕业论文全流程:8个实战工具与避坑指南

AI辅助本科毕业论文全流程:8个实战工具与避坑指南

又到一年毕业季,后台被师弟师妹问爆了:AI写论文到底靠不靠谱?说实话,我刚带完一届本科生的毕业设计,见过太多人要么完全不敢用AI,要么直接甩给AI生成全文然后被导师约谈。这两类都不可取。我的真实观点是&a…

2026/9/30 7:42:25 阅读更多 →
SpringBoot+Vue精准扶贫管理系统毕设完整指南:从选题到答辩

SpringBoot+Vue精准扶贫管理系统毕设完整指南:从选题到答辩

只要你在计算机毕业设计相关的群里蹲上半个月,一定会频繁看到“SpringBootvue精准扶贫管理系统(附源码论文)”这个标题。它几乎是每年毕设季的固定选项。说实话,这类系统并不复杂,本质上就是一个典型的管理信息系统&am…

2026/9/30 7:42:25 阅读更多 →
数字化巡检系统怎么落地?从点检标准到数据资产的完整路径

数字化巡检系统怎么落地?从点检标准到数据资产的完整路径

1. 传统巡检模式的成本黑洞:问题从来不在数据缺失 上周有个老朋友打电话问我,说厂里刚上线了一套数字化巡检系统,折腾了三个月,除了让维修工手里多了一台扫码的手机,好像没给管理工作带来任何实际变化。点检记录倒是电…

2026/9/30 7:42:25 阅读更多 →
毕业论文救星:8款AI工具覆盖选题、文献、初稿、降重全流程

毕业论文救星:8款AI工具覆盖选题、文献、初稿、降重全流程

每到毕业季,总能在各种群里看到有人半夜发“毕业论文怎么搞,救救孩子”之类的话。其实本科毕业论文真正让人崩溃的,不是“不会写”,而是信息太多、时间太少、格式太烦。好在AI工具这两年已经成熟到能当半个研究助理用,…

2026/9/30 7:42:25 阅读更多 →
Django官方教程后实战指南:ORM查询、Token认证与WebSocket推送

Django官方教程后实战指南:ORM查询、Token认证与WebSocket推送

1. 项目概述:官方教程跑通之后,真正的实战才刚刚开始 如果你刚把 Django 官方教程里那个投票应用从头到尾做完,可能会有一种微妙的错觉:觉得自己已经会 Django 了。但等你打开浏览器,看着那个勉强能用的后台和几个表单…

2026/9/30 7:42:25 阅读更多 →
系统参数配置实战:从内核参数到配置管理一次讲透

系统参数配置实战:从内核参数到配置管理一次讲透

1. 别把配置当杂活:先想清楚参数从哪里来 做运维和开发这些年,我最大的感受就是:系统参数配置这个事,看起来就是改几个数字、加几行配置,真正踩过坑的人才知道,它其实是整个系统稳定性的地基。很多线上事故…

2026/9/30 7:41:25 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →