在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 海康摄像头demo

海康摄像头demo

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:1.29M
  • 下载次数:42
  • 浏览次数:2465
  • 发布时间:2018-10-10
  • 实例类别:Android平台开发
  • 发 布 人:闹铃
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 摄像头 d demo 摄像 海康

实例介绍

【实例简介】

【Demo内容说明】
-------------------------------------
1. 该Demo主要介绍预览、回放、云台控制、参数配置等基本功能


【注意事项】
------------------------------------
1. 请到海康威视官网下载最新版本设备网络SDK:http://www.hikvision.com/Cn/download_more_401.html

2. 请修改程序代码,其中HCNetSDK.java文件自己指定loadlibrary加载库的路径,【库文件】里的HCNetSDK.dll、HCCore.dll、HCNetSDKCom文件夹、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、D3DX9_43.dll、D3DCompiler_43.dll等文件均拷贝到lib文件夹下。

   HCNetSDKCom文件夹(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。

3. 如果自行开发软件不能正常实现相应功能,而且程序没有指定加载的dll库路径,请在程序运行的情况下尝试删除HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘Windows->System32目录下的dll文件,建议删除或者更新该目录下的相关dll文件;如果不能删除,dll文件右键选择属性确认SDK库版本。

4. 如按上述步骤操作后还是不能实现相应功能,请根据NET_DVR_GetLastError返回的错误号判断原因。


【实例截图】

from clipboard

【核心代码】

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ClientDemo.java
 *
 * Created on 2009-9-14, 19:31:34
 */
/**
 *
 * @author Xubinfeng
 */

package ClientDemo;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.examples.win32.W32API.HWND;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.NativeLongByReference;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import java.util.Date;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JPopupMenu;
import javax.swing.JWindow;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

/*****************************************************************************
 *主类 :ClientDemo
 *用途 :用户注册,预览,参数配置菜单
 *容器:Jframe
 ****************************************************************************/
public class ClientDemo extends javax.swing.JFrame
{
    /*************************************************
    函数:      主类构造函数
    函数描述:	初始化成员
     *************************************************/
    public ClientDemo()
    {
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);//防止被播放窗口(AWT组件)覆盖
        initComponents();
        lUserID = new NativeLong(-1);
        lPreviewHandle = new NativeLong(-1);
        lAlarmHandle = new NativeLong(-1);
        lListenHandle = new NativeLong(-1);
        g_lVoiceHandle = new NativeLong(-1);
        m_lPort = new NativeLongByReference(new NativeLong(-1));
        fMSFCallBack = null;
        fRealDataCallBack= new FRealDataCallBack();
        m_iTreeNodeNum = 0;
    }

    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
    static PlayCtrl playControl = PlayCtrl.INSTANCE;

    public static NativeLong g_lVoiceHandle;//全局的语音对讲句柄
        
    HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
    HCNetSDK.NET_DVR_IPPARACFG_V40  m_strIpparaCfg;//IP参数
    HCNetSDK.NET_DVR_CLIENTINFO m_strClientInfo;//用户参数

    boolean bRealPlay;//是否在预览.
    String m_sDeviceIP;//已登录设备的IP地址

    NativeLong lUserID;//用户句柄
    NativeLong lPreviewHandle;//预览句柄
    NativeLongByReference m_lPort;//回调预览时播放库端口指针
    
    NativeLong lAlarmHandle;//报警布防句柄
    NativeLong lListenHandle;//报警监听句柄
    
    FMSGCallBack fMSFCallBack;//报警回调函数实现
    FRealDataCallBack fRealDataCallBack;//预览回调函数实现

    JFramePTZControl framePTZControl;//云台控制窗口

    int m_iTreeNodeNum;//通道树节点数目
    DefaultMutableTreeNode m_DeviceRoot;//通道树根节点

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jSplitPaneHorizontal = new javax.swing.JSplitPane();
        jPanelUserInfo = new javax.swing.JPanel();
        jButtonRealPlay = new javax.swing.JButton();
        jButtonLogin = new javax.swing.JButton();
        jLabelUserName = new javax.swing.JLabel();
        jLabelIPAddress = new javax.swing.JLabel();
        jTextFieldPortNumber = new javax.swing.JTextField();
        jTextFieldIPAddress = new javax.swing.JTextField();
        jLabelPortNumber = new javax.swing.JLabel();
        jLabelPassWord = new javax.swing.JLabel();
        jPasswordFieldPassword = new javax.swing.JPasswordField();
        jTextFieldUserName = new javax.swing.JTextField();
        jButtonExit = new javax.swing.JButton();
        jScrollPaneTree = new javax.swing.JScrollPane();
        jTreeDevice = new javax.swing.JTree();
        jComboBoxCallback = new javax.swing.JComboBox();
        jSplitPaneVertical = new javax.swing.JSplitPane();
        jPanelRealplayArea = new javax.swing.JPanel();
        panelRealplay = new java.awt.Panel();
        jScrollPanelAlarmList = new javax.swing.JScrollPane();
        jTableAlarm = new javax.swing.JTable();
        jMenuBarConfig = new javax.swing.JMenuBar();
        jMenuConfig = new javax.swing.JMenu();
        jMenuItemBasicConfig = new javax.swing.JMenuItem();
        jMenuItemNetwork = new javax.swing.JMenuItem();
        jMenuItemChannel = new javax.swing.JMenuItem();
        jMenuItemAlarmCfg = new javax.swing.JMenuItem();
        jMenuItemSerialCfg = new javax.swing.JMenuItem();
        jMenuItemUserConfig = new javax.swing.JMenuItem();
        jMenuItemIPAccess = new javax.swing.JMenuItem();
        jMenuPlayBack = new javax.swing.JMenu();
        jMenuItemPlayBackRemote = new javax.swing.JMenuItem();
        jMenuItemPlayTime = new javax.swing.JMenuItem();
        jMenuSetAlarm = new javax.swing.JMenu();
        jRadioButtonMenuSetAlarm = new javax.swing.JRadioButtonMenuItem();
        jRadioButtonMenuListen = new javax.swing.JRadioButtonMenuItem();
        jMenuItemRemoveAlarm = new javax.swing.JMenuItem();
        jMenuManage = new javax.swing.JMenu();
        jMenuItemCheckTime = new javax.swing.JMenuItem();
        jMenuItemFormat = new javax.swing.JMenuItem();
        jMenuItemUpgrade = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JSeparator();
        jMenuItemReboot = new javax.swing.JMenuItem();
        jMenuItemShutDown = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JSeparator();
        jMenuItemDefault = new javax.swing.JMenuItem();
        jMenuItemDeviceState = new javax.swing.JMenuItem();
        jMenuVoice = new javax.swing.JMenu();
        jMenuItemVoiceCom = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("ClientDemo");
        setFont(new java.awt.Font("宋体", 0, 10));

        jSplitPaneHorizontal.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        jSplitPaneHorizontal.setDividerLocation(155);
        jSplitPaneHorizontal.setDividerSize(2);

        jPanelUserInfo.setBorder(javax.swing.BorderFactory.createEtchedBorder(new java.awt.Color(204, 255, 255), null));

        jButtonRealPlay.setText("预览");
        jButtonRealPlay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonRealPlayActionPerformed(evt);
            }
        });

        jButtonLogin.setText("注册");
        jButtonLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonLoginActionPerformed(evt);
            }
        });

        jLabelUserName.setText("用户名");

        jLabelIPAddress.setText("IP地址");

        jTextFieldPortNumber.setText("8000");

        jTextFieldIPAddress.setText("172.4.1.170");

        jLabelPortNumber.setText("端口");

        jLabelPassWord.setText("密码");

        jPasswordFieldPassword.setText("12345");

        jTextFieldUserName.setText("admin");

        jButtonExit.setText("退出");
        jButtonExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonExitActionPerformed(evt);
            }
        });

        jTreeDevice.setModel(this.initialTreeModel());
        jScrollPaneTree.setViewportView(jTreeDevice);

        jComboBoxCallback.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "直接预览", "回调预览" }));

        javax.swing.GroupLayout jPanelUserInfoLayout = new javax.swing.GroupLayout(jPanelUserInfo);
        jPanelUserInfo.setLayout(jPanelUserInfoLayout);
        jPanelUserInfoLayout.setHorizontalGroup(
            jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabelIPAddress)
                .addGap(14, 14, 14)
                .addComponent(jTextFieldIPAddress, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabelUserName)
                .addGap(14, 14, 14)
                .addComponent(jTextFieldUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabelPassWord)
                .addGap(26, 26, 26)
                .addComponent(jPasswordFieldPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonLogin)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButtonRealPlay))
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabelPortNumber)
                .addGap(26, 26, 26)
                .addComponent(jTextFieldPortNumber, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelUserInfoLayout.createSequentialGroup()
                .addContainerGap(83, Short.MAX_VALUE)
                .addComponent(jButtonExit)
                .addContainerGap())
            .addComponent(jScrollPaneTree, javax.swing.GroupLayout.DEFAULT_SIZE, 150, Short.MAX_VALUE)
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jComboBoxCallback, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(66, Short.MAX_VALUE))
        );
        jPanelUserInfoLayout.setVerticalGroup(
            jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelUserInfoLayout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addGroup(jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelIPAddress)
                    .addComponent(jTextFieldIPAddress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(9, 9, 9)
                .addGroup(jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelUserName)
                    .addComponent(jTextFieldUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(9, 9, 9)
                .addGroup(jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelPassWord)
                    .addComponent(jPasswordFieldPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(9, 9, 9)
                .addGroup(jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelPortNumber)
                    .addComponent(jTextFieldPortNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanelUserInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonLogin)
                    .addComponent(jButtonRealPlay))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPaneTree, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jComboBoxCallback, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(10, 10, 10)
                .addComponent(jButtonExit)
                .addContainerGap())
        );

        jSplitPaneHorizontal.setLeftComponent(jPanelUserInfo);

        jSplitPaneVertical.setDividerLocation(579);
        jSplitPaneVertical.setDividerSize(2);
        jSplitPaneVertical.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);

        jPanelRealplayArea.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 255, 102)));

        panelRealplay.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                panelRealplayMousePressed(evt);
            }
        });

        javax.swing.GroupLayout panelRealplayLayout = new javax.swing.GroupLayout(panelRealplay);
        panelRealplay.setLayout(panelRealplayLayout);
        panelRealplayLayout.setHorizontalGroup(
            panelRealplayLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 704, Short.MAX_VALUE)
        );
        panelRealplayLayout.setVerticalGroup(
            panelRealplayLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 576, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanelRealplayAreaLayout = new javax.swing.GroupLayout(jPanelRealplayArea);
        jPanelRealplayArea.setLayout(jPanelRealplayAreaLayout);
        jPanelRealplayAreaLayout.setHorizontalGroup(
            jPanelRealplayAreaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelRealplay, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        jPanelRealplayAreaLayout.setVerticalGroup(
            jPanelRealplayAreaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelRealplay, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        jSplitPaneVertical.setTopComponent(jPanelRealplayArea);

        jScrollPanelAlarmList.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jTableAlarm.setModel(this.initialTableModel());
        jScrollPanelAlarmList.setViewportView(jTableAlarm);

        jSplitPaneVertical.setRightComponent(jScrollPanelAlarmList);

        jSplitPaneHorizontal.setRightComponent(jSplitPaneVertical);

        jMenuBarConfig.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

        jMenuConfig.setText("配置");

        jMenuItemBasicConfig.setText("基本信息");
        jMenuItemBasicConfig.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemBasicConfigMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemBasicConfig);

        jMenuItemNetwork.setText("网络参数");
        jMenuItemNetwork.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemNetworkMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemNetwork);

        jMenuItemChannel.setText("通道参数");
        jMenuItemChannel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemChannelMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemChannel);

        jMenuItemAlarmCfg.setText("报警参数");
        jMenuItemAlarmCfg.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemAlarmCfgMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemAlarmCfg);

        jMenuItemSerialCfg.setText("串口参数");
        jMenuItemSerialCfg.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemSerialCfgMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemSerialCfg);

        jMenuItemUserConfig.setText("用户配置");
        jMenuItemUserConfig.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemUserConfigMousePressed(evt);
            }
        });
        jMenuConfig.add(jMenuItemUserConfig);

        jMenuItemIPAccess.setText("IP接入配置");
        jMenuItemIPAccess.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemIPAccessActionPerformed(evt);
            }
        });
        jMenuConfig.add(jMenuItemIPAccess);

        jMenuBarConfig.add(jMenuConfig);

        jMenuPlayBack.setText("回放");

        jMenuItemPlayBackRemote.setText("按文件");
        jMenuItemPlayBackRemote.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemPlayBackRemoteMousePressed(evt);
            }
        });
        jMenuPlayBack.add(jMenuItemPlayBackRemote);

        jMenuItemPlayTime.setText("按时间");
        jMenuItemPlayTime.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemPlayTimeMousePressed(evt);
            }
        });
        jMenuPlayBack.add(jMenuItemPlayTime);

        jMenuBarConfig.add(jMenuPlayBack);

        jMenuSetAlarm.setBorder(null);
        jMenuSetAlarm.setText("报警");

        jRadioButtonMenuSetAlarm.setText("〇布防");
        jRadioButtonMenuSetAlarm.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonMenuSetAlarmActionPerformed(evt);
            }
        });
        jMenuSetAlarm.add(jRadioButtonMenuSetAlarm);

        jRadioButtonMenuListen.setText("〇监听");
        jRadioButtonMenuListen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonMenuListenActionPerformed(evt);
            }
        });
        jMenuSetAlarm.add(jRadioButtonMenuListen);

        jMenuItemRemoveAlarm.setText("清空报警信息");
        jMenuItemRemoveAlarm.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemRemoveAlarmMousePressed(evt);
            }
        });
        jMenuSetAlarm.add(jMenuItemRemoveAlarm);

        jMenuBarConfig.add(jMenuSetAlarm);

        jMenuManage.setText("管理");

        jMenuItemCheckTime.setText("校时");
        jMenuItemCheckTime.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemCheckTimeMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemCheckTime);

        jMenuItemFormat.setText("格式化");
        jMenuItemFormat.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemFormatMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemFormat);

        jMenuItemUpgrade.setText("升级");
        jMenuItemUpgrade.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemUpgradeMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemUpgrade);
        jMenuManage.add(jSeparator1);

        jMenuItemReboot.setText("重启");
        jMenuItemReboot.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemRebootMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemReboot);

        jMenuItemShutDown.setText("关闭");
        jMenuItemShutDown.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemShutDownMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemShutDown);
        jMenuManage.add(jSeparator2);

        jMenuItemDefault.setText("恢复默认参数");
        jMenuItemDefault.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemDefaultMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemDefault);

        jMenuItemDeviceState.setText("设备状态");
        jMenuItemDeviceState.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemDeviceStateMousePressed(evt);
            }
        });
        jMenuManage.add(jMenuItemDeviceState);

        jMenuBarConfig.add(jMenuManage);

        jMenuVoice.setText("语音");

        jMenuItemVoiceCom.setText("语音对讲");
        jMenuItemVoiceCom.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jMenuItemVoiceComMousePressed(evt);
            }
        });
        jMenuVoice.add(jMenuItemVoiceCom);

        jMenuBarConfig.add(jMenuVoice);

        setJMenuBar(jMenuBarConfig);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSplitPaneHorizontal, javax.swing.GroupLayout.DEFAULT_SIZE, 866, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSplitPaneHorizontal, javax.swing.GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /*************************************************
    函数:      "注册"  按钮单击响应函数
    函数描述:	注册登录设备
     *************************************************/
    private void jButtonLoginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonLoginActionPerformed
        //注册之前先注销已注册的用户,预览情况下不可注销
        if (bRealPlay)
        {
            JOptionPane.showMessageDialog(this, "注册新用户请先停止当前预览!");
            return;
        }

        if (lUserID.longValue() > -1)
        {
            //先注销
            hCNetSDK.NET_DVR_Logout_V30(lUserID);
            lUserID = new NativeLong(-1);
            m_iTreeNodeNum = 0;
            m_DeviceRoot.removeAllChildren();
        }
        //注册
        m_sDeviceIP = jTextFieldIPAddress.getText();//设备ip地址
        m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        int iPort = Integer.parseInt(jTextFieldPortNumber.getText());
        lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP,
                (short) iPort, jTextFieldUserName.getText(), new String(jPasswordFieldPassword.getPassword()), m_strDeviceInfo);

        long userID = lUserID.longValue();
        if (userID == -1)
        {
            m_sDeviceIP = "";//登录未成功,IP置为空
            JOptionPane.showMessageDialog(ClientDemo.this, "注册失败");
        }
        else
        {
            CreateDeviceTree();
        }
    }//GEN-LAST:event_jButtonLoginActionPerformed

    /*************************************************
    函数:      initialTableModel
    函数描述:	初始化报警信息列表,写入列名称
     *************************************************/
    public DefaultTableModel initialTableModel()
    {
        String tabeTile[];
        tabeTile = new String[]{"时间", "报警信息", "设备信息" };
        DefaultTableModel alarmTableModel = new DefaultTableModel(tabeTile, 0);
        return alarmTableModel;
    }

    /*************************************************
    函数:      initialTreeModel
    函数描述:  初始化设备树
     *************************************************/
    private DefaultTreeModel initialTreeModel()
    {
        m_DeviceRoot = new DefaultMutableTreeNode("Device");
        DefaultTreeModel myDefaultTreeModel = new DefaultTreeModel(m_DeviceRoot);//使用根节点创建模型
        return myDefaultTreeModel;
    }

    /*************************************************
    函数:      " 退出"  按钮响应函数
    函数描述:	注销并退出
     *************************************************/
    private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
        //如果在预览,先停止预览, 释放句柄
        if (lPreviewHandle.longValue() > -1)
        {
           hCNetSDK.NET_DVR_StopRealPlay(lPreviewHandle);
           if(framePTZControl != null)
           {
            framePTZControl.dispose();
           }
        }

        //报警撤防
        if (lAlarmHandle.intValue() != -1)
        {
            hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle);
        }
        //停止监听
        if (lListenHandle.intValue() != -1)
        {
            hCNetSDK.NET_DVR_StopListen_V30(lListenHandle);
        }

        //如果已经注册,注销
        if (lUserID.longValue() > -1)
        {
            hCNetSDK.NET_DVR_Logout_V30(lUserID);
        }
        //cleanup SDK
        hCNetSDK.NET_DVR_Cleanup();
        this.dispose();
    }//GEN-LAST:event_jButtonExitActionPerformed

    /*************************************************
    函数:       "清空报警信息"  菜单项响应函数
    函数描述:	单击清空信息列表
     *************************************************/
    private void jMenuItemRemoveAlarmMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemRemoveAlarmMousePressed
    {//GEN-HEADEREND:event_jMenuItemRemoveAlarmMousePressed
        //删除所有行
        ((DefaultTableModel) jTableAlarm.getModel()).getDataVector().removeAllElements();
        //把改变显示到列表控件
        ((DefaultTableModel) jTableAlarm.getModel()).fireTableStructureChanged();
}//GEN-LAST:event_jMenuItemRemoveAlarmMousePressed

    /*************************************************
    函数:      "报警监听"  菜单项响应函数
    函数描述:   选中开始监听,取消结束监听
     *************************************************/
    private void jRadioButtonMenuListenActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jRadioButtonMenuListenActionPerformed
    {//GEN-HEADEREND:event_jRadioButtonMenuListenActionPerformed
        if (jRadioButtonMenuListen.isSelected() == true)//选择监听
        {
            if (lListenHandle.intValue() == -1)
                //尚未监听,开始监听
            {
                if (fMSFCallBack == null)
                {
                    fMSFCallBack = new FMSGCallBack();
                }
                Pointer pUser = null;
                if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(fMSFCallBack, pUser))
                {
                    System.out.println("设置回调函数失败!");
                }

                //本地IP地址置为null时自动获取本地IP
                lListenHandle = hCNetSDK.NET_DVR_StartListen_V30(null, (short)7200, fMSFCallBack, null);
                if (lListenHandle.intValue() == -1)
                {
                    JOptionPane.showMessageDialog(this, "开始监听失败");
                    jRadioButtonMenuListen.setSelected(false);
                }
            }
        }
        else
            //停止监听
        {
            if (lListenHandle.intValue() != -1)
            {
                if (!hCNetSDK.NET_DVR_StopListen_V30(lListenHandle))
                {
                    JOptionPane.showMessageDialog(this, "停止监听失败");
                    jRadioButtonMenuListen.setSelected(true);
                    lListenHandle = new NativeLong(-1);
                }
                else
                {
                    lListenHandle = new NativeLong(-1);
                }
            }
        }
}//GEN-LAST:event_jRadioButtonMenuListenActionPerformed

    /*************************************************
    函数:      "报警布防"  菜单项响应函数
    函数描述:	选中布防听,取消撤防
     *************************************************/
    private void jRadioButtonMenuSetAlarmActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jRadioButtonMenuSetAlarmActionPerformed
    {//GEN-HEADEREND:event_jRadioButtonMenuSetAlarmActionPerformed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        if (jRadioButtonMenuSetAlarm.isSelected() == true)
        //已选择布防
        {
            if (lAlarmHandle.intValue() == -1)//尚未布防,需要布防
            {
                if (fMSFCallBack == null)
                {
                    fMSFCallBack = new FMSGCallBack();
                    Pointer pUser = null;
                    if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(fMSFCallBack, pUser))
                    {
                        System.out.println("设置回调函数失败!");
                    }
                }
                lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V30(lUserID);
                if (lAlarmHandle.intValue() == -1)
                {
                    JOptionPane.showMessageDialog(this, "布防失败");
                    jRadioButtonMenuSetAlarm.setSelected(false);
                }
            }
        } else
        //未选择布防
        {
            if (lAlarmHandle.intValue() != -1)
            {
                if (!hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle))
                {
                    JOptionPane.showMessageDialog(this, "撤防失败");
                    jRadioButtonMenuSetAlarm.setSelected(true);
                    lAlarmHandle = new NativeLong(-1);
                } else
                {
                    lAlarmHandle = new NativeLong(-1);
                }
            }
        }
}//GEN-LAST:event_jRadioButtonMenuSetAlarmActionPerformed

    /*************************************************
    函数:      "预览"  按钮单击响应函数
    函数描述:	获取通道号,打开播放窗口,开始此通道的预览
     *************************************************/
    private void jButtonRealPlayActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonRealPlayActionPerformed
    {//GEN-HEADEREND:event_jButtonRealPlayActionPerformed
            System.out.println(panelRealplay.getWidth());
      System.out.println(panelRealplay.getHeight());
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        //如果预览窗口没打开,不在预览
        if (bRealPlay == false)
        {
            //获取窗口句柄
            HWND hwnd = new HWND(Native.getComponentPointer(panelRealplay));

            //获取通道号
            int iChannelNum = getChannelNumber();//通道号
            if(iChannelNum == -1)
            {
                JOptionPane.showMessageDialog(this, "请选择要预览的通道");
                return;
            }

            m_strClientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();
            m_strClientInfo.lChannel = new NativeLong(iChannelNum);

            //在此判断是否回调预览,0,不回调 1 回调
            if(jComboBoxCallback.getSelectedIndex() == 0)
            {
                m_strClientInfo.hPlayWnd = hwnd;
                lPreviewHandle = hCNetSDK.NET_DVR_RealPlay_V30(lUserID,
                        m_strClientInfo, null, null, true);
            }
            else if(jComboBoxCallback.getSelectedIndex() == 1)
            {
                m_strClientInfo.hPlayWnd = null;
                lPreviewHandle = hCNetSDK.NET_DVR_RealPlay_V30(lUserID,
                        m_strClientInfo, fRealDataCallBack, null, true);
            }

            long previewSucValue = lPreviewHandle.longValue();

            //预览失败时:
            if (previewSucValue == -1)
            {
                JOptionPane.showMessageDialog(this, "预览失败");
                return;
            }

            //预览成功的操作
            jButtonRealPlay.setText("停止");
            bRealPlay = true;

            //显示云台控制窗口
            framePTZControl = new JFramePTZControl(lPreviewHandle);
            framePTZControl.setLocation(this.getX()   this.getWidth(), this.getY());
            framePTZControl.setVisible(true);
        }

        //如果在预览,停止预览,关闭窗口
        else
        {
            hCNetSDK.NET_DVR_StopRealPlay(lPreviewHandle);
            jButtonRealPlay.setText("预览");
            bRealPlay = false;
            if(m_lPort.getValue().intValue() != -1)
            {
                playControl.PlayM4_Stop(m_lPort.getValue());
                m_lPort.setValue(new NativeLong(-1));
            }
            framePTZControl.dispose();

            panelRealplay.repaint();
        }
}//GEN-LAST:event_jButtonRealPlayActionPerformed

    /*************************************************
    函数:       "串口"  菜单项响应函数
    函数描述:	新建窗体显示串口
     *************************************************/
    private void jMenuItemSerialCfgMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemSerialCfgMousePressed
    {//GEN-HEADEREND:event_jMenuItemSerialCfgMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogSerialCfg dlgSerialCfg = new JDialogSerialCfg(this, false, lUserID, m_strDeviceInfo);
        centerWindow(dlgSerialCfg);
        dlgSerialCfg.setVisible(true);
}//GEN-LAST:event_jMenuItemSerialCfgMousePressed

    /*************************************************
    函数:       "报警参数"  菜单项响应函数
    函数描述:	新建窗体显示报警参数
     *************************************************/
    private void jMenuItemAlarmCfgMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemAlarmCfgMousePressed
    {//GEN-HEADEREND:event_jMenuItemAlarmCfgMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogAlarmCfg dlgAlarmCfg = new JDialogAlarmCfg(this, false, lUserID, m_strDeviceInfo);
        dlgAlarmCfg.setLocation(this.getX(),this.getY() );
        dlgAlarmCfg.setVisible(true);
}//GEN-LAST:event_jMenuItemAlarmCfgMousePressed

  /*************************************************
    函数:  "通道配置"  菜单项响应函数
    函数描述:点击显示通道参数配置
     *************************************************/
    private void jMenuItemChannelMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemChannelMousePressed
    {//GEN-HEADEREND:event_jMenuItemChannelMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogChannelConfig dialogChannelConfig = new JDialogChannelConfig(this, false, lUserID, m_strDeviceInfo);//无模式对话框
        dialogChannelConfig.setBounds(this.getX(), this.getY(), 670, 640);
        dialogChannelConfig.setVisible(true);
        //传参数
        int iStartChan = m_strDeviceInfo.byStartChan;
        int iChannum = m_strDeviceInfo.byChanNum;
        //初始化通道数组合框
        for (int i = 0; i < iChannum; i  )
        {
            dialogChannelConfig.jComboBoxChannelNumber.addItem("Camera"   (i   iStartChan));
        }
        for (int i = 0; i < HCNetSDK.MAX_IP_CHANNEL; i  )
        {
            if (m_strIpparaCfg.struStreamMode[i].uGetStream.struChanInfo.byEnable == 1)
            {
                dialogChannelConfig.jComboBoxChannelNumber.addItem("IPCamara"   (i   iStartChan));
            }
        }
}//GEN-LAST:event_jMenuItemChannelMousePressed

    /*************************************************
    函数:      "网络参数"  菜单项响应函数
    函数描述:	点击显示网络参数配置
     *************************************************/
    private void jMenuItemNetworkMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemNetworkMousePressed
    {//GEN-HEADEREND:event_jMenuItemNetworkMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开Jframe
        JFrameNetWorkConfig frameNetwork = new JFrameNetWorkConfig(lUserID);
        frameNetwork.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frameNetwork.setSize(550, 380);
        centerWindow(frameNetwork);
        frameNetwork.setVisible(true);
}//GEN-LAST:event_jMenuItemNetworkMousePressed

    /*************************************************
    函数:       "基本信息"  菜单项响应函数
    函数描述:	新建窗体,显示设备基本信息
     *************************************************/
    private void jMenuItemBasicConfigMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemBasicConfigMousePressed
    {//GEN-HEADEREND:event_jMenuItemBasicConfigMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogBasicConfig dlgBasicConfig = new JDialogBasicConfig(this, false, lUserID);
        dlgBasicConfig.setSize(507, 400);
        centerWindow(dlgBasicConfig);
        dlgBasicConfig.setVisible(true);
}//GEN-LAST:event_jMenuItemBasicConfigMousePressed

  /*************************************************
    函数:       "设备状态"  菜单项响应函数
    函数描述:	新建窗体显示设备状态
     *************************************************/
    private void jMenuItemDeviceStateMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemDeviceStateMousePressed
    {//GEN-HEADEREND:event_jMenuItemDeviceStateMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogDeviceState dlgDeviceState = new JDialogDeviceState(this, false, lUserID, m_strDeviceInfo, m_sDeviceIP);
        dlgDeviceState.setSize( 680, 715);
        centerWindow(dlgDeviceState);
        dlgDeviceState.setVisible(true);
}//GEN-LAST:event_jMenuItemDeviceStateMousePressed

  /*************************************************
    函数:       "恢复默认参数"  菜单项响应函数
    函数描述:	弹出确认框,是否恢复默认参数
     *************************************************/
    private void jMenuItemDefaultMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemDefaultMousePressed
    {//GEN-HEADEREND:event_jMenuItemDefaultMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        int iResponse = JOptionPane.showConfirmDialog(this, "确定恢复默认参数?", "恢复默认参数", JOptionPane.OK_CANCEL_OPTION);
        if (iResponse == 0)
            //确认
        {
            if (!hCNetSDK.NET_DVR_RestoreConfig(lUserID))
            {
                JOptionPane.showMessageDialog(this, "恢复默认参数失败");
                return;
            }
        }
        if (iResponse == 2)
            //取消
        {
            return;
        }
}//GEN-LAST:event_jMenuItemDefaultMousePressed

  /*************************************************
    函数:       "关闭"  菜单项响应函数
    函数描述:	弹出确认框询问是否关机
     *************************************************/
    private void jMenuItemShutDownMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemShutDownMousePressed
    {//GEN-HEADEREND:event_jMenuItemShutDownMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        int iResponse = JOptionPane.showConfirmDialog(this, "确定关闭设备?", "关机", JOptionPane.OK_CANCEL_OPTION);
        //确认
        if (iResponse == 0)
        {
            if (!hCNetSDK.NET_DVR_ShutDownDVR(lUserID))
            {
                JOptionPane.showMessageDialog(this, "关闭设备失败");
                return;
            }
        }
        //取消
        if (iResponse == 2)
        {
            return;
        }
}//GEN-LAST:event_jMenuItemShutDownMousePressed

   /*************************************************
    函数:       "重启"  菜单项响应函数
    函数描述:	弹出确认框询问是否重启设备
     *************************************************/
    private void jMenuItemRebootMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemRebootMousePressed
    {//GEN-HEADEREND:event_jMenuItemRebootMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        int iResponse = JOptionPane.showConfirmDialog(this, "确定重启设备?", "重启", JOptionPane.OK_CANCEL_OPTION);
        //确认
        if (iResponse == 0)
        {
            if (!hCNetSDK.NET_DVR_RebootDVR(lUserID))
            {
                JOptionPane.showMessageDialog(this, "设备重启失败");
                return;
            }
        }
        //取消
        if (iResponse == 2)
        {
            return;
        }
}//GEN-LAST:event_jMenuItemRebootMousePressed

  /*************************************************
    函数:       "升级"  菜单项响应函数
    函数描述:	新建窗体,显示升级选项
     *************************************************/
    private void jMenuItemUpgradeMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemUpgradeMousePressed
    {//GEN-HEADEREND:event_jMenuItemUpgradeMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogUpGrade dlgUpgrade = new JDialogUpGrade(this, false, lUserID);
        dlgUpgrade.setSize(440, 265);
        centerWindow(dlgUpgrade);
        dlgUpgrade.setVisible(true);
}//GEN-LAST:event_jMenuItemUpgradeMousePressed

   /*************************************************
    函数:       "格式化"  菜单项响应函数
    函数描述:	新建窗体,显示格式化选项
     *************************************************/
    private void jMenuItemFormatMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemFormatMousePressed
    {//GEN-HEADEREND:event_jMenuItemFormatMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogFormatDisk dlgFormatDisk = new JDialogFormatDisk(this, false, lUserID);
        centerWindow(dlgFormatDisk);
        dlgFormatDisk.setVisible(true);
}//GEN-LAST:event_jMenuItemFormatMousePressed

   /*************************************************
    函数:       "校时"  菜单项响应函数
    函数描述:	新建窗体,显示校时选项
     *************************************************/
    private void jMenuItemCheckTimeMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemCheckTimeMousePressed
    {//GEN-HEADEREND:event_jMenuItemCheckTimeMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogCheckTime dlgCheckTime = new JDialogCheckTime(this, false, lUserID);
        centerWindow(dlgCheckTime);
        dlgCheckTime.setVisible(true);
}//GEN-LAST:event_jMenuItemCheckTimeMousePressed

    /*************************************************
    函数:       "时间回放"  菜单项响应函数
    函数描述:	新建窗体时间回放
     *************************************************/
    private void jMenuItemPlayTimeMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemPlayTimeMousePressed
    {//GEN-HEADEREND:event_jMenuItemPlayTimeMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        JDialogPlayBackByTime dlgPlayTime = new JDialogPlayBackByTime(this, false, lUserID, m_sDeviceIP);
        centerWindow(dlgPlayTime);
        dlgPlayTime.setVisible(true);
}//GEN-LAST:event_jMenuItemPlayTimeMousePressed

   /*************************************************
    函数:      "回放"  按文件  菜单项响应函数
    函数描述:	点击打开回放界面
     *************************************************/
    private void jMenuItemPlayBackRemoteMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemPlayBackRemoteMousePressed
    {//GEN-HEADEREND:event_jMenuItemPlayBackRemoteMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }
        //打开JDialog
        //无模式对话框
        JDialogPlayBack dialogPlayBack = new JDialogPlayBack(this, false, lUserID);
        dialogPlayBack.setBounds(this.getX(), this.getY() , 730, 650);
        centerWindow(dialogPlayBack);
        dialogPlayBack.setVisible(true);
}//GEN-LAST:event_jMenuItemPlayBackRemoteMousePressed

   /*************************************************
    函数:      "用户配置"  按文件  菜单项响应函数
    函数描述:   点击打开对话框,开始用户配置
     *************************************************/
    private void jMenuItemUserConfigMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemUserConfigMousePressed
    {//GEN-HEADEREND:event_jMenuItemUserConfigMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        JDialogUserConfig dlgUserConfig = new JDialogUserConfig(this, false, lUserID, m_strDeviceInfo, m_strIpparaCfg);
       centerWindow(dlgUserConfig);
       dlgUserConfig.setVisible(true);
    }//GEN-LAST:event_jMenuItemUserConfigMousePressed

   /*************************************************
    函数:      "语音对讲"  按文件  菜单项响应函数
    函数描述:   点击打开对话框,开始语音对讲相关操作
     *************************************************/
    private void jMenuItemVoiceComMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jMenuItemVoiceComMousePressed
    {//GEN-HEADEREND:event_jMenuItemVoiceComMousePressed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        JDialogVoiceTalk dlgVoiceTalk = new JDialogVoiceTalk(this, false, lUserID, m_strDeviceInfo);
        centerWindow(dlgVoiceTalk);
        dlgVoiceTalk.setVisible(true);
    }//GEN-LAST:event_jMenuItemVoiceComMousePressed

    
   /*************************************************
    函数:      "Ip接入"  按文件  菜单项响应函数
    函数描述:   点击打开对话框,IP接入配置
     *************************************************/
    private void jMenuItemIPAccessActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jMenuItemIPAccessActionPerformed
    {//GEN-HEADEREND:event_jMenuItemIPAccessActionPerformed
        if (lUserID.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "请先注册");
            return;
        }

        JDialogIPAccessCfg dlgIPAccess = new JDialogIPAccessCfg(this, false, lUserID, m_strDeviceInfo);
        centerWindow(dlgIPAccess);
        dlgIPAccess.setVisible(true);
    }//GEN-LAST:event_jMenuItemIPAccessActionPerformed

   /*************************************************
    函数:      "播放窗口"  双击响应函数
    函数描述:   双击全屏预览当前预览通道
     *************************************************/
    private void panelRealplayMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_panelRealplayMousePressed
    {//GEN-HEADEREND:event_panelRealplayMousePressed
        if(!bRealPlay)
        {
            return;
        }
        //鼠标单击事件为双击
        if(evt.getClickCount() == 2)
        {
            //新建JWindow 全屏预览
            final  JWindow wnd = new JWindow();
            //获取屏幕尺寸
            Dimension   screenSize   =   Toolkit.getDefaultToolkit().getScreenSize();
            wnd.setSize(screenSize);
            wnd.setVisible(true);

            final HWND hwnd = new HWND(Native.getComponentPointer(wnd));
            m_strClientInfo.hPlayWnd = hwnd;
            final NativeLong lRealHandle = hCNetSDK.NET_DVR_RealPlay_V30(lUserID,
                        m_strClientInfo, null, null, true);

            //JWindow增加双击响应函数,双击时停止预览,退出全屏
            wnd.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                if(evt.getClickCount() == 2)
                {
                    //停止预览
                   hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
                   wnd.dispose();
                }
            }
        });

        }
    }//GEN-LAST:event_panelRealplayMousePressed

    /*************************************************
    函数:    centerWindow
    函数描述:窗口置中
     *************************************************/
  public static void centerWindow(Container window) {
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    int w = window.getSize().width;
    int h = window.getSize().height;
    int x = (dim.width - w) / 2;
    int y = (dim.height - h) / 2;
    window.setLocation(x, y);
  }

 /*************************************************
    函数:    CreateDeviceTree
    函数描述:建立设备通道数
*************************************************/
  private void CreateDeviceTree()
    {
       IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
        boolean bRet = false;

        m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40();
        m_strIpparaCfg.write();
        Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
        bRet = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_IPPARACFG_V40, new NativeLong(0), lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
        m_strIpparaCfg.read();

        DefaultTreeModel TreeModel = ((DefaultTreeModel) jTreeDevice.getModel());//获取树模型
        if (!bRet)
        {
            //设备不支持,则表示没有IP通道
            for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum  )
            {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("Camera"   (iChannum   m_strDeviceInfo.byStartChan));
                TreeModel.insertNodeInto(newNode, m_DeviceRoot,iChannum);
            }
        }
         else
        {
            //设备支持IP通道
            for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum  )
            {
                if(m_strIpparaCfg.byAnalogChanEnable[iChannum] == 1)
                {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("Camera"   (iChannum   m_strDeviceInfo.byStartChan));
                TreeModel.insertNodeInto(newNode, m_DeviceRoot,m_iTreeNodeNum);
                m_iTreeNodeNum   ;
                }
            }
            for(int iChannum =0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum  )
            {
                 if(m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType ==0)
                 {
                     m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class);
                     m_strIpparaCfg.struStreamMode[iChannum].uGetStream.read();
                     if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1)
                     {
                         DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("IPCamera"   (iChannum   m_strDeviceInfo.byStartChan));
                        TreeModel.insertNodeInto(newNode, m_DeviceRoot, m_iTreeNodeNum);
                     }
                 }
                 if(m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType ==6)
                 {
                     m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO_V40.class);
                     m_strIpparaCfg.struStreamMode[iChannum].uGetStream.read();
                     if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struIPChan.byEnable == 1)
                     {
                         DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("IPCamera"   (iChannum   m_strDeviceInfo.byStartChan));
                        TreeModel.insertNodeInto(newNode, m_DeviceRoot, m_iTreeNodeNum);
                     }
                 }
                
            }
        }
                TreeModel.reload();//将添加的节点显示到界面
                jTreeDevice.setSelectionInterval(1, 1);//选中第一个节点
    }

 /*************************************************
    函数:    getChannelNumber
    函数描述:从设备树获取通道号
*************************************************/
  int getChannelNumber()
  {
            int iChannelNum = -1;
            TreePath tp = jTreeDevice.getSelectionPath();//获取选中节点的路径
            if(tp != null)//判断路径是否有效,即判断是否有通道被选中
            {
                //获取选中的通道名,对通道名进行分析:
                String sChannelName = ((DefaultMutableTreeNode)tp.getLastPathComponent()).toString();
                if(sChannelName.charAt(0) == 'C')//Camara开头表示模拟通道
                {
                //子字符串中获取通道号
                iChannelNum = Integer.parseInt(sChannelName.substring(6));
                }
                else
                {
                    if(sChannelName.charAt(0) == 'I')//IPCamara开头表示IP通道
                    {
                         //子字符创中获取通道号,IP通道号要加32
                          iChannelNum = Integer.parseInt(sChannelName.substring(8))   32;
                    }
                    else
                    {
                         return -1;
                    }
                }
            }
            else
            {
                 return -1;
            }
            return iChannelNum;
  }

  /*************************************************
    函数:       主函数
    函数描述:新建ClientDemo窗体并调用接口初始化SDK
     *************************************************/
    public static void main(String args[])
    {
        try
        {
          javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e)
        {
            e.printStackTrace();
        }

        java.awt.EventQueue.invokeLater(new Runnable()
        {

            public void run()
            {
                boolean initSuc = hCNetSDK.NET_DVR_Init();
                if (initSuc != true)
                {
                    JOptionPane.showMessageDialog(null, "初始化失败");
                }
                ClientDemo Demo = new ClientDemo();
                centerWindow(Demo);
                Demo.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonExit;
    private javax.swing.JButton jButtonLogin;
    private javax.swing.JButton jButtonRealPlay;
    private javax.swing.JComboBox jComboBoxCallback;
    private javax.swing.JLabel jLabelIPAddress;
    private javax.swing.JLabel jLabelPassWord;
    private javax.swing.JLabel jLabelPortNumber;
    private javax.swing.JLabel jLabelUserName;
    private javax.swing.JMenuBar jMenuBarConfig;
    private javax.swing.JMenu jMenuConfig;
    private javax.swing.JMenuItem jMenuItemAlarmCfg;
    private javax.swing.JMenuItem jMenuItemBasicConfig;
    private javax.swing.JMenuItem jMenuItemChannel;
    private javax.swing.JMenuItem jMenuItemCheckTime;
    private javax.swing.JMenuItem jMenuItemDefault;
    private javax.swing.JMenuItem jMenuItemDeviceState;
    private javax.swing.JMenuItem jMenuItemFormat;
    private javax.swing.JMenuItem jMenuItemIPAccess;
    private javax.swing.JMenuItem jMenuItemNetwork;
    private javax.swing.JMenuItem jMenuItemPlayBackRemote;
    private javax.swing.JMenuItem jMenuItemPlayTime;
    private javax.swing.JMenuItem jMenuItemReboot;
    private javax.swing.JMenuItem jMenuItemRemoveAlarm;
    private javax.swing.JMenuItem jMenuItemSerialCfg;
    private javax.swing.JMenuItem jMenuItemShutDown;
    private javax.swing.JMenuItem jMenuItemUpgrade;
    private javax.swing.JMenuItem jMenuItemUserConfig;
    private javax.swing.JMenuItem jMenuItemVoiceCom;
    private javax.swing.JMenu jMenuManage;
    private javax.swing.JMenu jMenuPlayBack;
    private javax.swing.JMenu jMenuSetAlarm;
    private javax.swing.JMenu jMenuVoice;
    private javax.swing.JPanel jPanelRealplayArea;
    private javax.swing.JPanel jPanelUserInfo;
    private javax.swing.JPasswordField jPasswordFieldPassword;
    private javax.swing.JRadioButtonMenuItem jRadioButtonMenuListen;
    private javax.swing.JRadioButtonMenuItem jRadioButtonMenuSetAlarm;
    private javax.swing.JScrollPane jScrollPaneTree;
    private javax.swing.JScrollPane jScrollPanelAlarmList;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JSplitPane jSplitPaneHorizontal;
    private javax.swing.JSplitPane jSplitPaneVertical;
    private javax.swing.JTable jTableAlarm;
    private javax.swing.JTextField jTextFieldIPAddress;
    private javax.swing.JTextField jTextFieldPortNumber;
    private javax.swing.JTextField jTextFieldUserName;
    private javax.swing.JTree jTreeDevice;
    private java.awt.Panel panelRealplay;
    // End of variables declaration//GEN-END:variables

  

    /******************************************************************************
     *内部类:   FMSGCallBack
     *报警信息回调函数
     ******************************************************************************/
    public class FMSGCallBack implements HCNetSDK.FMSGCallBack
    {
        //报警信息回调函数

        public void invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, HCNetSDK.RECV_ALARM pAlarmInfo, int dwBufLen, Pointer pUser)
        {
            String sAlarmType = new String();
            DefaultTableModel alarmTableModel = ((DefaultTableModel) jTableAlarm.getModel());//获取表格模型

            String[] newRow = new String[3];
            //报警时间
            Date today = new Date();
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String[] sIP = new String[2];

            //lCommand是传的报警类型
            switch (lCommand.intValue())
            {
                //9000报警
                case HCNetSDK.COMM_ALARM_V30:
                   HCNetSDK.NET_DVR_ALARMINFO_V30 strAlarmInfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30();
                   strAlarmInfoV30.write();
                   Pointer pInfoV30 = strAlarmInfoV30.getPointer();
                   pInfoV30.write(0, pAlarmInfo.RecvBuffer, 0, strAlarmInfoV30.size());
                   strAlarmInfoV30.read();

                    switch (strAlarmInfoV30.dwAlarmType)
                    {
                        case 0:
                            sAlarmType = new String("信号量报警");
                            break;
                        case 1:
                            sAlarmType = new String("硬盘满");
                            break;
                        case 2:
                            sAlarmType = new String("信号丢失");
                            break;
                        case 3:
                            sAlarmType = new String("移动侦测");
                            break;
                        case 4:
                            sAlarmType = new String("硬盘未格式化");
                            break;
                        case 5:
                            sAlarmType = new String("读写硬盘出错");
                            break;
                        case 6:
                            sAlarmType = new String("遮挡报警");
                            break;
                        case 7:
                            sAlarmType = new String("制式不匹配");
                            break;
                        case 8:
                            sAlarmType = new String("非法访问");
                            break;
                    }

                    newRow[0] = dateFormat.format(today);
                    //报警类型
                    newRow[1] = sAlarmType;
                    //报警设备IP地址
                    sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
                    newRow[2] = sIP[0];
                    alarmTableModel.insertRow(0, newRow);

                    break;

                //8000报警
                case HCNetSDK.COMM_ALARM:
                    HCNetSDK.NET_DVR_ALARMINFO strAlarmInfo = new HCNetSDK.NET_DVR_ALARMINFO();
                    strAlarmInfo.write();
                    Pointer pInfo = strAlarmInfo.getPointer();
                    pInfo.write(0, pAlarmInfo.RecvBuffer, 0, strAlarmInfo.size());
                    strAlarmInfo.read();


                    switch (strAlarmInfo.dwAlarmType)
                    {
                        case 0:
                            sAlarmType = new String("信号量报警");
                            break;
                        case 1:
                            sAlarmType = new String("硬盘满");
                            break;
                        case 2:
                            sAlarmType = new String("信号丢失");
                            break;
                        case 3:
                            sAlarmType = new String("移动侦测");
                            break;
                        case 4:
                            sAlarmType = new String("硬盘未格式化");
                            break;
                        case 5:
                            sAlarmType = new String("读写硬盘出错");
                            break;
                        case 6:
                            sAlarmType = new String("遮挡报警");
                            break;
                        case 7:
                            sAlarmType = new String("制式不匹配");
                            break;
                        case 8:
                            sAlarmType = new String("非法访问");
                            break;
                    }

                    newRow[0] = dateFormat.format(today);
                    //报警类型
                    newRow[1] = sAlarmType;
                    //报警设备IP地址
                    sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
                    newRow[2] = sIP[0];
                    alarmTableModel.insertRow(0, newRow);

                    break;

                //ATM DVR transaction information
                case HCNetSDK.COMM_TRADEINFO:
                    //处理交易信息报警
                    break;

                //IPC接入配置改变报警
                case HCNetSDK.COMM_IPCCFG:
                    // 处理IPC报警
                    break;

                default:
                    System.out.println("未知报警类型");
                    break;
            }
        }
    }
    
     /******************************************************************************
     *内部类:   FRealDataCallBack
     *          实现预览回调数据
     ******************************************************************************/
        class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30
    {    
        //预览回调
        public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
        {
            HWND hwnd = new HWND(Native.getComponentPointer(panelRealplay));
            switch (dwDataType)
            {
                case HCNetSDK.NET_DVR_SYSHEAD: //系统头
                    
                    if (!playControl.PlayM4_GetPort(m_lPort)) //获取播放库未使用的通道号
                    {
                        break;
                    }

                    if (dwBufSize > 0)
                    {
                        if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(), PlayCtrl.STREAME_REALTIME))  //设置实时流播放模式
                        {
                            break;
                        }

                        if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024 * 1024)) //打开流接口
                        {
                            break;
                        }

                        if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd)) //播放开始
                        {
                            break;
                        }
                    }
                case HCNetSDK.NET_DVR_STREAMDATA:   //码流数据
                    if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1))
                    {
                        if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize))  //输入流数据
                        {
                            break;
                        }
                    }
            }
        }
    }
        
}

实例下载地址

海康摄像头demo

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警