• 大华门禁SDK二次开发(一)-技术沟通


    项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#。门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决。做这个开发的时候,发现网上的资料比较少,想着把自己遇到的问题整理下来,让有需要的人尽量少走一些弯路。

    1. 门禁状态查询/控制API

    • 门禁控制API
    BOOL CLIENT_ControlDevice(
      LLONG                                   lLoginID ,
      CtrlType                                type ,
      void                                    *param ,
      int                                     waittime = 1000
    );
    
    • 门禁查询API
    BOOL CLIENT_QueryDevState(
      LLONG  lLoginID,
      int    nType,
      char   *pBuf,
      int    nBufLen,
      int    *pRetLen,
      int    waittime=1000 
    );
    
    
    nType `NET_DOOR_STATUS_INFO`
    
    
    //门禁状态信息
    struct NET_DOOR_STATUS_INFO{
    DWORD                         dwSize;
    int                           nChannel;
    EM_NET_DOOR_STATUS_TYPE       emStateType;
    };
    
    
    //门禁状态类型
    typedef enum __EM_NET_DOOR_STATUS_TYPE{ 
      EM_NET_DOOR_STATUS_UNKNOWN,                  
      EM_NET_DOOR_STATUS_OPEN,                     // 打开
      EM_NET_DOOR_STATUS_CLOSE,                    // 关闭
      EM_NET_DOOR_STATUS_BREAK,                    // 门异常打开};
    

    2. 邮件列表

    2.1 基于官网SDK开发

    从大华官网下载SDK开发包,找到上面的两个接口后,就开始操刀基于官方C# demo开发。设备登陆代码是官方demo提供的,但是门禁设备状态查询总是返回false。跟大华技术支持联系后,提供了新的门禁开发demo。

    发件人: DK
    发送时间: 2017年9月27日 9:51
    收件人: 大华SDK支持
    主题: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
     
    
    大华大神你好,
    
    我是项目名称平台开发人员,在进行门禁调试时遇到下面的问题,烦请帮忙诊断一下:
    
    1、C#引入接口
    
    [DllImport("dhnetsdk.dll")]
    public static extern bool CLIENT_QueryDevState(IntPtr lLoginID,int nType,IntPtr pBuf,int nBufLen,ref int pRetLen,int waittime);
    
    2、C#调用
    
    public static bool QueryDevState(IntPtr lLoginID,ref NET_DOOR_STATUS_INFO statusInfo)
            {
                var pRetLen = 0;
                var nBufLen = Marshal.SizeOf(typeof(NET_DOOR_STATUS_INFO));
    
                IntPtr pBuf = IntPtr.Zero;
                pBuf = Marshal.AllocHGlobal(nBufLen);
                Marshal.StructureToPtr(statusInfo, pBuf, true);
    
                var result = OriginalSDK.CLIENT_QueryDevState(lLoginID, 0x0159, pBuf, nBufLen, ref pRetLen,1000);
                NetGetLastError(result);
                return result;
            }
    
    3、调用结果:
    
    result = false
    
    error是一个不存在的错误编码,一个很大的负数
    
     
    
    **科技集团股份有限公司
    
                我打农村来
    
          187********
    
           2017-09-27
    
    ============================================================================================       
           
    发件人: 大华SDK支持
    
    发送时间: 2017年9月27日(星期三) 上午10:12
    
    收件人: DK
    
    主题: 答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
     
    
    请参照附件Demo进行门禁开发、封装引用。
    
    有问题反馈
    
    设备上下文环境:设备型号、固件版本
    
    问题描述:截图、操作步骤
    
     
    
    我们再分析下。
    

    附件Demo

    2.2 基于新的门禁demo

    这次跟上次出现的问题差不多,也是登陆正常,但是状态查询异常,这次又提供了新的门禁开发demo。

    发件人: DK
    发送时间: 2017年9月27日 15:11
    收件人: 大华SDK支持
    主题: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
     
    
         
    
          你好,下午调试了一下,有问题,详细错误见附件,你帮忙看一下。
    
    十分感谢。
    
     
    
    ------------------
    
    **科技集团股份有限公司
    
                我打农村来
    
          187********
    
           2017-09-27
           
    ============================================================================================ 
    
    发件人:大华SDK支持
    
    发送时间:2017年9月27日(星期三) 3:14
    
    收件人:DK
    
    主题:答复: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    设备型号、版本信息再补充提供下。
    
    ============================================================================================ 
    
    发件人:DK
    
    发送时间:2017年9月27日(星期三) 3:20
    
    收件人:大华SDK支持
    
    主题:回复:答复: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败 
    
    设备型号:DH-ASC1204B
     
    软件版本参考附件 
    
    ============================================================================================ 
    
    发件人: 大华SDK支持
    
    发送时间: 2017年9月27日(星期三) 下午4:13
    
    收件人: DK
    
    主题: 转发: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
     
    
    附件是门禁C# Demo,供参阅。
    
    1卡操作
    
    2查询记录
    
    3监听事件、指纹抓取
    
     
    
    看是否覆盖业务,是否够用?       
    
    

    调试问题文档

    调试问题代码

    门禁C# Demo

    设备型号.png

    2.3 针对版本的门禁demo

    这次有进步,之前门禁状态查询一直返回的是无效的错误码,这次找到了有效的错误码-1。起初以为是Rec NO的问题,后来经电话沟通,确认是没有复制大华的门禁相关dll到调试输出目录下(debug)。把测试demo输出目录的所有dll拷贝到自己的调试输出目录后,功能就正常了。

    发件人:DK
    
    发送时间:2017年9月28日(星期四) 2:40
    
    收件人:大华SDK支持
    
    主题:回复:转发: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    你好,我今天试了下昨天发给我的demo:
    1、登陆正常;
    2、点击get按钮,执行设备查询操作时,返回错误代码-1(未知错误)
     
        操作顺序:点击get按钮-》弹出弹出1(参见附件get按钮弹出1)-》未填写任何信息,点击ok-》弹出错误信息(参见报错信息2)
           
    ============================================================================================ 
    
    发件人:大华SDK支持
    
    时   间:2017年9月28日(星期四) 3:06
    
    收件人:DK
    
    主题:项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    这是查询门禁卡的,要输入Rec NO才行。
    
    ============================================================================================ 
    
    发件人: DK
    发送时间: 2017年9月28日 15:42
    收件人: 大华SDK支持
    主题: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    你好,请问门禁卡的Rec NO如何获取?
    
    ============================================================================================ 
    
    发件人:大华SDK支持
    
    时   间:2017年9月28日(星期四) 3:49
    
    收件人:DK
    
    主题:答复: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    请注意接听电话,我们打了两遍您这边都没接
    
    我打农村来187********
    
    ============================================================================================ 
    
    发件人:DK
    
    时   间:2017年9月28日(星期四) 4:52
    
    收件人:大华SDK支持
    
    主题:回复:答复: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
     
    你好,十分感谢,在您的指导下,已经调试完毕。
    
    

    get按钮弹窗1.png

    报错信息2.png

    2.4 门禁控制结构体

    这是个小问题,就是在开发门禁控制功能时,一个结构体找不到,原因是两种语言下的命名方式不一致造成的。

    发件人: DK
    发送时间: 2017年9月29日 11:13
    收件人: 大华SDK支持
    主题: 回复:答复: 回复:答复: 项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败
    
    你好,
    
    我在做门禁事件监听时,查不到NET_ALARM_ACCESS_LOCK_STATUS_INFO这个结构体的构造,麻烦提供一下。
    
    ============================================================================================ 
    
    发件人:大华SDK支持
    
    时   间:2017年9月29日(星期五) 11:26
    
    收件人:DK
    
    主题:项目名称-netsdk门禁-CLIENT_QueryDevState接口C#调用失败 
    
    C#命名规则都以NET开头,和C++的可能不一致
    
    去掉头就能搜到了ALARM_ACCESS_LOCK_STATUS_INFO
    

    2.5 门禁常开、常关

    这个功能是后来发现的,现场的一些门是常开的,但是我在大华自己的门禁web系统里看不到这种常开的状态、包括我开发的门禁服务程序里也区分不出来常开的情况。但是DH-ACS 100桌面软件里可以看到门是否常开,因此就想着肯定是有获取门是否常开的接口。查询文档和跟技术支持沟通,只得到了这个设置常开的接口。目前门是否处于常开状态的信号获取未实现。

    发件人:DK
    发送时间: 2018年4月25日 10:28
    收件人: 大华SDK支持
    主题: 项目名称-netsdk门禁
    
     
    
    你好,
    
     
    
          在现场发现了门有常开的状态,想请问下如何查询、控制门禁的常开、常闭状态。
          
    ============================================================================================ 
    
      
    发件人:大华SDK支持  
    时   间:2018年4月25日(星期三) 5:16
    收件人:DK
    主题:答复: 项目名称-netsdk门禁
    
    你好!
    
     
    
    编译运行附件demo,可以获取设置门禁常开常闭状态。
    
    

    附件demo

    门禁常开常关.jpg

    3. 调试问题

    2.1 CLR20R3异常

    门禁服务程序调试完毕后,本地加入CLR连接、配置、类库,并提升.NET版本后,在服务器上运行直接崩溃。且无法进入调试断点,直接运行则报CLR20R3错误,无从入手。

    经查,CLR20R3最好的解决办法是查看window日志。

    最终解决办法,修改程序编译版本为x86解决问题
    参考地址)。

    2.2. BEX64异常

    调整编译版本为x86,解决问题。

    参考地址

    2.3. 找不到dll

    拷贝大华SDk文件夹下的库文件到Release或者debug目录下即可。

    3.4. 门开关机制

    门禁控制逻辑是这样的:收到开门命令后,触发门锁开门(发出开发消息)并等待2-3秒,然后门会自动锁上(发出关门消息)。我理解常开有两种情况:

    • 强制常开:门打开后,一直阻挡门自动锁上;
    • 设置常开:设置常开模式,门锁打开后,不在自动锁上。
  • 相关阅读:
    c++的const总结
    http框架--Forest 的使用
    SQL 语句大全
    Mysql 总结
    【Spring注解驱动开发】使用@Scope注解设置组件的作用域
    注册中心EUREKA(二)--配置列表
    Linux命令发送Http GET/POST请求
    真正理解NIO
    高并发下接口幂等性解决方案
    代码量统计工具
  • 原文地址:https://www.cnblogs.com/zhangdk/p/doorcontrol.html
Copyright © 2020-2023  润新知