背景:

需要实现海康摄像机外网访问,由于摄像机没有公网IP(这个可以通过端口映射解决),且所在网络不是专线,公网IP会变动。通过DDNS动态域名解析或者使用萤石云、easynvr等云平台也可以解决,但是这些平台都需要付费,且费用较高,于是我就想通过解析协议包的方式来获取摄像机IP并进行更新。

实现步骤:

**一、配置FTP协议。**进入摄像机后台系统,浏览器输入摄像机IP即可,用户名密码默认是admin和a12345678,登录成功后点击“配置”–“网络”–“高级配置”–“FTP”,进行ftp配置,这是摄像机抓拍人脸后向服务器发送图片的协议,若服务器没有搭建FTP服务,可自行百度搭建。

二、捕获协议包。 在ftp服务所在的服务器上通过tcpdump执行sudo tcpdump -i 网卡号 host 网卡号对应的ip地址 and port ftp服务端口号 -w 协议包保存文件.pcap命令抓取ftp服务端口上的协议包并保存,若没有安装tcpdump可百度安装。
三、创建device(摄像机)数据库。

CREATE TABLE `t_device` (`id` int(10) NOT NULL AUTO_INCREMENT,`devicecode` varchar(200) DEFAULT NULL COMMENT '设备编码',`devicename` varchar(50) DEFAULT NULL COMMENT '设备监控名称',`deviceip` varchar(50) DEFAULT NULL COMMENT '设备ip',`deviceport` varchar(50) DEFAULT NULL COMMENT '设备端口号',`username` varchar(50) DEFAULT NULL COMMENT '设备用户名',`password` varchar(50) DEFAULT NULL COMMENT '设备登录密码',`devicetype` int(10) DEFAULT '1' COMMENT '设备类型(1:摄像机,2:NVR)',`channel` varchar(50) DEFAULT NULL COMMENT 'NVR存通道数,其余存通道id',`vendor` varchar(50) DEFAULT NULL COMMENT '生产厂商(海康:HK,大华:DS)',`position` varchar(50) DEFAULT NULL COMMENT '安装位置',`disknumber` varchar(50) DEFAULT NULL COMMENT '硬盘序列号',`diskchannel` varchar(200) DEFAULT NULL COMMENT '监控点编码',`type` varchar(10) DEFAULT '2' COMMENT '设备状态;1、在线,2、离线',`machinename` varchar(50) DEFAULT NULL COMMENT '门口机名称',`code` varchar(50) DEFAULT NULL COMMENT '单元编号',`uuid` varchar(50) DEFAULT NULL COMMENT '唯一编码',`creattime` timestamp NULL DEFAULT NULL COMMENT '创建时间',`isdelete` int(10) DEFAULT '0' COMMENT '0、未删除,1、已删除',`lon` varchar(50) DEFAULT NULL COMMENT '经度',`lat` varchar(50) DEFAULT NULL COMMENT '纬度',`boxcode` varchar(100) DEFAULT NULL COMMENT '盒子编码',`platformtype` int(1) DEFAULT NULL COMMENT '平台类型:1、感知,2、海康',`publicip` varchar(50) DEFAULT NULL COMMENT '公网ip',`publicport` varchar(50) DEFAULT NULL COMMENT '公网ip端口号',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='摄像机管理表';

四、创建maven工程。
1.引入主要依赖并编写application.yml配置文件和application启动类。

<dependency><groupId>io.pkts</groupId><artifactId>pkts-streams</artifactId><version>3.0.3</version></dependency><dependency><groupId>io.pkts</groupId><artifactId>pkts-core</artifactId><version>3.0.3</version></dependency>

2.编写主要代码,其中device为你数据库中摄像头所对应的pojo

import com.pojo.Device;
import com.service.DeviceService;
import com.zxm.utils.LogUtils;
import io.pkts.Pcap;
import io.pkts.buffer.Buffer;
import io.pkts.packet.IPPacket;
import io.pkts.packet.Packet;
import io.pkts.protocol.Protocol;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import java.util.List;
/*** @Description TODO* @Author silence.Z* @Date 2020/10/20 15:00* @Version 1.0**/
@Component
@Order(value = 1)
public class DeviceRunner implements ApplicationRunner {@Autowiredprivate DeviceService deviceService;private static String logPath = "/home/ganinfo/logs/pacp.log";//private static String logPath = "D:\\pacp.log";@Overridepublic void run(ApplicationArguments args) throws Exception {Pcap pcap = null;try {//读取解析pcap文件//pcap = Pcap.openStream("d:\\dump3615.pcap");pcap = Pcap.openStream("/home/ganinfo/dump3615.pcap");while (true) {try {pcap.loop((final Packet packet) -> {if (packet.hasProtocol(Protocol.TCP)) {//获取pcap文件中的tcp协议包Buffer payload = packet.getPacket(Protocol.TCP).getPayload();//根据协议包获取IPV4地址IPPacket ip = (IPPacket) packet.getPacket(Protocol.IPv4);String sourceIP = ip.getSourceIP();//获取tcp协议包中的摄像机向ftp服务器发送的图片名称并对其进行截取,获得设备编号if (payload != null && payload.toString().contains("STOR")) {String devicecode = payload.readLine().toString().substring(5, 13);LogUtils.log(logPath, sourceIP + "," + devicecode);//查询数据库是否存在该设备号的摄像机List<Device> devices = deviceService.selectByCode(devicecode);Device device = devices.get(0);String publicip = device.getPublicip();//如果数据库存在唯一摄像机且数据库中获取到的公网IP与根据协议包获取到的IPV4地址不相同if (devices.size() == 1 && !device.getPublicip().equals(sourceIP)){//更新数据库,将数据库中所有公网IP相同的数据进行更新device.setPublicip(sourceIP);int i = deviceService.updateDevice(device,publicip);if (i > 0){LogUtils.log(logPath,"摄像机"+devicecode+"公网IP发生变动,数据库中所有与其公网IP相同的设备更新成功! 原IP为:" + publicip + ",现IP为:" + sourceIP + ",更新的设备数量为:" + i);}else {LogUtils.log(logPath,"!!!!!!!!!!!摄像机"+devicecode+"公网IP发生变动,更新失败! 原IP为:" + publicip + ",现IP为:" + sourceIP + ",更新的设备数量为:" + i);}}System.out.println(sourceIP + "," + devicecode);}}return true;});//每隔5秒解析一次协议包,之后建议加长Thread.sleep(1000 * 5);} catch (Exception e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();}}
}

3.为了查看日志方便,编写了LogUtils工具类。

public class LogUtils {public static void log(String logPath, String msg) {OutputStream out = null;OutputStreamWriter ow = null;BufferedWriter bw = null;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = df.format(new Date());msg = time + "     " + msg;File newFile = null;try {newFile = new File(logPath);if (!newFile.exists()) {newFile.createNewFile();}out = new BufferedOutputStream(new FileOutputStream(newFile, true));ow = new OutputStreamWriter(out, "utf-8");bw = new BufferedWriter(ow);bw.write(msg);bw.newLine();bw.flush();} catch (IOException var9) {var9.printStackTrace();}}
}

五、打包发布到服务器。
1.点击idea下方的“Terminal”再通过mvn clean install 命令进行打包。

2.上传到服务器,通过java -jar jar包名命令进行运行,查看logPath路径下的日志,成功。

若需要完整代码或有更好的解决方案,欢迎评论区留言!

摄像机、NVR公网IP不固定解决方案(Java+tcpdump)相关推荐

  1. 关于腾讯云服务器不能用公网ip访问的解决方案

    关于腾讯云服务器不能用公网ip访问的解决方案 参考文章: (1)关于腾讯云服务器不能用公网ip访问的解决方案 (2)https://www.cnblogs.com/cxsabc/p/10627645. ...

  2. 如何判断自己外网IP是否为真实公网IP,以及解决方案

    如何判断本地(路由器)分配的IP是否公网IP? 公网IP:全球唯一IP地址.(公网IP又分为静态公网IP和动态公网IP,如何分辨的话,进入路由器查看连接方式pppoe连接都是动态公网IP.) 有这么一 ...

  3. 如何分辨动态公网ip和固定公网ip之间的关系有什么不同?

    ** 前言 ** 顾名思义,很多小白会把动态公网ip和固定公网ip两者混淆,就和家庭宽带和专线一样,不知道他们看似都一样,但是价格却相差很多!通过笔者的长篇大文,希望能为大家普及动态公网ip和固定公网 ...

  4. 阿里云弹性EIP和固定公网IP的区别

    阿里云服务器可以绑定弹性公网IP(EIP)也可以使用固定公网IP,无论是EIP还是公网IP都可以对外提供外网服务,阿里云百科来详细说下阿里云EIP和固定IP的区别: 阿里云EIP和公网IP详解 什么是 ...

  5. SRT编码器传输获取公网IP地址3种解决方案

    SRT是时下最热门的互联网传输协议,具备低延时.稳定可靠传输的优势特性,可广泛应用于远程制作.远程监看.异地互动等需要互联网远程传输场景. SRT 是点对点传输协议,由于需要穿透互联网,所以至少需要有 ...

  6. 配置项目外网访问(公网IP+DDNS)

    1. 需求 自己写了一个vue项目已经打包部署到nginx,但是只能在内网访问,我想使用手机流量访问怎么办? 本地电脑部署了一个nas服务打算在外网访问 2. 实现 如果只是打算把vue静态页面发布到 ...

  7. java获取公网ip_动态IP变固定IP,国内IP变海外IP,助力企业数据传输提高工作效率...

    在IPv4的地址数量越来越枯竭的情况下,大多数非专线的个人用户或者企业用户的ip地址都是动态ip地址,甚至很多都被更改为私网ip了,这给个人或者企业用户带来了很大不便.下面我们就来解决这些问题,让你可 ...

  8. 应用使用经验(二):SSH代理公网IP-无固定公网IP,本地调试公众号的福音

    文章目录 一.使用工具 二.操作步骤 1.入手vps云主机 2.安装xsell客户端 3.远程登录 三.结论 1.代理前 2.代理后 作为一名专业的互联网软件工程师,经常对接各种第三方API服务,既然 ...

  9. 腾讯云无法绑定公网IP问题解释与解决方案。

    腾讯云无法绑定公网IP问题解释与解决方案. http://blog.csdn.net/chenggong2dm/article/details/51475222 解释:公网IP并不直接配置在服务器上, ...

最新文章

  1. @ConditionalOnProperty 详解
  2. Geany整体注释和取消注释快捷键
  3. CSS中background-position的使用
  4. Python中find函数的作用及用法
  5. 可视化Python设计工具
  6. REST设计模式简介
  7. OpenGL linesmooth线平滑的实例
  8. sc.textFile的相对路径与绝对路径
  9. android super this区别
  10. 【LeetCode 剑指offer刷题】查找与排序题12:Top K Frequent Elements
  11. 磁盘建立swap分区,gpt分区和磁盘LUKS加密、配额
  12. (5)数据分析-T检验
  13. 操作系统就是虚拟机--主内又主外
  14. 设计【SPFA】【差分约束】
  15. Java游戏编程——愤怒的小鸟(一)
  16. 高等数学(下)思维导图
  17. Ivy Book List
  18. ireport mysql_iReport连接Mysql创建图表报表
  19. CCIE一年后的心语-------寄WOLF实验室的兄弟
  20. 精华【分布式微服务云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!

热门文章

  1. 重建 nextcloud 索引,通过非 nextcloud 客户端(手机、PC、网页端)途径放入 nextcloud 目录的文件
  2. Computing Curricula 2005--计算学科的图形表示(概要图)
  3. 项目功能验收阶段的小问题
  4. 基于uni-app开发的微信小程序
  5. K-means算法的原理、优缺点
  6. 想进大厂?你了解白/黑盒测试吗?
  7. 数学基础--学习笔记
  8. 文本信息隐藏方法综述
  9. 深度学习MRI重建综述
  10. 微星z370安装linux系统,华硕z370主板装win10系统及bios设置(uefi+gpt方式安装)