视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?
时间:2022-07-23
本文章向大家介绍视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上一篇我们讲到由于有用户有rtsp和rtmp的地址做内部穿透的需求,所以我们在EasyNVS上增加了这个功能(EasyNVS通道列表如何获得RTMP地址和RTSP地址)。当目前的系统无法满足部分用户的需求时,我们会针对需求进行调整,达到效果。
EasyNVS通道列表rtsp和rtmp穿透地址错误
在测试的时候,我们偶尔会发现EasyNVR接到EasyNVS平台,EasyNVS平台通道列表出现的rtsp和rtmp穿透地址是错误的。对于这一点我们也进行了原因分析。
原因分析
因为在设备下线的时候,需要删除穿透的信息。但是在去数据库中查询设备穿透的时候,出现了空的现象,此时代码中没有进行非空校验,导致出现错误的穿透结果。
错误复现:
根据此代码可以复现该错误:
//删除设备穿透表
var sysTunnel models.SysTunnel
db.SQLite.First(&sysTunnel)
if sysTunnel.PortFreeList != "" {
sysTunnel.PortFreeList += ","
}
var deviceTunnel models.DeviceTunnel
db.SQLite.Where("device_id = ?", conf.DeviceID).First(&deviceTunnel)
sysTunnel.PortFreeList += strconv.Itoa(deviceTunnel.RemoteRtspPort) + "," + strconv.Itoa(deviceTunnel.RemoteRtmpPort)
db.SQLite.Save(&sysTunnel)
db.SQLite.Delete(&deviceTunnel)
问题解决:
我们将代码进行了简单修改:
//删除设备穿透表
var sysTunnel models.SysTunnel
db.SQLite.First(&sysTunnel)
if sysTunnel.PortFreeList != "" {
sysTunnel.PortFreeList += ","
}
var deviceTunnel models.DeviceTunnel
db.SQLite.Where("device_id = ?", conf.DeviceID).First(&deviceTunnel)
if deviceTunnel.ID != 0 {
sysTunnel.PortFreeList += strconv.Itoa(deviceTunnel.RemoteRtspPort) + "," + strconv.Itoa(deviceTunnel.RemoteRtmpPort)
db.SQLite.Save(&sysTunnel)
db.SQLite.Delete(&deviceTunnel)
}
修改后的界面如下,错误已经解决了。
- Bootstrap源码分析之transition、affix
- Redis从单机到集群,一步步教你环境部署以及使用
- C++内存管理学习堆和栈
- 人人公司宣布收购美国卡车社区平台Trucker Path
- Mysql字符串截取总结:left()、right()、substring()、substring_index()
- c++程序的内存格局
- SpringMVC中利用@InitBinder来对页面数据进行解析绑定
- 门罗盘点:2017年那些AI击败人类的瞬间
- sizeof和strlen的区别
- mysql索引使用技巧及注意事项
- 条码支付新规,微信支付宝还好么?
- 获取对象属性类型、属性名称、属性值的研究:反射和JEXL解析引擎
- 不联网不插U盘也不一定安全 黑客能用声波攻击你的硬盘
- 解决xcode打开时loading假死的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter 专题】95 图解 Dart 单线程实现异步处理之 Task Queue
- 首发基于OpenPAI细化部署 Hadoop 集群
- PhpStorm 集成 WSL 虚拟机中的 PHP 进行单元测试和代码调试
- 【CMake教程】(五)CMake 配置install打包
- 【CMake教程】(四)CMake 配置生成lib或者so的库文件
- 使用 GitHub README profile 展示更多信息
- 算法工程师-SQL进阶:集合之间的较量
- 算法工程师-SQL进阶:神奇的自连接与子查询
- 算法工程师-SQL进阶:温柔的陷阱-NULL
- SpringBoot 异步任务处理
- SpringBoot整合 ActiveMQ快速入门 实现点对点推送
- Tomcat部署SpringBoot war包
- Vue之插槽Slot理解
- Docker六脉神剑 (三) 编写Dockerfile构建nginx镜像并推送到远程仓库给其他人使用
- 快速学习UML类图查看