一开始我也有点懵
说实话,去年我接手一个项目,客户要求用 Go语言 写一个监控程序,管理华三路由器B365的组网视频流,当时我第一反应是:“路由器组网视频?那不是用web界面配置就行了吗?”后来才发现,客户要的是 自动化视频流采集、带宽监控和故障报警,说白了就是要把华三B365当成一个视频网络的核心节点,然后用Go写个程序去管它。
华三B365这个路由器,说实话挺皮实的,支持 VLAN、多WAN负载均衡、QoS优先级,但它的管理接口主要是命令行和SNMP,没有现成的Go SDK,只能自己撸,我踩了不少坑,今天把这些经验写出来,希望能帮到有类似需求的朋友。
华三B365组网视频的基础概念
先说说组网视频是怎么回事,简单讲,就是多个摄像头(比如海康、大华的IPCamera)通过交换机连到华三B365,然后B365负责把视频流转发到NVR(网络录像机)或者云平台,B365本身不存储视频,它更像一个 交通警察,指挥数据包怎么走。
关键点有三个:
- 带宽管理:一路1080P视频大概需要2-4Mbps带宽,如果接20个摄像头,B365的WAN口带宽最好留够100Mbps以上
- VLAN隔离:把视频流和管理流量分开,防止广播风暴,B365支持802.1Q,很稳
- QoS优先级:视频流要打高优先级标签,不然延迟一大画面就卡成PPT
这部分配置在B365的Web界面里可以手动设,但如果要自动化?那还得靠程序。
用Go语言写监控程序的核心步骤
通过SSH连上华三B365
Go有个超好用的库叫 golang.org/x/crypto/ssh,不过华三B365的SSH默认是关闭的,得先在Web界面里打开,然后写代码:
import (
"golang.org/x/crypto/ssh"
"log"
)
func connect(host, user, pass string) (*ssh.Session, error) {
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{ssh.Password(pass)},
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境别这样
}
client, err := ssh.Dial("tcp", host+":22", config)
if err != nil {
return nil, err
}
session, err := client.NewSession()
if err != nil {
return nil, err
}
return session, nil
}
这里有个坑:B365的SSH响应有时候慢,要设超时,我第一次写完代码,连接超时,发现没设置 ssh.DialTimeout,后来加上了才搞定。
采集B365的端口流量和CPU负载
要监控组网视频,最核心的就是看每个端口的流量,我用的命令是 display interface brief,然后用Go解析输出,这命令的输出长这样:
Interface Link Speed Duplex Type PVID Description
GigabitEthernet1/0/1 UP 1G Full access 100
GigabitEthernet1/0/2 UP 100M Full trunk 200 Camera_VLAN
GigabitEthernet1/0/3 DOWN auto auto access 1
解析成结构体:
type PortInfo struct {
Name string
Link string
Speed string
PVID int
Vlan int
}
再用正则或者字符串分割,把数据拉出来,我用的土办法:按行分割,判断是否包含“GigabitEthernet”,虽然丑,但能用。
监控视频流的带宽和延迟
这里要用到 SNMP 了,Go有 github.com/gosnmp/gosnmp 库,但华三B365的 MIB库不全,有些OID得自己查,比如获取CPU利用率的OID是 .1.3.6.1.4.1.25506.2.6.1.1.1.1.6.XXX,具体数字查华三文档。

核心代码片段:
import (
"github.com/gosnmp/gosnmp"
)
func getCPU(target string) (int, error) {
g := &gosnmp.GoSNMP{
Target: target,
Port: 161,
Community: "public",
Version: gosnmp.Version2c,
Timeout: time.Duration(2) * time.Second,
}
err := g.Connect()
if err != nil {
return 0, err
}
defer g.Conn.Close()
result, err := g.Get([]string{".1.3.6.1.4.1.25506.2.6.1.1.1.1.6.1"})
if err != nil {
return 0, err
}
// 解析result
return int(result.Variables[0].Value.(uint32)), nil
}
注意:华三B365的SNMP团体字默认是public,建议改掉,不然不安全。
实践中遇到的几个坑
坑一:B365的CLI输出有分页
执行 display interface brief 时,如果端口多,它会分页显示,每页敲空格才继续,解决办法:在SSH会话里先执行 screen-length disable 关闭分页,再执行查看命令。
坑二:Go的goroutine管理B365连接
因为要监控多个B365(有些项目不止一台),我用 goroutine 并发采集,但华三B365的SSH同时连接数有限(默认5个),并发太高会导致拒绝连接,解决方案:用信号量控制并发数,或者用连接池。
坑三:视频流带宽波动大
摄像头视频流有时候会有突发(比如有人经过,画面变化大),B365的QoS配置要提前预留余量,我在程序里加了 动态阈值告警:当前带宽超过设定值的80%就发告警,超过95%就自动调高视频流的QoS优先级。
实际效果和性能
我测试的场景是:8个200W像素摄像头,通过B365汇聚,视频流传输到内网NVR,用Go程序跑了一周,结果如下:
| 指标 | 手动配置(无程序) | 自动监控(有程序) |
|---|---|---|
| 平均延迟 | 35ms | 28ms(程序自动调QoS) |
| 丢包率 | 3% | 05% |
| 带宽利用率 | 72% | 68%(程序优化后) |
| 故障恢复时间 | 15分钟(人工排查) | 2分钟(自动切换备份链路) |
表格里的数据是我模拟出来的,但趋势是对的:程序介入后,网络稳定性明显提升。
代码的组织结构
我项目里文件组织是这样的(简单版):
/项目根目录
main.go # 入口,启动采集和告警
collector.go # 管理SSH和SNMP采集
config.go # 读取B365的IP、密码等配置
alert.go # 带宽超限告警逻辑
web.go # 一个简单的Web界面,显示实时数据
web.go 我用了 net/http 包,其实就一个页面,显示各个端口的实时流量曲线,代码不到200行,但胜在直接用,不用装其他框架。
为什么选Go而不是Python?
说实话,Python写监控程序更快,但有几个问题:
- Python的SSH库(如paramiko)在并发场景下容易死锁
- Go编译成单文件部署简单,客户那台老服务器上没Python环境
- Go的goroutine天然适合处理多个B365的并发采集
不过Go也有短板:字符串处理不如Python灵活,像解析CLI输出这种工作,Python一行正则搞定,Go得写好几行,但整体来看,Go更适合这种 长时间运行、稳定要求高 的监控程序。
一个真实的使用场景
上个月帮朋友搞的监控项目,工厂里有10个摄像头,通过一台 华三B365 做汇聚,然后传输到办公室的NVR,朋友说视频经常会掉线,我去一看,发现B365的WAN口带宽被其他流量占满了,我用Go程序写了个 带宽抢占告警:当视频流带宽低于阈值时,自动切断非视频流量一段时间,搞定后,再也没掉过线。
说实话,我当时没想到B365这种入门级企业路由能有这么多玩法,配合Go程序,它居然能变成一个小型视频监控控制台。
关于SNMP还是CLI
两种方式各有优劣:
- SNMP:标准协议,适合采集CPU、内存、端口流量,但 配置修改 比较麻烦,需要写私有MIB
- CLI:能执行任何配置命令,但解析输出文本是噩梦
我的做法是:采集用SNMP,配置变更用SSH执行CLI命令,这样速度和灵活性都能兼顾。
如果你也要这么做
记住几点:
- 先在B365的Web界面里打开SSH和SNMP,不然一切免谈
- 关掉CLI的分页显示:
screen-length disable - 测试带宽和延迟的采集频率不能太高,我设为10秒一次,不然B365会卡
- Go的错误处理要写到位,B365有时候会返回空响应,程序不能崩
最后想说的是,用Go写华三B365的监控程序,不是完美的方案,但绝对够用,它可能不如商业软件那么漂亮,但胜在自由、可定制。
对了,如果你要查华三B365的OID列表,可以搜“H3C H3C-ENTITY-EXT-MIB”,官方文档里能找到不少有用的。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/nba/89.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《用Go语言写一个华三路由器B365组网视频监控系统?这事儿我试过》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:一开始我也有点懵说实话,去年我接手一个项目,客户要求用Go语言写一个监控程序,管理华三路由器B365的组网视频流,当时我第一反应...