海康DVR设备SDK开发记录 2020-04-02 记录 暂无评论 1533 次阅读 ### FAQ 1. `NET_DVR_StartRemoteConfig`中的pUserData(用户数据)参数怎么设置 用户数据是输入参数,没有特殊必要,无需设置,用`null`代替 ![image-20200402093434256](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100611.png) --- 2. `NET_DVR_StartRemoteConfig`回调函数怎么用? 该方法回调函数的设置是`cbStateCallback`传入,用与下发消息到设备后,设备返回结果所调用的方法。回调函数一般包含4个参数。 > [out]:表示设备传出的内容值 > > [in]:表示传入到设备的值 ![image-20200402093949538](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100608.png) 以java为例: ```java /** * 远程配置回调函数接口 */ public static interface FRemoteConfigCallback extends Callback { public void invoke(int dwType, Pointer lpBuffer, int dwBufLen, Pointer pUserData); } // 实现回调函数 public class CardRemoteConfigCallback implements FRemoteConfigCallback { @Override public void invoke(int dwType, Pointer lpBuffer, int dwBufLen, Pointer pUserData) { } } ``` > 这里需要注意的是,布防的回调函数全局设置(new)一个,如果设置多个会被重复调用。 --- 3. `NET_DVR_StartRemoteConfig`回调函数的`dwType`怎么用? 回调函数中的dwType与下发的业务有关系,不同的下发业务,有不同的回调状态`dwType`,以下发和获取人员信息为例。 ![image-20200402095632562](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100604.png) ![image-20200402095854270](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100600.png) 根据不一样的dwType会返回不一样的内容。 ```java # java @Data @Slf4j public class CardRemoteConfigCallback implements HCNetSDK.FRemoteConfigCallback { private AtomicInteger uploadStatus = new AtomicInteger(0); // 0-准备下发; 1-下发成功 @Override public void invoke(int dwType, Pointer lpBuffer, int dwBufLen, Pointer pUserData) { log.info("卡片回调----------------------"); log.info("dwType:" + dwType); byte[] dwStatus = new byte[4]; lpBuffer.read(0, dwStatus, 0, 4); int iStatus = 0; for (int i = 0; i < 4; i++) { int ioffset = i * 8; int iByte = dwStatus[i] & 0xff; iStatus = iStatus + (iByte << ioffset); } log.info("状态值:"+ iStatus); if (iStatus == 1000) { uploadStatus.set(RemoteSetCardThread.UPLOAD_FACE_SUCCESS); } } } ``` --- 4. `NET_DVR_SendRemoteConfig`函数参数设置 开始下发操作 - lHandle:也就是在`NET_DVR_StartRemoteConfig`开启下发操作时返回的句柄 - dwDataType:准备下发的操作类型,例如:0x3,表示下发卡片操作 - *pSendBuf:也就是下发的内容,以指针的形式传入到sdk中,例如:0x3传入的结构是`NET_DVR_CARD_CFG_V50` - dwBufSize:*pSendBuf的大小 ![image-20200402100332658](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100555.png) ![image-20200402100725353](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402102208.png)![image-20200402100942782](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402100945.png) ```java /** * 卡参数配置结构体 */ public class NET_DVR_CARD_CFG_V50 extends Structure { public int dwSize; public int dwModifyParamType;//需要修改的卡参数,设置卡参数时有效,按位表示,每位代表一种参数,1为需要修改,0为不修改 public byte[] byCardNo = new byte[ACS_CARD_NO_LEN]; //卡号 public byte byCardValid = 1; //卡是否有效,0-无效,1-有效(用于删除卡,设置时置为0进行删除,获取时此字段始终为1) public byte byCardType = 1; //卡类型,1-普通卡,2-残疾人卡,3-黑名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,9-员工卡,10-应急卡,11-应急管理卡,默认普通卡 public byte byLeaderCard = 1; //是否为首卡,1-是,0-否 public byte byUserType = 0; // 用户类型 0 普通用户 1 管理员 public byte[] byDoorRight = new byte[MAX_DOOR_NUM_256]; //门权限(楼层权限),按位表示,1为有权限,0为无权限,从低位到高位表示对门1-N是否有权限 public NET_DVR_VALID_PERIOD_CFG struValid = new NET_DVR_VALID_PERIOD_CFG(); //有效期参数 public byte[] byBelongGroup = new byte[MAX_GROUP_NUM_128]; //所属群组,按字节表示,1-属于,0-不属于 public byte[] byCardPassword = new byte[CARD_PASSWORD_LEN]; //卡密码 public CARDRIGHTPLAN_WORD[] wCardRightPlan = new CARDRIGHTPLAN_WORD[MAX_DOOR_NUM_256]; //卡权限计划,取值为计划模板编号,同个门不同计划模板采用权限或的方式处理 public int dwMaxSwipeTime = 0; //最大刷卡次数,0为无次数限制(开锁次数) public int dwSwipeTime; //已刷卡次数 public short wRoomNumber; //房间号 public short wFloorNumber; //层号 public int dwEmployeeNo; //工号 public byte[] byName = new byte[NAME_LEN]; //姓名 public short wDepartmentNo; //部门编号 public short wSchedulePlanNo; //排班计划编号 public byte bySchedulePlanType; //排班计划类型:0-无意义、1-个人、2-部门 public byte byRightType; //下发权限类型:0-普通发卡权限、1-二维码权限、2-蓝牙权限(可视对讲设备二维码权限配置项:房间号、卡号(虚拟卡号)、最大刷卡次数(开锁次数)、有效期参数;蓝牙权限:卡号(萤石APP账号)、其他参数配置与普通发卡权限一致) public byte[] byRes2 = new byte[2]; public int dwLockID; //锁ID public byte[] byLockCode = new byte[MAX_LOCK_CODE_LEN]; //锁代码 public byte[] byRoomCode = new byte[MAX_DOOR_CODE_LEN]; //房间代码 public int dwCardRight; //卡权限 public int dwPlanTemplate; //计划模板(每天)各时间段是否启用,按位表示,0--不启用,1-启用 public int dwCardUserId; //持卡人ID public byte byCardModelType; //0-空,1- MIFARE S50,2- MIFARE S70,3- FM1208 CPU卡,4- FM1216 CPU卡,5-国密CPU卡,6-身份证,7- NFC public byte[] byRes3 = new byte[83]; } ``` 流程: ![NET_DVR](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/worker/20200402102024.png) 打赏: 微信, 支付宝 标签: java, 海康 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。