Java 海康SDK透明通道建立(485透传)

1.海康的sdk中,java版的demo——clientdemo中,先完成配置,运行起来,添加设备,完成预览。(如下图所示)

2.点击“配置”;选择“串口参数”;弹出串口参数配置窗口,如下图:

3.建立透明通道:(此处不配485透传参数,默认相机485配置),选择“数据透传”,串口类型改为“485”;点击“建立透传”按钮,弹出消息提示成功或者失败。

 

5.到了这里似乎透传成功了,但是一点用的没有!!!!

因为clientdemo中透传功能的代码中,建立透明通道的功能没实现。

先要完成代码:

最快的方法,先到clientdemo工程中HCNetSDk类中找到 NET_DVR_SerialStart()接口,查看一下NET_DVR_SerialStart()在什么地方被使用,找到建立透明通道那部分代码:

 /*************************************************
    函数:      数据透传  "建立通道" 按钮单击响应函数
    函数描述:	建立透明通道
     *************************************************/
    private void jButtonCreateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCreateActionPerformed
        int iSerialType = jComboBoxSerialType.getSelectedIndex() + 1;//串口类型

        m_lSerialHandle = hCNetSDK.NET_DVR_SerialStart(m_lUserID, new NativeLong(iSerialType), fSerialDataCallBack, 0);


        if (m_lSerialHandle.intValue() == -1)
        {
            JOptionPane.showMessageDialog(this, "建立透明通道失败!");
            System.out.println(hCNetSDK.NET_DVR_GetLastError());
            return;
        } else
        {
            JOptionPane.showMessageDialog(this, "建立透明通道成功建立!");
            jButtonCreate.setEnabled(false);
            jButtonDistruct.setEnabled(true);
        }
    }//GEN-LAST:event_jButtonCreateActionPerformed

首先,上面代码中检测hCNetSDk是否为null,如果为null,则实例化;其次NET_DVR_SerialStart()接口中的回调函数fSerialDataCallBack是否为null,如果为null,则实例化;(代码运行半天,才发现这两变量为null)

当完成这些,还是不行,在回调函数的重载函数FSerialDataCallBack,如下图所示:

/******************************************************************************
     *内部类:   FSerialDataCallBack
     *串口信息回调函数
     ******************************************************************************/
    class FSerialDataCallBack implements HCNetSDK.FSerialDataCallBack
    {

        public void invoke(NativeLong lSerialHandle, String pRecvDataBuffer, int dwBufSize, int dwUser)
        {
            //获取时间,格式化输出
            Date today = new Date();
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        
            //打印时间到jTextAreaMessage
            jTextAreaMessage.append(dateFormat.format(today) + ":\n");
            //打印回调的信息到jTextAreaMessage
            jTextAreaMessage.append(pRecvDataBuffer + "\n");

        }
    }

又到坑人的地方,你可能要从回调函数的pRecvDataBuffer解析出byte[], 但是pRecvDataBuffer.getBytes()转成byte[]并不是你要的透传数据。比如透传数据是10字节,但这样得到的只有8个字节,而且当打印pRecvDataBuffer.toString的值时,乱码;

怎么办?

所以说这是坑人的地方。联系海康客服,客服让你去看sdk中MFC关于透传的代码。然而对Java中对应的代码没有什么借鉴性,别灰心!有解决办法。

在clientdemo工程中HCNetSDk类将FSerialDataCallBack接口做简单的修改。

其中pRecvDataBuffer被定义为String类型,此时需要修改为Pointer类型。如下图所示:

public static interface FSerialDataCallBack extends StdCallCallback {
        public void invoke(NativeLong lSerialHandle,Pointer pRecvDataBuffer,int dwBufSize,int dwUser);
      
}

 当改完HCNetSDk类FSerialDataCallBack接口,在实现透传功能的代码的加载的透传回调函数一定要修改,和HCNetSDk类FSerialDataCallBack接口参数保持一直,(不然你重载的FSerialDataCallBack会报错)。修改后的透传回调函数如下所示:

 /******************************************************************************
     *内部类:   FSerialDataCallBack
     *串口信息回调函数
     ******************************************************************************/
    class FSerialDataCallBack implements HCNetSDK.FSerialDataCallBack
    {

        public void invoke(NativeLong lSerialHandle, Pointer pRecvDataBuffer, int dwBufSize, int dwUser)
        {
           
            //获取时间,格式化输出
            Date today = new Date();
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");

            //透传数据转换为byte[], dwBufSize是透传数据的字节数
            //byte[] bytes = pRecvDataBuffer.getByteArray(0, dwBufSize);

            //打印时间到jTextAreaMessage
            jTextAreaMessage.append(dateFormat.format(today) + ":\n");
            //打印回调的信息到jTextAreaMessage, pRecvDataBuffer.getByteArray(0,dwBufSize).toString()将透传数据转换为字符串打印在表格
            jTextAreaMessage.append(pRecvDataBuffer.getByteArray(0,dwBufSize).toString()+ "\n");


        }
    }

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java二次开发海康485透传是指在使用Java语言对海康设备的485透传功能进行二次开发和使用。 首先,485透传是指通过串口通信来实现海康设备与其他设备之间的数据传输。使用Java语言进行二次开发可以提高开发效率和灵活性。 在Java中,我们可以通过Java串口通信库来实现和控制串口通信。可以使用Java的SerialPort类来连接和控制485串口,通过读写串口数据来完成与海康设备的通信。 首先,我们需要引入串口通信相关的Java库,如JavaComm或jSerialComm等。然后,创建SerialPort对象,设置串口的参数,如波特率、数据位、停止位等。接下来,可以使用串口的InputStream和OutputStream来读写数据。可以根据海康设备的协议,对读写的数据进行解析和组包。 在与海康设备进行485透传通信时,需要注意以下几点: 1. 串口的连接和断开:需要在需要传输数据的时候打开串口连接,完成操作后要及时关闭串口连接,释放资源,避免占用串口。 2. 数据的解析和组包:根据海康设备的通信协议,将接收到的数据进行解析,提取有效的信息。在发送数据时,需要将数据按照协议进行组包,发送给海康设备。 3. 错误处理和异常捕获:在进行485透传通信的过程中,可能会遇到各种错误和异常情况,需要进行相应的处理和捕获,保证程序的运行稳定性和可靠性。 总结起来,使用Java进行海康485透传的二次开发,可以通过Java的串口通信库实现串口的连接和数据的读写,根据海康设备的通信协议进行数据的解析和组包。同时,需要注意错误处理和异常捕获,保证程序的稳定性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值