ITPub博客

首页 > 应用开发 > Go语言 > GBDoctor 架构解析:纯 Go 实现 GB28181 诊断引擎

GBDoctor 架构解析:纯 Go 实现 GB28181 诊断引擎

原创 Go语言 作者:suoten 时间:2026-09-18 10:31:32 0 删除 编辑

GBDoctor 是一个 GB/T 28181 接入诊断工具,采用纯 Go 实现,零 CGO 依赖,单二进制交付。本文从整体架构、SIP 协议栈、诊断引擎、规则库、报告生成五个层面,拆解其工程实现。

  1. 为什么选择纯 Go

GB28181 诊断工具需要跑在集成商现场:Windows 笔记本、Linux 服务器、甚至 ARM 网关。传统方案依赖 Python + libpcap + Wireshark,部署成本高。GBDoctor 选择纯 Go:

零 CGO,交叉编译即走

单二进制,几 MB

go:embed 内嵌前端,无外部文件

内置抓包,不依赖 libpcap/WinPcap

最终产物:gbdoctor.exe 双击即用,gbdoctor 丢到服务器就能跑。

  1. 整体架构

cmd/gbdoctor/           # CLI 入口    internal/    sip/                  # SIP 协议栈    roles.go            # 模拟平台/摄像头角色    camera_listener.go  # 模拟设备自动应答    invite.go           # INVITE/SDP 解析    pcap.go             # 内置抓包 + pcap 导出    diag/                 # 体检引擎(分段推进)    rules/                # 声明式规则库(YAML)    report/               # HTML 报告生成    netdiag/              # 网络诊断    batch/                # 批量体检    compat/               # 国标兼容性    gbcode/               # 国标编码校验    web/                  # Web UI + REST API    核心是 internal/sip 和 internal/diag:前者负责协议收发,后者负责诊断编排。

  1. SIP 协议栈:双角色模拟

GBDoctor 同时支持两种角色:

模拟上级平台:监听 5060,等待真实摄像头注册,主动发 Catalog、INVITE。

模拟摄像头:向真实平台注册,响应 Catalog、INVITE,发送 RTP。

以模拟平台为例,核心结构: type Platform struct { conn     *net.UDPConn devices  sync.Map // deviceID -> Device pcap     *PcapWriter }

func (p *Platform) Listen(port int) error { addr := &net.UDPAddr{Port: port} conn, err := net.ListenUDP("udp", addr) if err != nil { return err } p.conn = conn go p.readLoop() return nil } readLoop 解析 SIP 报文,根据 Method 分发:

REGISTER → 认证、记录设备

MESSAGE → 处理 Keepalive、Catalog 应答

INVITE → 处理点播请求

  1. 诊断引擎:分段推进

诊断不是一次性发一堆包,而是状态机:

type Stage int

const ( StageRegister Stage = iota StageKeepalive StageCatalog StageInvite StageRTP StageClock StageDeviceInfo // ... )

type Engine struct { stages   []Stage current  Stage results  map[Stage]*Result }

func (e *Engine) Run() { for _, s := range e.stages { r := e.runStage(s) e.results[s] = r if r.Blocking { break // 断了,后面不测 } } } 每个 Stage 有超时、重试、证据收集。注册通了才测目录,目录通了才测点播——自动告诉你断在第几环。

  1. 规则库:YAML 声明式

规则与代码解耦,方便社区贡献:

rule id: CAT-001-DEVICEID-CASE    category: catalog    severity: blocking    trigger:    condition: "catalogresponse.xml.*.DeviceID matches lowercase or invalid charset"    title: "目录报文 DeviceID 字段不规范"    explain: >    国标编码必须是 20 位数字。你返回的编码包含字母,多数上级平台会直接丢弃该通道。    advice:

  • "检查设备/平台通道编码配置,确保为 20 位纯数字"

vendor_notes:   dahua: "主菜单→网络→平台接入→GB28181→通道编码"   hikvision: "配置→网络→高级配置→平台接入→视频通道编码ID"   引擎加载 YAML,在收到目录应答后逐条匹配,命中则生成问题条目。

  1. 报告生成:HTML 自包含

报告用 Go 的 html/template 渲染,CSS 内联,证据报文用

 展示,可截图、可打印 PDF。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050062/viewspace-3182885/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-05-07

  • 博文量
    69
  • 访问量
    55000