海康SDK对接 超脑设备-下发人员信息和人脸

news2024/9/17 8:25:19

文中参数说明和bean 见前面的文章

下发人员

    @Override
    public void send(IotCommonMsgBodyParam msgBody) {
        IotReplyMsgBodyResult bodyResult;
        try {
            if (StrUtil.isEmpty(msgBody.getAccount()) || StrUtil.isEmpty(msgBody.getBody())) {
                return;
            }
            IotCameraParam cameraParam = JSONUtil.toBean(msgBody.getAccount(), IotCameraParam.class);
            List<IotAddFaceParam> faceParamList = JSONUtil.toList(msgBody.getBody(), IotAddFaceParam.class);
            if (CollUtil.isEmpty(faceParamList) || faceParamList.size() < 1) {
                return;
            }
            //在保存
            List<IotCommDataResult> commDataResults = iotHkFaceApiService.addFace(cameraParam, faceParamList);
            if (CollUtil.isNotEmpty(commDataResults) && commDataResults.size() > 0) {
                List<IotUserFaceResult> userResults = new ArrayList<>();
                for (IotCommDataResult result : commDataResults) {
                    IotUserFaceResult userResult = new IotUserFaceResult();
                    userResult.setUserId(result.getId());
                    userResult.setCode(result.getCode());
                    userResult.setMsg(result.getMsg());
                    userResults.add(userResult);
                }
                bodyResult = msgBody.toResult(JSONUtil.toJsonStr(userResults));
                log.info("Hikvision addFace  bodyResult:{}", JSONUtil.toJsonStr(bodyResult));
            } else {
                bodyResult = msgBody.toResult("指令下发成功");
            }
        } catch (Exception e) {
            log.warn("Hikvision addFace e", e);
            bodyResult = msgBody.toResult("指令下发失败");
        }
        // 收集指令执行结果
        redisMessageProducer.doSendMessage(IotRedisTopicConstant.REDIS_INSTRUCT_RESPONSE_TOPIC, JSONUtil.toJsonStr(bodyResult));
    }

设备登录

 /**
     * 设备登录
     *
     * @param ipadress IP地址
     * @param user     用户名
     * @param psw      密码
     * @param port     端口,默认8000
     */
    public static int login_V40(String ipadress, String user, String psw, short port) {
        if(ObjectUtil.isNull(hKHCNetSDK)){
            return -1;
        }
        //注册
        NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new NET_DVR_USER_LOGIN_INFO();//设备登录信息
        String m_sDeviceIP = ipadress;//设备ip地址
        m_strLoginInfo.sDeviceAddress = new byte[IotHikNetConstant.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        String m_sUsername = user;//设备用户名
        m_strLoginInfo.sUserName = new byte[IotHikNetConstant.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        String m_sPassword = psw;//设备密码
        m_strLoginInfo.sPassword = new byte[IotHikNetConstant.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = port; //sdk端口
        m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
        m_strLoginInfo.write();
        NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new NET_DVR_DEVICEINFO_V40();//设备信息
        int lUserID = -1;
        try {
            lUserID = hKHCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
            if (lUserID == -1) {
                log.warn("登录失败,错误码为:{}", hKHCNetSDK.NET_DVR_GetLastError());
                return lUserID;
            } else {
                log.info("登录成功!");
                m_strDeviceInfo.read();
            }
        } catch (Exception e) {
            log.error("海康SDK 登录异常,请检查网络和SDK路径是否正确", e);
        } finally {
            m_strLoginInfo.clear();
            m_strDeviceInfo.clear();
        }
        return lUserID;
    }

设备注销 SDK释放

    //设备注销 SDK释放
    public static void logout(int lUserID) {

        if (lUserID >= 0) {
            if (!hKHCNetSDK.NET_DVR_Logout(lUserID)) {
                log.warn("注销失败,错误码为: {}", hKHCNetSDK.NET_DVR_GetLastError());
            }
            log.info("注销成功");
            //hCNetSDK.NET_DVR_Cleanup(); //释放SDK
            return;
        } else {
            log.warn("设备未登录");
        }
    }

下发人员信息和人脸

    @Override
    public List<IotCommDataResult> addFace(IotCameraParam camera, List<IotAddFaceParam> faceList) {

        int loginV40 = login_V40(camera.getIp(), camera.getUsername(), camera.getPassword(), new Short(String.valueOf(camera.getPort())));
        List<IotCommDataResult> commDataResults = new ArrayList<>();
        for (IotAddFaceParam faceParam : faceList) {
            IotCommDataResult result = new IotCommDataResult();
            result.setId(faceParam.getUserId());
            if (StrUtil.isNotEmpty(FDID)) {
                //FDID必填项,只能项指定库添加人脸
                uploadPic(loginV40, FDID, faceParam, result);
            }else {
                result.setCode(500);
                result.setMsg("添加人脸失败:未指定人脸库");
            }
            commDataResults.add(result);
        }
        logout(loginV40);
        return commDataResults;
    }

获取所有人脸库信息

    /**
     * 获取所有人脸库信息
     */
    private FDLibBaseCfgList allFaceData(int lUserID) {
        String strOutXML = sdkIsApi(lUserID, HKUrlConstant.ALL_FACL_DB, "");
        try {
            FDLibBaseCfgList fdLibBaseCfgList = XmlUtil.toBean(FDLibBaseCfgList.class, strOutXML);
            log.info("查询所有人脸库信息:{}", JSONUtil.toJsonStr(fdLibBaseCfgList));
            return fdLibBaseCfgList;
        } catch (Exception e) {
            log.error("获取所有人脸库信息", e);
        }
        return null;
    }

查询指定人脸库

    /**
     * 查询指定人脸库
     */
    private FDLibBaseCfg specifyFaceLibrary(int lUserID, String FDID) {
        //        requestUrl = "GET /ISAPI/Intelligent/FDLib/" + FDID;
        if (StrUtil.isEmpty(FDID)) {
            log.warn("未指定人脸库");
            return null;
        }
        String strOutXML = sdkIsApi(lUserID, HKUrlConstant.ALL_FACL_DB + FDID, "");
        try {
            FDLibBaseCfg fdLibBaseCfg = XmlUtil.toBean(FDLibBaseCfg.class, strOutXML);
            log.info("查询所有人脸库信息:{}", JSONUtil.toJsonStr(fdLibBaseCfg));
            return fdLibBaseCfg;
        } catch (Exception e) {
            log.error("获取所有人脸库信息", e);
        }
        return null;
    }

创建人脸库

    /**
     * 创建人脸库
     *
     * @param
     */
    private static FDLibInfoList createFaceLibrary(int lUserID, CreateFDLibList createFDLibList) {

        String strOutXML = sdkIsApi(lUserID, HKUrlConstant.CREATE_FACE_LIBRARY, fDCreate_XmlCreat(createFDLibList));

//        <FDLibInfoList version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
//        <FDLibInfo>
//        <id>1</id>
//        <name>测试001</name>
//        <FDID>642446466D424B32B9E50B7A33B4E5B8</FDID>
//        </FDLibInfo>
//        </FDLibInfoList>
        log.info("创建人脸库:{}", strOutXML);
        try {
            FDLibInfoList fdLibInfoList = XmlUtil.toBean(FDLibInfoList.class, strOutXML);
            log.info("创建人脸库:{}", JSONUtil.toJsonStr(fdLibInfoList));
            return fdLibInfoList;
        } catch (Exception e) {
            log.error("获取所有人脸库信息", e);
        }
        return null;
    }

创建人脸库输入XML报文

  // 创建人脸库输入XML报文
    private static String fDCreate_XmlCreat(CreateFDLibList createFDLibList) {
        /*<CreateFDLibList version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
        <!--req,创建人脸比对库输入参数-->
        <CreateFDLib>
        <id>
        <!--req, xs:integer,"表示list中子项个数,从"1"开始赋值,依次增加" -->
        </id>
        <name>
        <!--opt, xs:string,"人脸比对库名称"-->
        </name>
        <thresholdValue>
        <!--opt, xs:integer, "检测阈值,阈值越大检测准确率越低, 范围[0,100]"-->
        </thresholdValue>
        <customInfo>
        <!--opt, xs:string, 人脸库附加信息-->
        </customInfo>
        <customFaceLibID>
        <!--opt, xs:string, "自定义人脸库ID, 由上层下发给设备, 该ID由上层维护并确保唯一性,
        设备侧需将自定义人脸库ID与设备生成的FDID进行关联, 确保上层可通过下发人脸库ID来替代下发FDID进行后续操作"-->
            </customFaceLibID>
        </CreateFDLib>
        </CreateFDLibList>*/

        String requestXm = null;
        try {
        // XmlUtil 是解析工具 自己封装的
            requestXm = XmlUtil.toXml(createFDLibList);

        } catch (Exception e) {
            log.error("创建人脸库编译xml异常", e);
        }
        return requestXm;
    }

上传人脸图

/**
     * 上传人脸图
     *
     * @param lUserID
     * @param fdId      人脸库id
     * @param faceParam
     * @throws IOException
     */
    public static void uploadPic(int lUserID, String fdId, IotAddFaceParam faceParam, IotCommDataResult result) {

        try {
            NET_DVR_FACELIB_COND struFaceLibCond = new NET_DVR_FACELIB_COND();
            struFaceLibCond.read();
            struFaceLibCond.dwSize = struFaceLibCond.size();
            //人脸库ID
            for (int i = 0; i < IotHikNetConstant.NET_SDK_MAX_FDID_LEN; i++) {
                struFaceLibCond.szFDID[i] = 0;
            }
            System.arraycopy(fdId.getBytes(), 0, struFaceLibCond.szFDID, 0, fdId.length());

            struFaceLibCond.byConcurrent = 0; //设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模)
            struFaceLibCond.byCover = 1;  //是否覆盖式导入(人脸库存储满的情况下强制覆盖导入时间最久的图片数据):0- 否,1- 是
            struFaceLibCond.byCustomFaceLibID = 0;
            struFaceLibCond.write();

            Pointer pStruFaceLibCond = struFaceLibCond.getPointer();
            int iUploadHandle = hKHCNetSDK.NET_DVR_UploadFile_V40(lUserID, IotHikNetConstant.IMPORT_DATA_TO_FACELIB, pStruFaceLibCond,
                    struFaceLibCond.size(), null, Pointer.NULL, 0);
            if (iUploadHandle <= -1) {
                int iErr = hKHCNetSDK.NET_DVR_GetLastError();
                log.warn("NET_DVR_UploadFile_V40失败,错误号:{}", iErr);
                result.setCode(500);
                result.setMsg("添加人脸失败:"+IotHkExceptionEnum.getMsg(iErr));
                return;
            } else {
                log.info("NET_DVR_UploadFile_V40成功");
            }
            NET_DVR_SEND_PARAM_IN struSendParam = new NET_DVR_SEND_PARAM_IN();
            struSendParam.read();

            //本地jpg图片转成二进制byte数组
            String fileName = IdWorker.getId() + ".jpg";
            String downloadImgPath = ImageBase64Format.base64ByFilePath(faceParam.getFaceImage(), fileName);
            if (StrUtil.isEmpty(downloadImgPath)) {
                log.warn("图片解析失败");
                result.setCode(500);
                result.setMsg("添加人脸失败:"+IotHkExceptionEnum.getMsg(hKHCNetSDK.NET_DVR_GetLastError()));
                return;
            }
            byte[] picbyte = ImageBase64Format.filetoByte(new File(downloadImgPath));
//            byte[] picbyte = ImageBase64Format.toByteArray("D:\\dev\\FDLib.jpg");
            BYTE_ARRAY arraybyte = new BYTE_ARRAY(picbyte.length);
            arraybyte.read();
            arraybyte.byValue = picbyte;
            arraybyte.write();
            struSendParam.pSendData = arraybyte.getPointer();
            struSendParam.dwSendDataLen = picbyte.length;
            struSendParam.byPicType = 1; //图片格式:1- jpg,2- bmp,3- png,4- SWF,5- GIF

            //图片的附加信息缓冲区  图片上添加的属性信息,性别、身份等
            //1:xml文本导入方式
/*          byte[] AppendData = toByteArray("E:\\2.Demo汇总\\JAVA_DEMO\\01-Windows_Demo\\超脑人脸比对\\Test\\pic\\test.xml");
            HCNetSDK.BYTE_ARRAY byteArray = new HCNetSDK.BYTE_ARRAY(AppendData.length);
            byteArray.read();
            byteArray.byValue = AppendData;
            byteArray.write();*/

            //2:包含中文姓名的报文上传
            byte[] byFDLibName = faceParam.getUserName().getBytes(StandardCharsets.UTF_8);
            String strInBuffer1 = "<FaceAppendData version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\"><bornTime></bornTime><name>";
            String strInBuffer2 = "</name><sex>" + faceParam.getSex() + "</sex><province></province><city></city><certificateType>ID</certificateType><certificateNumber>" + faceParam.getIdCard() + "</certificateNumber><PersonInfoExtendList><PersonInfoExtend><id>1</id><enable>true</enable><name>test1</name><value>test2</value></PersonInfoExtend></PersonInfoExtendList></FaceAppendData>";
            int iStringSize = byFDLibName.length + strInBuffer1.length() + strInBuffer2.length();
            BYTE_ARRAY ptrByte = new BYTE_ARRAY(iStringSize);
            System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length());
            System.arraycopy(byFDLibName, 0, ptrByte.byValue, strInBuffer1.length(), byFDLibName.length);
            System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + byFDLibName.length, strInBuffer2.length());
            ptrByte.write();
            struSendParam.pSendAppendData = ptrByte.getPointer();
            struSendParam.dwSendAppendDataLen = ptrByte.byValue.length;
            struSendParam.write();
            int iSendData = hKHCNetSDK.NET_DVR_UploadSend(iUploadHandle, struSendParam, Pointer.NULL);
            if (iSendData <= -1) {
                int iErr = hKHCNetSDK.NET_DVR_GetLastError();
                log.info("NET_DVR_UploadSend失败,错误号:{}", iErr);
                result.setCode(500);
                result.setMsg("添加人脸失败:"+IotHkExceptionEnum.getMsg(iErr));
                return;
            }
            while (true) {
                IntByReference Pint = new IntByReference(0);
                int state = hKHCNetSDK.NET_DVR_GetUploadState(iUploadHandle, Pint.getPointer());
                if (state == 1) {
                    log.info("上传成功");
                    //获取图片ID
                    NET_DVR_UPLOAD_FILE_RET struUploadRet = new NET_DVR_UPLOAD_FILE_RET();
                    boolean bUploadResult = hKHCNetSDK.NET_DVR_GetUploadResult(iUploadHandle, struUploadRet.getPointer(), struUploadRet.size());
                    if (!bUploadResult) {
                        int iErr = hKHCNetSDK.NET_DVR_GetLastError();
                        log.info("NET_DVR_GetUploadResult失败,错误号:{}", iErr);
                        result.setCode(500);
                        result.setMsg("添加人脸失败:"+IotHkExceptionEnum.getMsg(iErr));
                    } else {
                        struUploadRet.read();
                        log.info("图片ID:{}", new String(struUploadRet.sUrl, StandardCharsets.UTF_8).trim());
                        result.setCode(200);
                        result.setMsg("添加人脸成功");
                    }
                    break;
                } else if (state == 2) {
//                    log.info("进度:{}", Pint.getValue());
                    continue;
                }
                log.info("返回值:{}", state);
                break;
            }

            //关闭图片上传连接
            boolean b_Close = hKHCNetSDK.NET_DVR_UploadClose(iUploadHandle);
            if (!b_Close) {
                int iErr = hKHCNetSDK.NET_DVR_GetLastError();
                log.info("关闭图片上传连接NET_DVR_UploadSend失败,错误号:{}", iErr);
                return;
            }
        } catch (Exception e) {
            result.setCode(500);
            result.setMsg("添加人脸失败,上传数据发生异常");
            log.error("添加人脸失败", e);
        }
    }


 /**
     * SDK透传ISAPI协议报文接口
     *
     * @param lUserID
     * @param url
     * @param inputXml 输入报文
     * @return
     */
    public static String sdkIsApi(int lUserID, String url, String inputXml) {
        String strOutXML = "";
        try {
            //输入参数
            NET_DVR_XML_CONFIG_INPUT struXMLInput = new NET_DVR_XML_CONFIG_INPUT();
            struXMLInput.read();
            struXMLInput.dwSize = struXMLInput.size();
            BYTE_ARRAY stringRequest = new BYTE_ARRAY(1024);
            stringRequest.read();
            //输入ISAPI协议命令   批量查询人脸库命令:GET /ISAPI/Intelligent/FDLib
            System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length());
            stringRequest.write();
            struXMLInput.lpRequestUrl = stringRequest.getPointer();
            struXMLInput.dwRequestUrlLen = url.length();

            //输入XML文本,GET命令不传输入文本
            int inputDataLen = inputXml.getBytes(StandardCharsets.UTF_8).length;

            if (inputDataLen > 0) {
                BYTE_ARRAY stringInBuffer = new BYTE_ARRAY(inputDataLen);
                stringInBuffer.read();
                System.arraycopy(inputXml.getBytes(StandardCharsets.UTF_8), 0, stringInBuffer.byValue, 0, inputDataLen);
                stringInBuffer.write();
                struXMLInput.lpInBuffer = stringInBuffer.getPointer();
                struXMLInput.dwInBufferSize = inputDataLen;
            } else {
                struXMLInput.lpInBuffer = null;
                struXMLInput.dwInBufferSize = 0;
            }

            struXMLInput.write();
            BYTE_ARRAY stringXMLOut = new BYTE_ARRAY(8 * 1024);
            stringXMLOut.read();
            BYTE_ARRAY struXMLStatus = new BYTE_ARRAY(1024);
            struXMLStatus.read();

            NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new NET_DVR_XML_CONFIG_OUTPUT();
            struXMLOutput.read();
            struXMLOutput.dwSize = struXMLOutput.size();
            struXMLOutput.lpOutBuffer = stringXMLOut.getPointer();
            struXMLOutput.dwOutBufferSize = stringXMLOut.size();
            struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer();
            struXMLOutput.dwStatusSize = struXMLStatus.size();
            struXMLOutput.write();

            if (!hKHCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)) {
                int iErr = hKHCNetSDK.NET_DVR_GetLastError();
                log.error("NET_DVR_STDXMLConfig失败,错误号:{},URL:{} ", iErr, url);
                return null;
            } else {
                stringXMLOut.read();
                log.info("输出文本大小:{}", struXMLOutput.dwReturnedXMLSize);
                //打印输出XML文本
                strOutXML = new String(stringXMLOut.byValue).trim();
                log.info(strOutXML);
                struXMLStatus.read();
                String strStatus = new String(struXMLStatus.byValue).trim();
                log.info(strStatus);
            }
        } catch (Exception e) {
            log.error("ISAPI接口异常:{}", e);
        }
        return strOutXML;
    }

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

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

相关文章

Arch - 架构安全性_授权(Authorization)

文章目录 OverView授权&#xff08;Authorization&#xff09;RBAC&#xff1a; 概述RBAC&#xff1a;基于角色的访问控制RBAC&#xff1a;主要元素 OAuth2&#xff1a;面向第三方应用的认证授权协议业务场景OAuth2的工作流程OAuth2 四种不同的授权方式授权码模式&#xff08;A…

Android Studio 2024最新版Hello World

Android Studio 2024最新版Hello World 1. Android Studio 2024安装视频2. 创建项目Read Timed out 问题Android Studio Build Output 控制台中文乱码问题 3. 驱动管理 本文章介绍如何通过Android Studio 2024最新版创建项目&#xff0c; 并成功输出Hello World。 本次教程版本…

关于QT中使用网络编程QtNetwork的问题

在此处添加network模块 在链接器中添加附加库目录(QT对应的lib)在链接器-输入中添加对应的lib库(Qt5Network.lib) 这样,就可以使用对应的下面的库文件了,比如: #include <qnetworkaccessmanager.h>

参数高效微调(PEFT)综述

人工智能咨询培训老师叶梓 转载标明出处 大模型如BERT和GPT-3的参数数量庞大&#xff0c;动辄数十亿甚至数千亿级别&#xff0c;给进一步的微调和应用带来了巨大的挑战。针对这一问题&#xff0c;Vladislav Lialin、Vijeta Deshpande、Anna Rumshisky等研究者中提出了一系列参…

Leetcode面试经典150题-69.X的平方根

相当简单的题目&#xff0c;但是出现的概率还挺高的 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int mySqrt(int x) {/**0的平方根是0 */if(x 0) {return 0;}/**1~3的平方根是1 */if(x < 3) {return 1;}/**其他情况我们采用二分查找&#xff…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…

Android Studio下载Gradle失败问题解决

问题说明 使用 Android Studio 构建程序报错如下 Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.5.1-bin.zip. Reason: java.net.SocketTimeoutException: Connect timed out问题解决 下载对应版本的压缩包 gradle-7.5.1…

香橙派转换模型以及在开发板上部署

新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程&#xff0c;防止后面忘记。 使用的开发板&#xff1a;Orange Pi 5 Plus&#xff08;rk3588&#xff09; 官方的一些资料在&#xff08;主要参考用户手册&#xff09;&#xff1a;Orange Pi - Orangepihttp:/…

价格适中超微小间距P1.8全彩LED显示屏广泛应用于COB会议一体机

随着科技的不断进步与市场需求的日益多样化&#xff0c;价格适中且具备超微小间距P1.8技术的全彩LED显示屏&#xff0c;在COB&#xff08;Chip On Board&#xff09;会议一体机领域的应用正逐步深化&#xff0c;引领着现代会议展示的新风尚。这种显示屏不仅以其细腻的画质和卓越…

单片机DMA原理及应用详解(下篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获&#xff01; 关于DMA的原理&#xff0c;可以看上一篇文章&#xff1a; 单片机DMA原理及应用详解&#xff08;上篇&#xff09;&#xff08;附工程源码&#xff09;-CSDN博客 目录 一、STM32单片…

黑龙江IBM Storwize v3700存储故障维修

中国黑龙江省佳木斯IBM Storwize v3700存储控制器故障维修案例&#xff1a; 报修单位&#xff1a;黑龙江佳木斯某某医院 存储型号&#xff1a;联想或IBM v3700 存储故障&#xff1a;无法正常访问存储磁盘&#xff0c;无法进存储web管理界面&#xff0c;可以进存储服务助手界…

《C++ 中的左值与右值》

在 C 的世界里&#xff0c;左值和右值是两个重要的概念&#xff0c;理解它们对于掌握 C 语言的精髓至关重要。 首先&#xff0c;我们来认识左值。左值&#xff0c;即 “locator value”&#xff0c;可以理解为有明确存储位置且可以被取地址的表达式。简单来说&#xff0c;一个可…

Linux之MySQL主从复制

概述 MySQL的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据复制解决方案&#xff0c;将主数据库的DDL&#xff08;数据定义语言&#xff09;和DML&#xff08;数据操纵语言&#xff09;操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这…

自动驾驶ADAS算法--使用MATLBA和UE4生成测试视频

原文参考&#xff1a;金书世界 环境搭建参考&#xff1a;用MATLAB2020b和虚拟引擎&#xff08;Unreal Engine&#xff09;联合仿真输出AVM全景测试视频----Matlab环境搭建 matlab参考&#xff1a; https://ww2.mathworks.cn/help/driving/ug/simulate-a-simple-driving-sce…

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一&#xff1a;CS…

CAS概念、性质、优缺点 | 乐观锁、悲观锁是什么?

前言&#xff1a; 今天在深入了解HashMap时&#xff0c;看到这句话&#xff1a;“concurrentHashMap&#xff0c;在 JDK 1.7 中采用 分段锁的方式&#xff1b;JDK 1.8 中直接采用了CAS&#xff08;无锁算法&#xff09; synchronized。” 哦~~这个CAS好像之前接触过&#xff0c…

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

2024年测评7款最佳AI论文修改润色平台

在2024年&#xff0c;AI论文修改润色平台的测评和推荐成为学术界和研究者们关注的热点。本文将详细评测并推荐7款最佳AI论文修改润色平台&#xff0c;包括千笔-AIPassPaper&#xff0c;并结合我搜索到的资料进行分析。 一、千笔-AIPassPaper 千笔-AIPassPaper是一款集论文大纲…

芯旺微,车规级32位MCU KF32A芯片简介

文章目录 1. 产品功能特点2. 行业应用3. 开发环境(IDE)4. 开发资源5. KungFu 内核参考1. 产品功能特点 2. 行业应用 汽车照明汽车车窗控制汽车空调面板汽车控制器3. 开发环境(IDE)

营养方案调整执行流程 第十篇

追踪调整方案 疾病诊断≠营养诊断 出健康管理建议应考虑地域习惯等特点&#xff0c;因人而异