jetLinks协议开发对接真实设备方式

news2025/2/13 13:05:46

jetLinks协议开发对接真实设备方式

      • 拿到设备
      • 确定设备的SDK
      • SDK调用流程梳理
      • SDK集成JetLinks

拿到设备

首先拿到设备,确认设备型号
在这里插入图片描述
然后登入海康威视官网,下载 https://www.hikvision.com/cn/support/tools/hitools/
在这里插入图片描述
在这里插入图片描述
连接设备修改其对应的IP地址使得本机电脑与设备网络互通。
初始访问该设备Ip对应的网页时会出现提示下载插件的信息在这里插入图片描述
这时候按照提示下载插件,下载完成后用Microsoft Edge打开该网址
在这里插入图片描述
在这里插入图片描述
然后选择在internet模式下加载该网址,进入后则预览成功。
在这里插入图片描述

确定设备的SDK

设备拿到并配置完成后,那么下一步则需要确定设备sdk,进入海康SDK下载对应的页面,
https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10,下载对应操作系统适配的SDK工具包,这里是windows操作系统。
在这里插入图片描述
,下载完成后找到对应设备的开发文档,看当前拿到的设备是否支持SDK二次开发。在这里插入图片描述
我这里用到的是IPC设备,则打开IPC设备对应的开发文档,根据上面设备的型号去开发文档上面去找。
在这里插入图片描述
确认SDK调用的主要流程
在这里插入图片描述

找到一个模块的功能
在这里插入图片描述

然后确认其SDK函数调用流程
在这里插入图片描述

SDK调用流程梳理

在这里插入图片描述
找到对应功能的Demo示例,修改Demo,此处直接将这个Demo集成到jetlinks协议包里面,
在这里插入图片描述
为了打包方便此处直接将依赖的两个jar包放在Maven对应的仓库里面去在这里插入图片描述
在这里插入图片描述
然后通过<dependency方式引入
在这里插入图片描述

package org.jetlinks.protocol.official;

import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;

import static org.jetlinks.protocol.official.ClientDemo.hCNetSDK;

/**
 * @ClassName VideoDemo
 * @Description
 * @Author SD.LIU
 * @Date 2023/6/6 16:12
 * @Version 1.0
 **/
public class VideoDemo implements Runnable {
    Timer Downloadtimer;//下载用定时器
    Timer Playbacktimer;//回放用定时器
    static FRealDataCallBack fRealDataCallBack;//预览回调函数实现
    //定义流的map集合
    static Map<Integer, FileOutputStream> outputStreamMap = new HashMap();
    static int lPlay = -1;  //预览句柄
    static File file;


    private Integer userId;

    private Integer iChannelNo;

    public VideoDemo(Integer userId, Integer iChannelNo) {
        this.userId = userId;
        this.iChannelNo = iChannelNo;
    }

    @Override
    public void run() {
        fRealDataCallBack = null;
        if (userId == -1) {
            System.out.println("请先注册");
            return;
        }
        HCNetSDK.NET_DVR_PREVIEWINFO strClientInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();
        strClientInfo.read();
        strClientInfo.hPlayWnd = 0;  //窗口句柄,从回调取流不显示一般设置为空
        strClientInfo.lChannel = iChannelNo;  //通道号
        strClientInfo.dwStreamType = 0; //0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
        strClientInfo.dwLinkMode = 0; //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP,6- HRUDP(可靠传输) ,7- RTSP/HTTPS,8- NPQ
        strClientInfo.bBlocked = 1;
        strClientInfo.write();

        if (fRealDataCallBack == null) {
            fRealDataCallBack = new FRealDataCallBack();
        }
        //开启预览
        lPlay = hCNetSDK.NET_DVR_RealPlay_V40(userId, strClientInfo, fRealDataCallBack, null);
        if (lPlay == -1) {
            int iErr = hCNetSDK.NET_DVR_GetLastError();
            System.out.println("取流失败" + iErr);
            return;
        }
        System.out.println("取流成功");
    }


    //创建文件

    /**
     * @param userId:登陆返回的用户句柄
     * @date 2022/8/31 23:37
     */
    public static void setFile(int userId) {
        file = new File("X:xxxx\\Download\\" + System.currentTimeMillis() + "(" + userId + ")" + ".mp4");  //保存回调函数的音频数据

        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
//            FileOutputStream outputStream=new FileOutputStream(file);
        try {

            outputStreamMap.put(userId, new FileOutputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }


    static class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30 {
        //预览回调
        @Override
        public void invoke(int lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {
            long offset = 0;
            ByteBuffer buffers = pBuffer.getPointer().getByteBuffer(offset, dwBufSize);
            byte[] bytes = new byte[dwBufSize];
            buffers.rewind();
            buffers.get(bytes);
            try {
                //从map中取出对应的流读取数据
                outputStreamMap.get(lRealHandle).write(bytes);
            } catch (Exception e) {
                e.printStackTrace();
            }


        }
    }


}

package org.jetlinks.protocol.official;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import org.jetlinks.protocol.official.common.osSelect;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @ClassName ClientDemo
 * @Description
 * @Author SD.LIU
 * @Date 2023/6/6 16:07
 * @Version 1.0
 **/
public class ClientDemo {



    public static HCNetSDK hCNetSDK = null;
    static PlayCtrl playControl = null;
    static int lUserID = 0;//用户句柄
    public static List<Integer> lUserIDList = new ArrayList<>();//用户句柄

    static FExceptionCallBack_Imp fExceptionCallBack;


    static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
        @Override
        public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
            System.out.println("异常事件类型:" + dwType);
            return;
        }
    }

    public static void call() throws InterruptedException {

        if (hCNetSDK == null && playControl == null) {
            if (!CreateSDKInstance()) {
                System.out.println("Load SDK fail");
                return;
            }
            if (!CreatePlayInstance()) {
                System.out.println("Load PlayCtrl fail");
                return;
            }
        }
        String  strDllPath="";
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux()) {
            HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
            HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
            //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
            String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
            String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";

            System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
            ptrByteArray1.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());

            System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
            ptrByteArray2.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());

            String strPathCom = System.getProperty("user.dir") + "/lib";
            HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
            System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
            struComPath.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
        }

        //初始化
        init();

        //登陆
        login();


        // 创建线程池对象指定线程数量
        ExecutorService tp = Executors.newFixedThreadPool(2);

        VideoDemo video1 = new VideoDemo(lUserIDList.get(0), 1);

        tp.submit(video1);
    }


    //登陆
    private static void login() {

        //存储登陆设备集合
        List<Device> list = new ArrayList<>();
        Device device = new Device();
        device.setIp("169.254.194.72");
        device.setUserName("admin");
        device.setPassWord("abcd1234");

        list.add(device);
//        list.add(device1);

        //登录设备,每一台设备分别登录; 登录句柄是唯一的,可以区分设备
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo;//设备登录信息
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo;//设备信息

        for (Device d : list) {
            m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
            m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
            String m_sDeviceIP = d.getIp();//设备ip地址
            m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
            System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());

            String m_sUsername = d.getUserName();//设备用户名
            m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
            System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());

            String m_sPassword = d.getPassWord();//设备密码
            m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
            System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());

            m_strLoginInfo.wPort = 8000; //SDK端口
            m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
            m_strLoginInfo.write();
            lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);

            //将登陆返回的用户句柄保存!(这里很重要 是原先官网没有的,这里保存句柄是为了预览使用)
            lUserIDList.add(lUserID);

            if (lUserID == -1) {
                System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            } else {
                System.out.println("设备登录成功! " + "设备序列号:" + new String(m_strDeviceInfo.struDeviceV30.sSerialNumber).trim());
                m_strDeviceInfo.read();
            }
            //保存回调函数的音频数据
            VideoDemo.setFile(lUserID);

        }
    }


    //初始化
    private static void init() {

        //SDK初始化,一个程序只需要调用一次
        boolean initSuc = hCNetSDK.NET_DVR_Init();

        if (initSuc != true) {
            System.out.println("初始化失败");
        }

        //异常消息回调
        if (fExceptionCallBack == null) {
            fExceptionCallBack = new FExceptionCallBack_Imp();
        }

        Pointer pUser = null;
        if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {
            return;
        }
        System.out.println("设置异常消息回调成功");

        //启动SDK写日志
        hCNetSDK.NET_DVR_SetLogToFile(3, "..\\sdkLog\\", false);

    }

    /**
     * 动态库加载
     *
     * @return
     */
    private static boolean CreateSDKInstance() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (osSelect.isWindows()) {
                        //win系统加载库路径
                        //strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";
                        strDllPath = "C:\\xxx\HCNetSDK.dll";
                    } else if (osSelect.isLinux()) {
                        //Linux系统加载库路径
                        //  strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                        strDllPath = "/usr/local/lib/libhcnetsdk.so";
                    }
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);


                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 播放库加载
     *
     * @return
     */
    private static boolean CreatePlayInstance() {
        if (playControl == null) {
            synchronized (PlayCtrl.class) {
                String strPlayPath = "";
                try {
                    if (osSelect.isWindows()) {
                        //win系统加载库路径
                        strPlayPath = System.getProperty("user.dir") + "\\lib\\PlayCtrl.dll";
                    } else if (osSelect.isLinux()) {
                        //Linux系统加载库路径
                        strPlayPath = System.getProperty("user.dir") + "/lib/libPlayCtrl.so";
                        playControl = (PlayCtrl) Native.loadLibrary("E:\\eclipse2019work\\ClientDemo-NetBeansPro\\PlayCtrl.dll", PlayCtrl.class);
                    }

                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strPlayPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }

    //注销设备
    public void videoWrite() {


        //退出程序时调用,每一台设备分别注销

        for (int id : lUserIDList) {
            if (hCNetSDK.NET_DVR_Logout(id)) {
                System.out.println("注销成功");
            }
        }


        lUserIDList.clear();


        //SDK反初始化,释放资源,只需要退出时调用一次
        hCNetSDK.NET_DVR_Cleanup();


        VideoDemo.outputStreamMap.clear();
    }


}

为了实验开发的协议的正确性将ClientDemo中的call方法修改一下:

    public static void main(String[] args) {

        if (hCNetSDK == null && playControl == null) {
            if (!CreateSDKInstance()) {
                System.out.println("Load SDK fail");
                return;
            }
            if (!CreatePlayInstance()) {
                System.out.println("Load PlayCtrl fail");
                return;
            }
        }
        String  strDllPath="";
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux()) {
            HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
            HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
            //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
            String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
            String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";

            System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
            ptrByteArray1.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());

            System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
            ptrByteArray2.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());

            String strPathCom = System.getProperty("user.dir") + "/lib";
            HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
            System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
            struComPath.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
        }

        //初始化
        init();

        //登陆
        login();


        // 创建线程池对象指定线程数量
        ExecutorService tp = Executors.newFixedThreadPool(2);

        VideoDemo video1 = new VideoDemo(lUserIDList.get(0), 1);

        tp.submit(video1);
    }

通过挂载的线程拉流,实现视频的预览功能:

在这里插入图片描述
视频下载工具获取地址:
https://www.hikvision.com/cn/support/tools/hitools/
在这里插入图片描述
如上图根据自己的开发环境选择合适VSPlayer播放器。

SDK集成JetLinks

这里只是一个小Demo,做初学的过程中尝试用,具体的集成流程根据实际的情况做实际的处理:
为了调试可以将jetlinks的协议包拖入到jetlinks-community-master项目里面,建立一个文件夹并把协议包拖进去,再鼠标选中协议包的pom.xml文件右键add as Maven project即完成项目的添加
在这里插入图片描述
再分析官方文档:
在如下这个链接中可以找到如下调用流程图:
https://doc.v1.jetlinks.cn/protocol/start.html#%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B
在这里插入图片描述
找一个最简单的方式实现真实设备的调用,这里选的是http调用下发的过程中实现设备的实时预览功能【这里的设备登录方法调用等都写在call方法里面的】:
在这里插入图片描述
然后启动项目,调用下发:
这里用的是Http模拟的,
具体Http设备配置流程可以参照如下链接:
https://hanta.yuque.com/px7kg1/yfac2l/qlr6nz5btr5rwrgk
先让模拟的设备上线,然后再调用下发,实现真实设备的调用:
在这里插入图片描述
点击获取最新属性
在这里插入图片描述
由于公司内网的原因,只演示到实际调用设备处,由下图可以看出已经去加载协议包对应的dll文件了,则jetlinks和协议包所写的设备代码已经可以实现联动调用了,调研结束。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号都是如何产生的,干货满满

目录 一、哪三大阶段 二、产生信号 1、通过键盘产生信号 2、系统调用 3、软件条件产生信号 4、硬件异常产生信号 三、Term和core是什么 一、信号一生三大阶段 1、产生信号&#xff1a;由通过键盘、系统调用、软件条件、硬件异常产生这几种方法产生信号。 2、信号储存&a…

JMeter必知必会系列 —— JMeter基础

1.1 JMeter概述 JMeter简介 Apache JMeter™是Apache组织开发的一款开源软件&#xff0c;是典型的纯Java开发的应用程序&#xff0c;可以在不同平台比如Windows、Linux或macOS系统上进行软件测试。JMeter主要用于应用程序的功能负载测试以度量软件的性能&#xff0c;也可以用于…

项目使用tensorflow2会出错,下载并使用tensorflow1

背景&#xff1a;使用pycharm安装总显示安装失败&#xff0c;使用pip安装也不行&#xff0c;只能使用conda配置虚拟环境手动安装 1、下载安装anaconda 官网下载&#xff0c;双击安装。用anaconda就是想使用虚拟环境&#xff0c;万一没弄好直接删了重新搞就行。 2、创建虚拟环境…

Kendo UI R2 2023 crack

Kendo UI R2 2023 crack 新组件&#xff1a;角度PDFViewer 直接在Angular应用程序中查看PDF文件&#xff0c;无需第三方软件或附加组件。 凭借直观的分页机制、强大的搜索功能和灵活的缩放选项&#xff0c;用户可以轻松导航和浏览PDF内容。 角度16支架 Angular 16引入了一系列改…

AWS CodeWhisperer(代码辅助工具)使用体验

工具 1.vscode 2.AWS Toolkit插件 CodeWhisperer插件的功能 1.自动优化代码&#xff1a;CodeWhisperer插件可以通过代码分析来自动优化代码&#xff0c;从而提高代码的质量和效率。 2.智能代码提示&#xff1a;CodeWhisperer插件可以根据代码上下文提供智能代码提示&#x…

C语言之数组详解(1)(更新前面数组博客的不足)

目录 一、一维数组 1.一维数组的创建和初始化 (1).数组的创建 (2).数组的初始化 2.一维数组的使用 3.一维数组在内存中的存储 二、二维数组 1.二维数组的创建和初始化 (1).二维数组的创建 (2).二维数组的初始化 2.二维数组的使用 3.二维数组在内存中的存储 三、数组作为函数参…

尚硅谷大数据技术Spark教程-笔记08【SparkSQL(介绍、特点、数据模型、核心编程、案例实操、总结)】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程…

14.一天搞定主流小程序按分类列表显示文章1

小程序按分类列表显示文章1 (视频对应无13) 本教程均在第一节中项目启动下操作 小程序按分类列表显示文章1 (视频对应无13)前言一、新增分类界面:![在这里插入图片描述](https://img-blog.csdnimg.cn/1dffd20abc8f47d3961dee59426f3a8f.png)二.新增接口apiflex布局组件数据表绑…

Cocos creator常驻节点使用方式addPersistRootNode

最近在做小游戏的时候&#xff0c;遇到了进入result场景时候的传值问题。 场景加载传值&#xff0c;通过常驻节点实现。 在game_scene中添加常驻节点GameResultData空节点。 创建脚本GameResultData.ts&#xff0c;声明要传递的值的内容。 const {ccclass, property} cc._de…

vscode配置格式化

安装好插件 : Vetur 打开vscode --> 文件 --> 首选项 --> 设置 --> 扩展 --> vetur 点击&#xff1a; 写入以下代码 // { // "files.autoSave": "onFocusChange", // "explorer.confirmDelete": false, // "editor.…

南大通用GBase 8c 多模多态分布式数据库系列一之基本介绍、核心技术、架构演进

前言 随着传统的关系型SQL数据库&#xff08;Oracle&#xff0c;MySQL&#xff0c;PostgreSQL等&#xff09;难以满足日益增长的高数据量、快速数据处理要求、高数据库安全及强容灾能力要求&#xff08;RPO&#xff0c;RTO&#xff09;等挑战&#xff0c;尽管NoSQL非关系型数据…

【超详细练气篇】STL之string类---常见接口函数(1)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析 Gavin老师在企业级ChatGPT开发入门实战直播21课第2课中,讲解的ChatGPT应用案例开发架构图: ChatGPT案例运行日志 2023-06-11 16:06:57 DEBUG Calling on_part_begin with no data 2023-06-11

完型填空技巧

完形中分值最高的是逻辑关系题&#xff0c;逻辑关系分为两种&#xff0c;一种是选项就是逻辑关系的&#xff0c;例: Given the advantages of electronic money, you might thinkthat we would move quickly to the cashless society in which allpayments are made electronic…

常用设计模式(三)

接着之前的思路今天来介绍一下常用的设计模式有哪些 单例模式&#xff08;Singleton Pattern&#xff09; 又称为单体模式&#xff0c;保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点。也就是说&#xff0c;第二次使用同一个类创建新对象的时候&#xff0c…

机器学习-8 集成学习

集成学习 集成学习理论集成学习概述集成学习理论 随机森林算法原理Scikit-learn中的随机森林分类器函数原型sklearn.ensemble.RandomForestClassifier(n_estimators10,criteriongini,max_depthNone,min_samples_split2,min_samples_leaf1,min_weight_fraction_leaf0.0,max_feat…

pytorch深度学习框架—torch.nn模块(一)

pytorch深度学习框架—torch.nn模块 torch.nn模块中包括了pytorch中已经准备好的层&#xff0c;方便使用者调用构建的网络。包括了卷积层&#xff0c;池化层&#xff0c;激活函数层&#xff0c;循环层&#xff0c;全连接层。 卷积层 pytorch中针对使用场景的不同&#xff0c;有…

多云时代来临,容器存储谁敢横刀立马?

多云时代来临&#xff0c;容器存储谁敢横刀立马&#xff1f; 原创2023-06-12 21:54大数据在线 2011年&#xff0c;Gartner提出了数字化转型的理念&#xff1b;十多年来&#xff0c;企业数字化经历了移动化、云化等几次变革潮流&#xff0c;如今走入一个新的时代&#xff1a;多…

Docker 生成 golang 程序镜像

一. 准备golang程序 package mainimport "github.com/gin-gonic/gin"func main() {go func() {r1 : gin.Default()r1.GET("/sayHello/", func(c *gin.Context) {c.JSON(200, "hello1")})r1.Run(":8992")}()r : gin.Default()r.GET(&q…

详解Linux内核安全技术——磁盘加密技术概述和eCryptfs

一、概述 加密是最常见的数据安全保护技术&#xff0c;在数据生命周期各阶段均有应用。从应用场景和技术实现上&#xff0c;按加密对象、用户是否感知、加密算法等维度&#xff0c;有多种分类及对应方案&#xff0c;并在主流操作系统如Windows、Linux、Android中有广泛应用。 …