Merge branch 'master' of http://47.109.37.87:3000/by2025/SmartParks
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m21s
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m21s
This commit is contained in:
@@ -9,6 +9,7 @@ public interface RemoteHikSdkService {
|
||||
|
||||
/**
|
||||
* 海康sdk 登录操作
|
||||
*
|
||||
* @param item 登录参数
|
||||
* @return 是否登录成功
|
||||
*/
|
||||
@@ -16,6 +17,7 @@ public interface RemoteHikSdkService {
|
||||
|
||||
/**
|
||||
* 获取nvr设备通道信息
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
* @return 返回通道信息
|
||||
*/
|
||||
|
@@ -0,0 +1,116 @@
|
||||
package org.dromara.property.controller.smartDevicesController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbLightInfoBo;
|
||||
import org.dromara.property.service.smartDevicesService.ITbLightInfoService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 灯控开关信息
|
||||
* 前端访问路由地址为:/property/lightInfo
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/lightInfo")
|
||||
public class TbLightInfoController extends BaseController {
|
||||
|
||||
private final ITbLightInfoService tbLightInfoService;
|
||||
|
||||
/**
|
||||
* 查询灯控开关信息列表
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<TbLightInfoVo> list(TbLightInfoBo bo, PageQuery pageQuery) {
|
||||
return tbLightInfoService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出灯控开关信息列表
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:export")
|
||||
@Log(title = "灯控开关信息", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(TbLightInfoBo bo, HttpServletResponse response) {
|
||||
List<TbLightInfoVo> list = tbLightInfoService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "灯控开关信息", TbLightInfoVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取灯控开关信息详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<TbLightInfoVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable("id") Long id) {
|
||||
return R.ok(tbLightInfoService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增灯控开关信息
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:add")
|
||||
@Log(title = "灯控开关信息", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody TbLightInfoBo bo) {
|
||||
return toAjax(tbLightInfoService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改灯控开关信息
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:edit")
|
||||
@Log(title = "灯控开关信息", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TbLightInfoBo bo) {
|
||||
return toAjax(tbLightInfoService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除灯控开关信息
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("property:lightInfo:remove")
|
||||
@Log(title = "灯控开关信息", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable("ids") Long[] ids) {
|
||||
return toAjax(tbLightInfoService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* 灯开关控制
|
||||
*
|
||||
* @param bo bean
|
||||
*/
|
||||
@PostMapping("/switch")
|
||||
public R<Void> switchSingleLight(@RequestBody TbLightInfoBo bo) {
|
||||
return toAjax(tbLightInfoService.switchSingleLight(bo));
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.controller;
|
||||
package org.dromara.property.controller.smartDevicesController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.bo.TbMeterConfigBo;
|
||||
import org.dromara.property.service.ITbMeterConfigService;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterConfigBo;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterConfigService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.controller;
|
||||
package org.dromara.property.controller.smartDevicesController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.bo.TbMeterInfoBo;
|
||||
import org.dromara.property.service.ITbMeterInfoService;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterInfoService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.controller;
|
||||
package org.dromara.property.controller.smartDevicesController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.bo.TbMeterRecordBo;
|
||||
import org.dromara.property.service.ITbMeterRecordService;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRecordBo;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterRecordService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.controller;
|
||||
package org.dromara.property.controller.smartDevicesController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,9 +17,9 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.bo.TbMeterRoomBo;
|
||||
import org.dromara.property.service.ITbMeterRoomService;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRoomBo;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterRoomService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
@@ -0,0 +1,66 @@
|
||||
package org.dromara.property.domain;
|
||||
|
||||
import org.dromara.common.tenant.core.TenantEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
/**
|
||||
* 灯控开关信息对象 tb_light_info
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("tb_light_info")
|
||||
public class TbLightInfo extends TenantEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 位置描述
|
||||
*/
|
||||
private String locationRemark;
|
||||
|
||||
/**
|
||||
* 开关状态(0:关,1:开)
|
||||
*/
|
||||
private Boolean isOn;
|
||||
|
||||
/**
|
||||
* 灯控模块编码
|
||||
*/
|
||||
private Long code;
|
||||
|
||||
/**
|
||||
* 园区编码
|
||||
*/
|
||||
private Long communityId;
|
||||
|
||||
/**
|
||||
* 建筑名称
|
||||
*/
|
||||
private Long buildingId;
|
||||
|
||||
/**
|
||||
* 单元编码
|
||||
*/
|
||||
private Long unitId;
|
||||
|
||||
/**
|
||||
* 所属楼层ID
|
||||
*/
|
||||
private Long floorId;
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,68 @@
|
||||
package org.dromara.property.domain.bo.smartDevicesBo;
|
||||
|
||||
import org.dromara.property.domain.TbLightInfo;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
|
||||
/**
|
||||
* 灯控开关信息业务对象 tb_light_info
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = TbLightInfo.class, reverseConvertGenerate = false)
|
||||
public class TbLightInfoBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
@NotNull(message = "主键id不能为空", groups = {EditGroup.class})
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 位置描述
|
||||
*/
|
||||
@NotBlank(message = "位置描述不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String locationRemark;
|
||||
|
||||
/**
|
||||
* 开关状态(0:关,1:开)
|
||||
*/
|
||||
@NotNull(message = "开关状态(0:关,1:开)不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private Boolean isOn;
|
||||
|
||||
/**
|
||||
* 灯控模块编码
|
||||
*/
|
||||
@NotNull(message = "灯控模块编码不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private Long code;
|
||||
|
||||
/**
|
||||
* 楼层ID
|
||||
*/
|
||||
@NotNull(message = "层ID不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private Long floorId;
|
||||
|
||||
/**
|
||||
* 园区编码
|
||||
*/
|
||||
private Long communityId;
|
||||
|
||||
/**
|
||||
* 建筑名称
|
||||
*/
|
||||
private Long buildingId;
|
||||
|
||||
/**
|
||||
* 单元编码
|
||||
*/
|
||||
private Long unitId;
|
||||
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.bo;
|
||||
package org.dromara.property.domain.bo.smartDevicesBo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterConfig;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.bo;
|
||||
package org.dromara.property.domain.bo.smartDevicesBo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterInfo;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.bo;
|
||||
package org.dromara.property.domain.bo.smartDevicesBo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRecord;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
@@ -9,7 +9,6 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 抄记录业务对象 tb_meter_record
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.bo;
|
||||
package org.dromara.property.domain.bo.smartDevicesBo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRoom;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
@@ -0,0 +1,41 @@
|
||||
package org.dromara.property.domain.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @Author:yuyongle
|
||||
* @Date:2025/7/4 10:35
|
||||
* @Description:活动状态枚举
|
||||
**/
|
||||
@Getter
|
||||
public enum ActivitiesStatusEnum {
|
||||
/**
|
||||
* 未开始
|
||||
*/
|
||||
NOTSTARTED("未开始", "1"),
|
||||
/**
|
||||
* 待提货
|
||||
*/
|
||||
INPROGRESS("待提货", "2"),
|
||||
/**
|
||||
* 已结束
|
||||
*/
|
||||
HASENDED("已结束", "3");
|
||||
|
||||
|
||||
private final String name;
|
||||
private final String value;
|
||||
|
||||
ActivitiesStatusEnum(String name, String value) {
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return this.value;
|
||||
}
|
||||
}
|
@@ -0,0 +1,87 @@
|
||||
package org.dromara.property.domain.vo.smartDevicesVo;
|
||||
|
||||
import org.dromara.property.domain.TbLightInfo;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import cn.idev.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 灯控开关信息视图对象 tb_light_info
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = TbLightInfo.class)
|
||||
public class TbLightInfoVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
@ExcelProperty(value = "主键id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 位置描述
|
||||
*/
|
||||
@ExcelProperty(value = "位置描述")
|
||||
private String locationRemark;
|
||||
|
||||
/**
|
||||
* 开关状态(0:关,1:开)
|
||||
*/
|
||||
@ExcelProperty(value = "开关状态", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "0=:关,1:开")
|
||||
private Boolean isOn;
|
||||
|
||||
/**
|
||||
* 灯控模块编码
|
||||
*/
|
||||
@ExcelProperty(value = "灯控模块编码")
|
||||
private Long code;
|
||||
|
||||
/**
|
||||
* 园区编码
|
||||
*/
|
||||
@ExcelProperty(value = "园区编码")
|
||||
private Long communityId;
|
||||
|
||||
/**
|
||||
* 建筑名称
|
||||
*/
|
||||
@ExcelProperty(value = "建筑名称")
|
||||
private Long buildingId;
|
||||
|
||||
/**
|
||||
* 单元编码
|
||||
*/
|
||||
@ExcelProperty(value = "单元编码")
|
||||
private Long unitId;
|
||||
|
||||
/**
|
||||
* 楼层ID
|
||||
*/
|
||||
@ExcelProperty(value = "楼层ID")
|
||||
private Long floorId;
|
||||
|
||||
/**
|
||||
* 楼层
|
||||
*/
|
||||
@ExcelProperty(value = "楼层")
|
||||
private String floorName;
|
||||
|
||||
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
package org.dromara.property.domain.vo.smartDevicesVo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterConfig;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
package org.dromara.property.domain.vo.smartDevicesVo;
|
||||
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
@@ -1,19 +1,15 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
package org.dromara.property.domain.vo.smartDevicesVo;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRecord;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import cn.idev.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
package org.dromara.property.domain.vo.smartDevicesVo;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRoom;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
@@ -0,0 +1,17 @@
|
||||
package org.dromara.property.mapper.smartDevicesMapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.dromara.property.domain.TbLightInfo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 灯控开关信息Mapper接口
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Mapper
|
||||
public interface TbLightInfoMapper extends BaseMapperPlus<TbLightInfo, TbLightInfoVo> {
|
||||
|
||||
}
|
@@ -1,8 +1,8 @@
|
||||
package org.dromara.property.mapper;
|
||||
package org.dromara.property.mapper.smartDevicesMapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.dromara.property.domain.TbMeterConfig;
|
||||
import org.dromara.property.domain.vo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
@@ -1,7 +1,7 @@
|
||||
package org.dromara.property.mapper;
|
||||
package org.dromara.property.mapper.smartDevicesMapper;
|
||||
|
||||
import org.dromara.property.domain.TbMeterInfo;
|
||||
import org.dromara.property.domain.vo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
@@ -1,7 +1,7 @@
|
||||
package org.dromara.property.mapper;
|
||||
package org.dromara.property.mapper.smartDevicesMapper;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRecord;
|
||||
import org.dromara.property.domain.vo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
@@ -1,8 +1,8 @@
|
||||
package org.dromara.property.mapper;
|
||||
package org.dromara.property.mapper.smartDevicesMapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.dromara.property.domain.TbMeterRoom;
|
||||
import org.dromara.property.domain.vo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.property.domain.enums.ActivitiesStatusEnum;
|
||||
import org.dromara.property.domain.vo.CustomerNoticesVo;
|
||||
import org.dromara.system.api.RemoteUserService;
|
||||
import org.dromara.system.api.domain.vo.RemoteUserVo;
|
||||
@@ -21,11 +22,9 @@ import org.dromara.property.domain.vo.PopularActivitiesVo;
|
||||
import org.dromara.property.domain.PopularActivities;
|
||||
import org.dromara.property.mapper.PopularActivitiesMapper;
|
||||
import org.dromara.property.service.IPopularActivitiesService;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
import java.util.*;
|
||||
import java.util.logging.Handler;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -130,6 +129,7 @@ public class PopularActivitiesServiceImpl implements IPopularActivitiesService {
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean insertByBo(PopularActivitiesBo bo) {
|
||||
PopularActivities add = MapstructUtils.convert(bo, PopularActivities.class);
|
||||
validEntityBeforeSave(add);
|
||||
@@ -147,9 +147,10 @@ public class PopularActivitiesServiceImpl implements IPopularActivitiesService {
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean updateByBo(PopularActivitiesBo bo) {
|
||||
PopularActivities update = MapstructUtils.convert(bo, PopularActivities.class);
|
||||
validEntityBeforeSave(update);
|
||||
validEntityBeforeUpdate(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
@@ -157,6 +158,18 @@ public class PopularActivitiesServiceImpl implements IPopularActivitiesService {
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(PopularActivities entity) {
|
||||
//TODO拿当前时间和开始时间和结束时间做对比修改状态
|
||||
Date now = new Date();
|
||||
entity.setStatus(
|
||||
now.before(entity.getStartTime()) ? ActivitiesStatusEnum.NOTSTARTED.getValue() :
|
||||
now.after(entity.getEndTime()) ? ActivitiesStatusEnum.HASENDED.getValue() : ActivitiesStatusEnum.INPROGRESS.getValue()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeUpdate(PopularActivities entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,160 @@
|
||||
package org.dromara.property.service.impl.smartDevicesImpl;
|
||||
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.property.domain.vo.TbFloorVo;
|
||||
import org.dromara.property.service.ITbFloorService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbLightInfoBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
|
||||
import org.dromara.property.domain.TbLightInfo;
|
||||
import org.dromara.property.mapper.smartDevicesMapper.TbLightInfoMapper;
|
||||
import org.dromara.property.service.smartDevicesService.ITbLightInfoService;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 灯控开关信息Service业务层处理
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class TbLightInfoServiceImpl implements ITbLightInfoService {
|
||||
|
||||
private final TbLightInfoMapper baseMapper;
|
||||
private final ITbFloorService floorService;
|
||||
|
||||
/**
|
||||
* 查询灯控开关信息
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 灯控开关信息
|
||||
*/
|
||||
@Override
|
||||
public TbLightInfoVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询灯控开关信息列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 灯控开关信息分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<TbLightInfoVo> queryPageList(TbLightInfoBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<TbLightInfo> lqw = buildQueryWrapper(bo);
|
||||
Page<TbLightInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
result.getRecords().forEach(r -> r.setFloorName(floorService.queryById(r.getFloorId()).getFloorName()));
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的灯控开关信息列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 灯控开关信息列表
|
||||
*/
|
||||
@Override
|
||||
public List<TbLightInfoVo> queryList(TbLightInfoBo bo) {
|
||||
LambdaQueryWrapper<TbLightInfo> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<TbLightInfo> buildQueryWrapper(TbLightInfoBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<TbLightInfo> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByAsc(TbLightInfo::getId);
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getLocationRemark()), TbLightInfo::getLocationRemark, bo.getLocationRemark());
|
||||
lqw.eq(bo.getIsOn() != null, TbLightInfo::getIsOn, bo.getIsOn());
|
||||
lqw.eq(bo.getCode() != null, TbLightInfo::getCode, bo.getCode());
|
||||
lqw.eq(bo.getCommunityId() != null, TbLightInfo::getCommunityId, bo.getCommunityId());
|
||||
lqw.eq(bo.getBuildingId() != null, TbLightInfo::getBuildingId, bo.getBuildingId());
|
||||
lqw.eq(bo.getUnitId() != null, TbLightInfo::getUnitId, bo.getUnitId());
|
||||
lqw.eq(bo.getFloorId() != null, TbLightInfo::getFloorId, bo.getFloorId());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增灯控开关信息
|
||||
*
|
||||
* @param bo 灯控开关信息
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean insertByBo(TbLightInfoBo bo) {
|
||||
TbLightInfo add = MapstructUtils.convert(bo, TbLightInfo.class);
|
||||
assert add != null;
|
||||
TbFloorVo floor = floorService.queryById(add.getFloorId());
|
||||
add.setBuildingId(floor.getBuildingId());
|
||||
add.setCommunityId(floor.getCommunityId());
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
Assert.isTrue(flag, "新增灯控开关信息失败");
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改灯控开关信息
|
||||
*
|
||||
* @param bo 灯控开关信息
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(TbLightInfoBo bo) {
|
||||
TbLightInfo update = MapstructUtils.convert(bo, TbLightInfo.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(TbLightInfo entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除灯控开关信息信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单个灯开关控制
|
||||
*
|
||||
* @param bo bean
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean switchSingleLight(TbLightInfoBo bo){
|
||||
TbLightInfo update = MapstructUtils.convert(bo, TbLightInfo.class);
|
||||
boolean flag = baseMapper.updateById(update) > 0;
|
||||
Assert.isTrue(flag, "修改灯开关失败");
|
||||
return flag;
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.service.impl;
|
||||
package org.dromara.property.service.impl.smartDevicesImpl;
|
||||
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
@@ -9,11 +9,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.TbMeterConfigBo;
|
||||
import org.dromara.property.domain.vo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterConfigBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.TbMeterConfig;
|
||||
import org.dromara.property.mapper.TbMeterConfigMapper;
|
||||
import org.dromara.property.service.ITbMeterConfigService;
|
||||
import org.dromara.property.mapper.smartDevicesMapper.TbMeterConfigMapper;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterConfigService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.service.impl;
|
||||
package org.dromara.property.service.impl.smartDevicesImpl;
|
||||
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
@@ -10,11 +10,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.TbMeterInfoBo;
|
||||
import org.dromara.property.domain.vo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.TbMeterInfo;
|
||||
import org.dromara.property.mapper.TbMeterInfoMapper;
|
||||
import org.dromara.property.service.ITbMeterInfoService;
|
||||
import org.dromara.property.mapper.smartDevicesMapper.TbMeterInfoMapper;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterInfoService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.service.impl;
|
||||
package org.dromara.property.service.impl.smartDevicesImpl;
|
||||
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
@@ -10,11 +10,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.TbMeterRecordBo;
|
||||
import org.dromara.property.domain.vo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRecordBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.TbMeterRecord;
|
||||
import org.dromara.property.mapper.TbMeterRecordMapper;
|
||||
import org.dromara.property.service.ITbMeterRecordService;
|
||||
import org.dromara.property.mapper.smartDevicesMapper.TbMeterRecordMapper;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterRecordService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@@ -1,4 +1,4 @@
|
||||
package org.dromara.property.service.impl;
|
||||
package org.dromara.property.service.impl.smartDevicesImpl;
|
||||
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
@@ -9,11 +9,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.TbMeterRoomBo;
|
||||
import org.dromara.property.domain.vo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRoomBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.TbMeterRoom;
|
||||
import org.dromara.property.mapper.TbMeterRoomMapper;
|
||||
import org.dromara.property.service.ITbMeterRoomService;
|
||||
import org.dromara.property.mapper.smartDevicesMapper.TbMeterRoomMapper;
|
||||
import org.dromara.property.service.smartDevicesService.ITbMeterRoomService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@@ -0,0 +1,75 @@
|
||||
package org.dromara.property.service.smartDevicesService;
|
||||
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbLightInfoVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbLightInfoBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 灯控开关信息Service接口
|
||||
*
|
||||
* @author lsm
|
||||
* @since 2025-08-19
|
||||
*/
|
||||
public interface ITbLightInfoService {
|
||||
|
||||
/**
|
||||
* 查询灯控开关信息
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 灯控开关信息
|
||||
*/
|
||||
TbLightInfoVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询灯控开关信息列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 灯控开关信息分页列表
|
||||
*/
|
||||
TableDataInfo<TbLightInfoVo> queryPageList(TbLightInfoBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的灯控开关信息列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 灯控开关信息列表
|
||||
*/
|
||||
List<TbLightInfoVo> queryList(TbLightInfoBo bo);
|
||||
|
||||
/**
|
||||
* 新增灯控开关信息
|
||||
*
|
||||
* @param bo 灯控开关信息
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(TbLightInfoBo bo);
|
||||
|
||||
/**
|
||||
* 修改灯控开关信息
|
||||
*
|
||||
* @param bo 灯控开关信息
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(TbLightInfoBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除灯控开关信息信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 单个灯开关控制
|
||||
*
|
||||
* @param bo bean
|
||||
*/
|
||||
Boolean switchSingleLight(TbLightInfoBo bo);
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
package org.dromara.property.service;
|
||||
package org.dromara.property.service.smartDevicesService;
|
||||
|
||||
import org.dromara.property.domain.vo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.bo.TbMeterConfigBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterConfigVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterConfigBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
@@ -1,8 +1,7 @@
|
||||
package org.dromara.property.service;
|
||||
package org.dromara.property.service.smartDevicesService;
|
||||
|
||||
import org.dromara.property.domain.TbMeterInfo;
|
||||
import org.dromara.property.domain.vo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.bo.TbMeterInfoBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
@@ -1,8 +1,7 @@
|
||||
package org.dromara.property.service;
|
||||
package org.dromara.property.service.smartDevicesService;
|
||||
|
||||
import org.dromara.property.domain.TbMeterRecord;
|
||||
import org.dromara.property.domain.vo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.bo.TbMeterRecordBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRecordVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRecordBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package org.dromara.property.service;
|
||||
package org.dromara.property.service.smartDevicesService;
|
||||
|
||||
import org.dromara.property.domain.vo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.bo.TbMeterRoomBo;
|
||||
import org.dromara.property.domain.vo.smartDevicesVo.TbMeterRoomVo;
|
||||
import org.dromara.property.domain.bo.smartDevicesBo.TbMeterRoomBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
@@ -0,0 +1,50 @@
|
||||
package org.dromara.property.tasks;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.property.domain.PopularActivities;
|
||||
import org.dromara.property.domain.enums.ActivitiesStatusEnum;
|
||||
import org.dromara.property.mapper.PopularActivitiesMapper;
|
||||
import org.dromara.property.service.IPopularActivitiesService;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yuyongle
|
||||
* @version 1.0
|
||||
* @description: TODO
|
||||
* @date 2025/8/20 10:22
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class PopularActivitiesTasks {
|
||||
private final PopularActivitiesMapper popularActivitiesMapper;
|
||||
/**
|
||||
* 修改活动到期的活动状态
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Scheduled(cron = "0 0 */1 * * ?")
|
||||
//@GetMapping("/serviceWorkOrderTaskId")
|
||||
private void handlePopularActivities() {
|
||||
List<PopularActivities> popularActivities = popularActivitiesMapper.selectList(
|
||||
new LambdaQueryWrapper<PopularActivities>()
|
||||
.ne(PopularActivities::getStatus, ActivitiesStatusEnum.HASENDED.getValue())
|
||||
);
|
||||
Date now = new Date();
|
||||
popularActivities.stream().forEach(entity ->{
|
||||
//TODO拿当前时间和开始时间和结束时间做对比修改状态
|
||||
entity.setStatus(
|
||||
now.before(entity.getStartTime()) ? ActivitiesStatusEnum.NOTSTARTED.getValue() :
|
||||
now.after(entity.getEndTime()) ? ActivitiesStatusEnum.HASENDED.getValue() : ActivitiesStatusEnum.INPROGRESS.getValue()
|
||||
);
|
||||
});
|
||||
popularActivitiesMapper.updateBatchById(popularActivities);
|
||||
}
|
||||
}
|
@@ -48,9 +48,9 @@ public class ServiceWorkOrderTasks {
|
||||
/**
|
||||
* 查询状态为创建工单的工单,查询当天排班人员,为工单自动派单
|
||||
*/
|
||||
// @Transactional(rollbackFor = Exception.class)
|
||||
// @Scheduled(cron = "0 0 */1 * * ?")
|
||||
@GetMapping("/serviceWorkOrderTaskId")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Scheduled(cron = "0 0 */1 * * ?")
|
||||
//@GetMapping("/serviceWorkOrderTaskId")
|
||||
private void handleServiceWorkOrder() {
|
||||
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
|
||||
new LambdaQueryWrapper<ServiceWorkOrders>()
|
||||
@@ -88,9 +88,9 @@ public class ServiceWorkOrderTasks {
|
||||
/**
|
||||
* 处理超过30分钟的工单
|
||||
*/
|
||||
// @Transactional(rollbackFor = Exception.class)
|
||||
// @Scheduled(cron = "0 0 */1 * * ?")
|
||||
@GetMapping("/thirtyWorkOrderTaskId")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Scheduled(cron = "0 0 */1 * * ?")
|
||||
// @GetMapping("/thirtyWorkOrderTaskId")
|
||||
private void thirtyHandleServiceWorkOrder() {
|
||||
// 1. 查询当前状态为“已派单”的工单
|
||||
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
|
||||
|
@@ -9,13 +9,14 @@ RUN mkdir -p /smartparks/Sis/logs \
|
||||
/smartparks/Sis/temp \
|
||||
/smartparks/Sis/agent
|
||||
|
||||
WORKDIR /ruoyi/system
|
||||
WORKDIR /ruoyi/sis
|
||||
|
||||
ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
ENV SERVER_PORT=10002 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
|
||||
EXPOSE ${SERVER_PORT}
|
||||
|
||||
ADD ./target/Sis.jar ./app.jar
|
||||
COPY ./linux64/ .
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
|
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libAudioIntercom.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libAudioIntercom.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCAlarm.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCAlarm.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCCoreDevCfg.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCCoreDevCfg.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCDisplay.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCDisplay.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCGeneralCfgMgr.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCGeneralCfgMgr.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCIndustry.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCIndustry.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCPlayBack.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCPlayBack.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCPreview.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCPreview.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCVoiceTalk.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libHCVoiceTalk.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libStreamTransClient.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libStreamTransClient.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libSystemTransform.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libSystemTransform.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libanalyzedata.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libanalyzedata.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libiconv2.so
Normal file
BIN
ruoyi-modules/Sis/linux64/HCNetSDKCom/libiconv2.so
Normal file
Binary file not shown.
12
ruoyi-modules/Sis/linux64/HCNetSDK_Log_Switch.xml
Normal file
12
ruoyi-modules/Sis/linux64/HCNetSDK_Log_Switch.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="GB2312"?>
|
||||
<SdkLocal>
|
||||
<SdkLog>
|
||||
<logLevel>3</logLevel><!--req, 1-ERROR, 2-DEBUG, 3-INFO-->
|
||||
<logDirectory>./SDKLOG/</logDirectory><!--the end of the string must be '/'-->
|
||||
<autoDelete>true</autoDelete><!--true: There are less than 10 files in the directory, it will be auto deleted by sdk when the files are more than 10; false: No upper limit to the number of log files-->
|
||||
</SdkLog>
|
||||
<HeartbeatCfg>
|
||||
<Interval>120</Interval> <!-- <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD>0<EFBFBD><30>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD><C4AC>ֵ120s<30><73>ȡֵ<C8A1><D6B5>ΧΪ[30, 120] С<><D0A1>30s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ30s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>120s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ120s-->
|
||||
<Count>1</Count> <!-- <20><><EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD><C4AC>ֵ1<D6B5><31>-->
|
||||
</HeartbeatCfg>
|
||||
</SdkLocal>
|
BIN
ruoyi-modules/Sis/linux64/libAudioRender.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libAudioRender.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libHCCore.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libHCCore.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libNPQos.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libNPQos.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libPlayCtrl.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libPlayCtrl.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libSuperRender.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libSuperRender.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libcrypto.so.1.1
Normal file
BIN
ruoyi-modules/Sis/linux64/libcrypto.so.1.1
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libhcnetsdk.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libhcnetsdk.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libhpr.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libhpr.so
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libopenal.so.1
Normal file
BIN
ruoyi-modules/Sis/linux64/libopenal.so.1
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libssl.so.1.1
Normal file
BIN
ruoyi-modules/Sis/linux64/libssl.so.1.1
Normal file
Binary file not shown.
BIN
ruoyi-modules/Sis/linux64/libz.so
Normal file
BIN
ruoyi-modules/Sis/linux64/libz.so
Normal file
Binary file not shown.
@@ -139,6 +139,7 @@
|
||||
<artifactId>j2mod</artifactId>
|
||||
<version>3.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package org.dromara.sis;
|
||||
|
||||
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
|
||||
import org.dromara.sis.sdk.hik.service.SdkBaseServer;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
|
||||
@@ -17,8 +16,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
@SpringBootApplication
|
||||
public class SisApplication {
|
||||
public static void main(String[] args) {
|
||||
// 加载hik sdk
|
||||
SdkBaseServer.initSdk();
|
||||
SpringApplication application = new SpringApplication(SisApplication.class);
|
||||
application.setApplicationStartup(new BufferingApplicationStartup(2048));
|
||||
application.run(args);
|
||||
|
@@ -28,6 +28,7 @@ public class CleanLiftAuthRocketConsumer implements RocketMQListener<MessageExt>
|
||||
|
||||
private final ISisElevatorInfoService sisElevatorInfoService;
|
||||
private final ISisElevatorFloorRefService sisElevatorFloorRefService;
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
@Override
|
||||
public void onMessage(MessageExt ext) {
|
||||
@@ -61,7 +62,7 @@ public class CleanLiftAuthRocketConsumer implements RocketMQListener<MessageExt>
|
||||
// }
|
||||
// todo 暂时应急处理,后续调整业务逻辑
|
||||
for (int i = 1; i < 5; i++) {
|
||||
HikApiService.getInstance().controlGateway("192.168.24.150", i, 3);
|
||||
hikApiService.controlGateway("192.168.24.150", i, 3);
|
||||
}
|
||||
log.info("梯控清除权限完成");
|
||||
}
|
||||
|
@@ -19,7 +19,7 @@ public class ZkMediaHookController {
|
||||
@ResponseBody
|
||||
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
|
||||
public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) {
|
||||
log.debug("ZLM心跳上报,params: {}", param);
|
||||
log.info("ZLM心跳上报,params: {}", param);
|
||||
return HookResult.SUCCESS();
|
||||
}
|
||||
|
||||
|
@@ -5,7 +5,7 @@ import org.dromara.sis.api.domain.RemoteSisDeviceChannel;
|
||||
import org.dromara.sis.api.domain.RemoteSisDeviceManage;
|
||||
import org.dromara.sis.domain.SisDeviceChannel;
|
||||
import org.dromara.sis.domain.SisDeviceManage;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.DeviceInfo;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
|
@@ -137,6 +137,9 @@ public class SisAlarmEventsVo implements Serializable {
|
||||
*/
|
||||
private Date solveTime;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
@@ -144,5 +147,8 @@ public class SisAlarmEventsVo implements Serializable {
|
||||
*/
|
||||
private Date finishTime;
|
||||
|
||||
/**
|
||||
* 报警信息描述
|
||||
*/
|
||||
private String description;
|
||||
}
|
||||
|
@@ -11,7 +11,7 @@ import org.dromara.sis.api.domain.RemoteSisDeviceManage;
|
||||
import org.dromara.sis.domain.SisDeviceChannel;
|
||||
import org.dromara.sis.domain.SisDeviceManage;
|
||||
import org.dromara.sis.domain.covert.CommonBeanCovert;
|
||||
import org.dromara.sis.sdk.hik.HikSdkConstans;
|
||||
import org.dromara.sis.sdk.hik.HikConstants;
|
||||
import org.dromara.sis.service.ISisDeviceChannelService;
|
||||
import org.dromara.sis.service.ISisDeviceManageService;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -77,25 +77,25 @@ public class RemoteDeviceServiceImpl implements RemoteDeviceService {
|
||||
channel.setDeviceAccount(item.getChannelAccount());
|
||||
// 目前没发获取通道设备厂商,默认跟着录像机走
|
||||
channel.setFactoryNo(item.getNvrFactoryNo());
|
||||
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
|
||||
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
|
||||
channel.setChannelState(item.getChannelStatus());
|
||||
if (StrUtil.isNotEmpty(item.getChannelPwd())) {
|
||||
channel.setDevicePwd(item.getChannelPwd());
|
||||
}
|
||||
// nvr 设备信息
|
||||
channel.setNvrIp(item.getNvrIp());
|
||||
channel.setNvrPort(HikSdkConstans.DEFAULT_RTSP_PORT);
|
||||
channel.setNvrPort(HikConstants.DEFAULT_RTSP_PORT);
|
||||
channel.setNvrAccount(item.getNvrAccount());
|
||||
channel.setNvrPwd(item.getNvrPwd());
|
||||
channel.setNvrFactoryNo(item.getNvrFactoryNo());
|
||||
channel.setNvrChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setNvrChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
|
||||
|
||||
// 系统设备信息
|
||||
// 将设备id 更改为nvr的设备id
|
||||
channel.setDeviceId(item.getDeviceId());
|
||||
channel.setGroupId(item.getGroupId());
|
||||
channel.setChannelName(item.getChannelName());
|
||||
channel.setChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setTenantId(item.getTenantId());
|
||||
return channel;
|
||||
}).toList();
|
||||
|
@@ -7,8 +7,8 @@ import org.dromara.sis.api.RemoteHikSdkService;
|
||||
import org.dromara.sis.api.domain.RemoteSdkChannel;
|
||||
import org.dromara.sis.api.domain.RemoteSisDeviceManage;
|
||||
import org.dromara.sis.domain.covert.CommonBeanCovert;
|
||||
import org.dromara.sis.sdk.hik.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.HikApiService;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
@@ -18,17 +18,19 @@ import java.util.List;
|
||||
@Component
|
||||
public class RemoteSdkServiceImpl implements RemoteHikSdkService {
|
||||
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
@Override
|
||||
public Boolean deviceLogin(RemoteSisDeviceManage item) {
|
||||
if (item == null) {
|
||||
throw new RuntimeException("设备信息为null");
|
||||
}
|
||||
return HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount());
|
||||
return hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount(), item.getDeviceType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RemoteSdkChannel> getDeviceChannel(String deviceIp) {
|
||||
DeviceInfo channelInfo = HikApiService.getInstance().getChannelInfo(deviceIp);
|
||||
DeviceInfo channelInfo = hikApiService.getChannelInfo(deviceIp);
|
||||
if (channelInfo == null) {
|
||||
return List.of();
|
||||
}
|
||||
|
@@ -12,7 +12,6 @@ import org.dromara.property.api.domain.vo.RemoteFloorVo;
|
||||
import org.dromara.sis.domain.SisDeviceManage;
|
||||
import org.dromara.sis.domain.vo.SisElevatorInfoVo;
|
||||
import org.dromara.sis.sdk.hik.HikApiService;
|
||||
import org.dromara.sis.sdk.hik.calback.HikAlarmCallBack;
|
||||
import org.dromara.sis.service.ISisDeviceManageService;
|
||||
import org.dromara.sis.service.ISisElevatorInfoService;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
@@ -28,18 +27,15 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
@RequiredArgsConstructor
|
||||
public class HikDeviceApplicationRunner implements ApplicationRunner {
|
||||
|
||||
private final HikAlarmCallBack hikAlarmCallBack;
|
||||
private final ISisDeviceManageService deviceManageService;
|
||||
private final ISisElevatorInfoService elevatorInfoService;
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
@DubboReference
|
||||
private RemoteFloorService remoteFloorService;
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
// 先布放,在登录
|
||||
HikApiService.getInstance().setAlarmCallBack(0, hikAlarmCallBack);
|
||||
// 现在查询全部,后面要更具需要查询指定厂商的设备
|
||||
HikDeviceApplicationRunner runner = SpringUtils.getAopProxy(this);
|
||||
// 梯控登录
|
||||
// runner.hikElevatorInfoLogin();
|
||||
@@ -53,23 +49,20 @@ public class HikDeviceApplicationRunner implements ApplicationRunner {
|
||||
if (CollUtil.isNotEmpty(sisElevatorInfoVos)) {
|
||||
sisElevatorInfoVos.forEach(item -> {
|
||||
// 执行设备登录操作
|
||||
HikApiService.getInstance().login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd());
|
||||
|
||||
hikApiService.login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd(), 4);
|
||||
AtomicReference<List<RemoteFloorVo>> floorInfoRef = new AtomicReference<>();
|
||||
// 模拟上下文
|
||||
SaTokenContextMockUtil.setMockContext(() -> {
|
||||
// 模拟登录
|
||||
// 模拟登录
|
||||
StpUtil.login(-8);
|
||||
floorInfoRef.set(remoteFloorService.queryByBuildingId(item.getBuildingId()));
|
||||
});
|
||||
|
||||
// 根据单元ID获取楼层信息
|
||||
List<RemoteFloorVo> floorInfo = floorInfoRef.get();
|
||||
|
||||
// 下发权限
|
||||
for (int i = 0; i < floorInfo.size(); i++) {
|
||||
// 初始权限默认禁用状态
|
||||
HikApiService.getInstance().controlGateway(item.getControlIp(), (i + 1), 3);
|
||||
hikApiService.controlGateway(item.getControlIp(), (i + 1), 3);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -83,11 +76,8 @@ public class HikDeviceApplicationRunner implements ApplicationRunner {
|
||||
return;
|
||||
}
|
||||
deviceList.forEach(item -> {
|
||||
boolean isLogin = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd());
|
||||
boolean isLogin = hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd(), 1);
|
||||
log.info("设备[{}]执行登录完成,result={}", item.getDeviceIp(), isLogin);
|
||||
if (isLogin) {
|
||||
HikApiService.getInstance().setAlarmChan(item.getDeviceIp());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package org.dromara.sis.sdk.hik.model;
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
import lombok.Data;
|
||||
import org.dromara.sis.api.enums.FactoryNoEnum;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -28,8 +27,6 @@ public class DeviceInfo {
|
||||
*/
|
||||
private Integer dwStartDChan;
|
||||
|
||||
private String factoryNo = FactoryNoEnum.HIK.getCode();
|
||||
|
||||
private List<DeviceChannelInfo> channelInfo;
|
||||
|
||||
@Data
|
@@ -1,72 +1,59 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
import jakarta.xml.bind.annotation.*;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 上传图片的附件信息
|
||||
* 人像库参数上传bo
|
||||
*
|
||||
* @author lxj
|
||||
*/
|
||||
@Data
|
||||
@XmlRootElement(name = "FaceAppendData")
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class FaceAppendData {
|
||||
public class FlibFaceAddBo {
|
||||
|
||||
@XmlAttribute
|
||||
private String version = "2.0";
|
||||
private String deviceIp;
|
||||
|
||||
@XmlAttribute
|
||||
private String xmlns = "http://www.isapi.org/ver20/XMLSchema";
|
||||
private byte[] face;
|
||||
|
||||
private Integer libId;
|
||||
|
||||
/**
|
||||
* 出生日期,例如:2014-12-12T00:00:00Z
|
||||
*/
|
||||
@XmlElement
|
||||
private String bornTime;
|
||||
|
||||
@XmlElement
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* male, female
|
||||
*/
|
||||
@XmlElement
|
||||
private String sex;
|
||||
|
||||
/**
|
||||
* 省份,代码索引具体请参考"全国各省份城市列表
|
||||
*/
|
||||
@XmlElement
|
||||
private String province;
|
||||
|
||||
/**
|
||||
* ,城市,代码索引具体请参考"全国各省份城市列表
|
||||
*/
|
||||
@XmlElement
|
||||
private String city;
|
||||
|
||||
/**
|
||||
* 证件类型: ID-身份证, passportID-护照, other-其他
|
||||
*/
|
||||
@XmlElement
|
||||
private String certificateType;
|
||||
|
||||
/**
|
||||
* 证件号
|
||||
*/
|
||||
@XmlElement
|
||||
private String certificateNumber;
|
||||
|
||||
/**
|
||||
* 电话号码
|
||||
*/
|
||||
@XmlElement
|
||||
private String phoneNumber;
|
||||
|
||||
/**
|
||||
* 自定人员id
|
||||
*/
|
||||
@XmlElement
|
||||
private String customHumanID;
|
||||
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,11 @@
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.TypeReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.Base64Utils;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
|
||||
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
|
||||
import org.dromara.sis.sdk.hik.service.*;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import org.dromara.sis.sdk.zkmedia.model.R;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 海康sdk 接口服务
|
||||
@@ -20,31 +14,34 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
* @since 25-07-10
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class HikApiService {
|
||||
|
||||
private static final String URL_PREFIX = "http://127.0.0.1/eqp/hik/";
|
||||
private static final String LOGIN_URI = "login";
|
||||
private static final String LOGOUT_URI = "logout";
|
||||
private static final String CHANNEL_LIST = "channel/list";
|
||||
private static final String FACE_UPLOAD = "flib/add";
|
||||
|
||||
|
||||
/**
|
||||
* 缓存设备登录句柄的map
|
||||
* 发起海康设备对接模块请求
|
||||
*
|
||||
* @param uri 请求uri
|
||||
* @param params 请求参数
|
||||
* @param cls 返回数据类型
|
||||
* @return 返回请求数据
|
||||
*/
|
||||
private static final ConcurrentHashMap<String, Integer> CACHE = new ConcurrentHashMap<>(16);
|
||||
|
||||
private HikApiService() {
|
||||
}
|
||||
|
||||
private static volatile HikApiService instance;
|
||||
|
||||
public static HikApiService getInstance() {
|
||||
if (instance == null) {
|
||||
synchronized (HikApiService.class) {
|
||||
if (instance == null) {
|
||||
instance = new HikApiService();
|
||||
}
|
||||
}
|
||||
public <T> T request(String uri, String params, Class<T> cls) {
|
||||
String url = URL_PREFIX + uri;
|
||||
log.info("url: {},params: {}", url, params);
|
||||
String post = HttpUtil.post(url, params);
|
||||
R<T> result = JSONObject.parseObject(post, new TypeReference<R<T>>(cls) {
|
||||
});
|
||||
if (result != null && result.getCode() == 200) {
|
||||
return result.getData();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
SdkBaseServer.initSdk();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,45 +52,35 @@ public class HikApiService {
|
||||
* @param port 设备端口
|
||||
* @param user 设备账号
|
||||
* @param psw 设备密码
|
||||
* @param deviceType 1 摄像机,2: nvr, 3:cvr,4: 梯控
|
||||
* @return 返回会否登录成功
|
||||
*/
|
||||
public boolean login(String ip, short port, String user, String psw) {
|
||||
int i = LoginService.loginDevice(ip, port, user, psw);
|
||||
boolean result = (i != SdkBaseServer.LOGIN_FAIL_CODE);
|
||||
if (result) {
|
||||
// 上次登录信息依然存在
|
||||
if (CACHE.get(ip) != null && CACHE.get(ip) != i) {
|
||||
loginOut(ip);
|
||||
}
|
||||
CACHE.put(ip, i);
|
||||
} else {
|
||||
CACHE.remove(ip);
|
||||
}
|
||||
return result;
|
||||
public boolean login(String ip, short port, String user, String psw, Integer deviceType) {
|
||||
JSONObject params = new JSONObject();
|
||||
params.put("deviceIp", ip);
|
||||
params.put("devicePort", port);
|
||||
params.put("deviceAccount", user);
|
||||
params.put("devicePassword", psw);
|
||||
params.put("deviceType", deviceType);
|
||||
return request(LOGIN_URI, params.toJSONString(), Boolean.class);
|
||||
}
|
||||
|
||||
public Boolean loginOut(String deviceIp) {
|
||||
JSONObject params = new JSONObject();
|
||||
params.put("deviceIp", deviceIp);
|
||||
return request(LOGOUT_URI, params.toJSONString(), Boolean.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册报警信息回调函数。
|
||||
*
|
||||
* @param callBack 报警信回调
|
||||
*/
|
||||
public boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
|
||||
return SdkBaseServer.setAlarmCallBack(iIndex, callBack);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取梯控主机工作状态
|
||||
* 通过sdk 获取hik设备通道信息
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
* @return 范湖通道信息
|
||||
*/
|
||||
public void getAcsStatus(String deviceIp) {
|
||||
// 获取登录句柄
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
if (lHandel == null) {
|
||||
log.error("设备[{}]不在线, 无法登出。", deviceIp);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
public DeviceInfo getChannelInfo(String deviceIp) {
|
||||
JSONObject params = new JSONObject();
|
||||
params.put("deviceIp", deviceIp);
|
||||
return request(CHANNEL_LIST, params.toJSONString(), DeviceInfo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,160 +98,21 @@ public class HikApiService {
|
||||
* 6- 住户呼梯(梯控)
|
||||
*/
|
||||
public Boolean controlGateway(String deviceIp, Integer floorNum, Integer cmd) {
|
||||
// 获取登录句柄
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
if (lHandel == null) {
|
||||
log.error("设备[{}]不在线, 无法进行梯控操作。", deviceIp);
|
||||
return false;
|
||||
}
|
||||
return DoorService.controlGateway(lHandel, floorNum, cmd);
|
||||
JSONObject params = new JSONObject();
|
||||
params.put("deviceIp", deviceIp);
|
||||
params.put("floorNum", floorNum);
|
||||
params.put("cmd", cmd);
|
||||
return request(LOGOUT_URI, params.toJSONString(), Boolean.class);
|
||||
}
|
||||
|
||||
public Boolean loginOut(String deviceIp) {
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
if (lHandel == null) {
|
||||
log.error("设备[{}]不在线, 无法登出。", deviceIp);
|
||||
return true;
|
||||
}
|
||||
boolean logout = LoginService.logout(lHandel);
|
||||
if (logout) {
|
||||
log.info("设备[{}]注销完成", deviceIp);
|
||||
CACHE.remove(deviceIp);
|
||||
}
|
||||
return logout;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设备报警
|
||||
*
|
||||
* @param deviceIp
|
||||
* @return
|
||||
*/
|
||||
public Boolean setAlarmChan(String deviceIp) {
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
return SdkBaseServer.setAlarmChan(lHandel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过sdk 获取hik设备通道信息
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
* @return 范湖通道信息
|
||||
*/
|
||||
public DeviceInfo getChannelInfo(String deviceIp) {
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
return CamearService.getDeviceChannelInfo(lHandel);
|
||||
}
|
||||
|
||||
// 允许上传的文件类型
|
||||
private static final List<String> ALLOW_PIC_TYPES = Arrays.asList("jpg");
|
||||
|
||||
/**
|
||||
* 人像比对文件上传
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
* @param file 上传文件
|
||||
* @param addBo 上传参数
|
||||
* @return 返回上传文件名称
|
||||
*/
|
||||
public static String fdLibUpload(String deviceIp, byte[] file, int libId, FaceAppendData data) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 文件名称
|
||||
String fileNamePrefix = IdUtil.fastSimpleUUID();
|
||||
int luserId = CACHE.get(deviceIp);
|
||||
if (luserId == -1) {
|
||||
log.error("海康设备[{}]未登录,上传文件失败.", deviceIp);
|
||||
return null;
|
||||
}
|
||||
int uploadId = -1;
|
||||
// 获取文件类型
|
||||
String type = Base64Utils.getType(file);
|
||||
log.info("获取上传的文件类型,type: {}", type);
|
||||
if (type == null) {
|
||||
log.error("上传文件获取类型失败.");
|
||||
return null;
|
||||
}
|
||||
if (!ALLOW_PIC_TYPES.contains(type)) {
|
||||
log.error("不允许的上传文件类型, type: {}", type);
|
||||
return null;
|
||||
}
|
||||
// 生成文件名称
|
||||
String fileName = fileNamePrefix + "." + type;
|
||||
// 上传状态
|
||||
int statusCode = -1;
|
||||
// 已发送的数据
|
||||
int fileLen = file.length;
|
||||
log.info("开始文件上传,fileName={}, len={}", fileName, fileLen);
|
||||
try {
|
||||
// 1 发起上传
|
||||
uploadId = FdLibUploadService.uploadFile(luserId, libId);
|
||||
log.info("开始发起hik上传操作,uploadId={}", uploadId);
|
||||
if (uploadId == -1) {
|
||||
log.info("发起上传失败,errCode: {}", FdLibUploadService.getErrorCode());
|
||||
return null;
|
||||
}
|
||||
// 2 发送图片的二进制数据
|
||||
byte fileType = getFileType(type);
|
||||
FdLibUploadService.uploadSend(uploadId, file, fileType, data);
|
||||
// 3 循环查询, 上传进度 总共查询300次 每次等待20ms
|
||||
int num = 200; // 循环次数
|
||||
int sleepTime = 40; // 每次循环休眠时间
|
||||
int allowQueryErrorNum = 5; // 最多允许接口调用异常
|
||||
int errorNum = 0; // 错误次数
|
||||
for (int i = 0; i < num; i++) {
|
||||
UploadStatus uploadState = FdLibUploadService.getUploadState(uploadId);
|
||||
log.info("循环获取文件上传进度, uploadState= {}", uploadState);
|
||||
if (uploadState.getStatusCode() == -1) {
|
||||
int errorCode = FdLibUploadService.getErrorCode();
|
||||
log.info("文件进度查询失败, errorCode:{}", errorCode);
|
||||
errorNum += 1;
|
||||
if (errorNum == allowQueryErrorNum) {
|
||||
log.info("sdk 接口错误次数达到设置上限,退出文件上传");
|
||||
throw new RuntimeException("sdk接口错误次数达到设置上限,退出文件上传, maxErrorNum=" + allowQueryErrorNum);
|
||||
}
|
||||
} else {
|
||||
// 上传成功
|
||||
if (uploadState.getStatusCode() == 1) {
|
||||
statusCode = 1;
|
||||
break;
|
||||
}
|
||||
// 上传中
|
||||
else if (uploadState.getStatusCode() == 2) {
|
||||
Thread.sleep(sleepTime);
|
||||
}
|
||||
// 上传失败
|
||||
else if (uploadState.getStatusCode() == 3) {
|
||||
throw new RuntimeException("文件上传失败, 返回码:3");
|
||||
}
|
||||
// 其他异常
|
||||
else {
|
||||
throw new RuntimeException("文件上传失败, 返回码:" + uploadState);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (statusCode == -1) {
|
||||
log.info("图片上传失败,取消上传.");
|
||||
return null;
|
||||
}
|
||||
// 4 获取上传图片的路径
|
||||
String uploadResult = FdLibUploadService.getUploadResult(uploadId);
|
||||
log.info("文件上传完成, result= {}, 耗时={}ms", uploadResult, System.currentTimeMillis() - startTime);
|
||||
return uploadResult;
|
||||
} catch (Exception e) {
|
||||
if (uploadId != -1) {
|
||||
FdLibUploadService.uploadClose(uploadId);
|
||||
}
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
public String fdLibUpload(FlibFaceAddBo addBo) {
|
||||
return request("FACE_UPLOAD", JSONObject.toJSONString(addBo), String.class);
|
||||
}
|
||||
|
||||
private static byte getFileType(String type) {
|
||||
return switch (type) {
|
||||
case "jpg" -> 1;
|
||||
case "png" -> 3;
|
||||
case "bmp" -> 2;
|
||||
case "gif" -> 5;
|
||||
default -> throw new RuntimeException("不允许上传的图片类型:" + type);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -1,14 +1,10 @@
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
public class HikSdkConstans {
|
||||
public class HikConstants {
|
||||
|
||||
/**
|
||||
* IPc 的默认通道信息
|
||||
*/
|
||||
public static final String DEFAULT_CHANNEL = "101";
|
||||
|
||||
public static final Integer DEFAULT_RTSP_PORT = 554;
|
||||
|
||||
public static final String DEFAULT_CHANNEL_PREFX = "01";
|
||||
|
||||
|
||||
}
|
@@ -1,28 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
import com.sun.jna.Structure;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SDK_Structure extends Structure {
|
||||
protected List<String> getFieldOrder() {
|
||||
List<String> fieldOrderList = new ArrayList<String>();
|
||||
for (Class<?> cls = getClass(); !cls.equals(SDK_Structure.class); cls = cls.getSuperclass()) {
|
||||
Field[] fields = cls.getDeclaredFields();
|
||||
int modifiers;
|
||||
for (Field field : fields) {
|
||||
modifiers = field.getModifiers();
|
||||
if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
|
||||
continue;
|
||||
}
|
||||
fieldOrderList.add(field.getName());
|
||||
}
|
||||
}
|
||||
//System.out.println(fieldOrderList);
|
||||
return fieldOrderList;
|
||||
}
|
||||
|
||||
}
|
@@ -1,323 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.calback;
|
||||
|
||||
import cn.hutool.core.date.TimeInterval;
|
||||
import com.sun.jna.Pointer;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.domain.SisDeviceManage;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.service.ISisDeviceManageService;
|
||||
import org.dromara.sis.service.IZeroSensationPassageService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.HCNetSDK.*;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
|
||||
|
||||
private final ISisDeviceManageService sisDeviceManageService;
|
||||
private final IZeroSensationPassageService zeroSensationPassageService;
|
||||
|
||||
@Override
|
||||
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
|
||||
|
||||
switch (lCommand) {
|
||||
//实时特征抓拍上传
|
||||
case COMM_UPLOAD_FACESNAP_RESULT: {
|
||||
log.info("hik 抓拍信息上报完成,lCommand={}", lCommand);
|
||||
HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
|
||||
strFaceSnapInfo.write();
|
||||
Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
|
||||
pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
|
||||
strFaceSnapInfo.read();
|
||||
handleFaceSnap(strFaceSnapInfo, pAlarmer);
|
||||
break;
|
||||
}
|
||||
// 异常行为检测
|
||||
case COMM_ALARM_RULE: {
|
||||
// 读数据
|
||||
HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM();
|
||||
strVcaAlarm.write();
|
||||
Pointer pVCAInfo = strVcaAlarm.getPointer();
|
||||
pVCAInfo.write(0, pAlarmInfo.getByteArray(0, strVcaAlarm.size()), 0, strVcaAlarm.size());
|
||||
strVcaAlarm.read();
|
||||
|
||||
switch (strVcaAlarm.struRuleInfo.wEventTypeEx) {
|
||||
case 1: //穿越警戒面 (越界侦测)
|
||||
System.out.println("越界侦测报警发生");
|
||||
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_TRAVERSE_PLANE.class);
|
||||
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struTraversePlane.byDetectionTarget); //检测目标,0表示所有目标(表示不锁定检测目标,所有目标都将进行检测),其他取值按位表示不同的检测目标:0x01-人,0x02-车
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "VCA_TRAVERSE_PLANE" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: //目标进入区域
|
||||
System.out.println("目标进入区域报警发生");
|
||||
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
|
||||
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "_TargetEnter" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3: //目标离开区域
|
||||
System.out.println("目标离开区域报警触发");
|
||||
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
|
||||
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "_TargetLeave" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: //周界入侵
|
||||
System.out.println("周界入侵报警发生");
|
||||
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_INTRUSION.class);
|
||||
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struIntrusion.byDetectionTarget);
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "VCA_INTRUSION" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: //徘徊
|
||||
System.out.println("徘徊事件触发");
|
||||
break;
|
||||
case 8: //快速移动(奔跑),
|
||||
System.out.println("快速移动(奔跑)事件触发");
|
||||
break;
|
||||
case 15:
|
||||
System.out.println("事件触发");
|
||||
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_LEAVE_POSITION.class);
|
||||
System.out.println(strVcaAlarm.struRuleInfo.uEventParam.struLeavePos.byOnPosition);
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "VCA_LEAVE_POSITION_" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
case 20: //倒地检测
|
||||
System.out.println("倒地事件触发");
|
||||
break;
|
||||
case 44: //玩手机
|
||||
System.out.println("玩手机报警发生");
|
||||
//图片保存
|
||||
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
|
||||
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
String newName = sf.format(new Date());
|
||||
FileOutputStream fout;
|
||||
try {
|
||||
String filename = "./pic/" + newName + "PLAY_CELLPHONE_" + ".jpg";
|
||||
fout = new FileOutputStream(filename);
|
||||
//将字节写入文件
|
||||
long offset = 0;
|
||||
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
|
||||
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
|
||||
buffers.rewind();
|
||||
buffers.get(bytes);
|
||||
fout.write(bytes);
|
||||
fout.close();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 45: //持续检测
|
||||
System.out.println("持续检测事件触发");
|
||||
default:
|
||||
System.out.println("行为事件类型:" + strVcaAlarm.struRuleInfo.wEventTypeEx);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// 人脸比对结果上报
|
||||
case COMM_SNAP_MATCH_ALARM: {
|
||||
TimeInterval interval = new TimeInterval();
|
||||
HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM strFaceSnapMatch = new HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM();
|
||||
strFaceSnapMatch.write();
|
||||
Pointer pFaceSnapMatch = strFaceSnapMatch.getPointer();
|
||||
pFaceSnapMatch.write(0, pAlarmInfo.getByteArray(0, strFaceSnapMatch.size()), 0, strFaceSnapMatch.size());
|
||||
strFaceSnapMatch.read();
|
||||
handleFaceComparison(strFaceSnapMatch, pAlarmer, interval);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理人脸抓拍上报
|
||||
*
|
||||
* @param result 人脸数据
|
||||
* @param pAlarmer 设备数据
|
||||
*/
|
||||
private void handleFaceSnap(HCNetSDK.NET_VCA_FACESNAP_RESULT result, HCNetSDK.NET_DVR_ALARMER pAlarmer) {
|
||||
// 读取人脸小图
|
||||
ByteBuffer buffers = result.pBuffer1.getByteBuffer(0, result.dwFacePicLen);
|
||||
byte[] smallImg = new byte[result.dwFacePicLen];
|
||||
buffers.rewind();
|
||||
buffers.get(smallImg);
|
||||
|
||||
// 人脸大图
|
||||
ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen);
|
||||
byte[] bigImg = new byte[result.dwBackgroundPicLen];
|
||||
buffers1.rewind();
|
||||
buffers1.get(bigImg);
|
||||
//设备ip
|
||||
String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
|
||||
log.info("海康设备告警信息上传,设备={}, 人脸图片大小={}, 背景图片大小={}", sAlarmInfo, smallImg.length, bigImg.length);
|
||||
zeroSensationPassageService.pass(sAlarmInfo, smallImg, bigImg);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理人脸比对上报
|
||||
*/
|
||||
private void handleFaceComparison(HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM result, HCNetSDK.NET_DVR_ALARMER pAlarmer, TimeInterval interval) {
|
||||
// 读取比对结果比对结果,0-保留,1-比对成功,2-比对失败
|
||||
int compareResults = result.byContrastStatus;
|
||||
// 比对不成功,不处理
|
||||
if (compareResults != 1) {
|
||||
log.info("前置人脸比对失败,设备:{}", new String(pAlarmer.sDeviceIP).trim());
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取相似度
|
||||
float similarity = result.fSimilarity;
|
||||
// 相似度小于70,不处理
|
||||
if (similarity < 0.7) {
|
||||
log.info("前置人脸比对相似度小于70,设备:{}", new String(pAlarmer.sDeviceIP).trim());
|
||||
return;
|
||||
}
|
||||
|
||||
// 读取名字
|
||||
String name = new String(result.struBlockListInfo.struBlockListInfo.struAttribute.byName, Charset.forName("GBK")).trim();
|
||||
// 人员id为空,不处理
|
||||
if (result.struBlockListInfo.pPID == null) return;
|
||||
// 读取人员id
|
||||
ByteBuffer buffers = result.struBlockListInfo.pPID.getByteBuffer(0, result.struBlockListInfo.dwPIDLen);
|
||||
byte[] pidByte = new byte[result.struBlockListInfo.dwPIDLen];
|
||||
buffers.rewind();
|
||||
buffers.get(pidByte);
|
||||
int pid = Integer.parseInt(new String(pidByte));
|
||||
|
||||
log.info("比对结果:{},相似度:{},人员:{},id:{}", compareResults, similarity, name, pid);
|
||||
log.info("处理前置人脸比对结果,耗时:{}", interval.interval());
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -1,30 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.calback;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.sun.jna.Pointer;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 设备状态信息的回调
|
||||
* 设备巡查回调
|
||||
*
|
||||
* @author xukai
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class HikDevWorkStateCallBack implements HCNetSDK.DEV_WORK_STATE_CB {
|
||||
|
||||
@Override
|
||||
public boolean invoke(Pointer pUserdata, int iUserID, HCNetSDK.NET_DVR_WORKSTATE_V40 lpWorkState) {
|
||||
if (lpWorkState == null) {
|
||||
log.info("lpWorkState为null");
|
||||
return false;
|
||||
}
|
||||
lpWorkState.read();
|
||||
log.info(JSON.toJSONString(lpWorkState));
|
||||
log.info("海康sdk心跳信息上报, tda = {}", JSON.toJSONString(lpWorkState));
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -1,57 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.common;
|
||||
|
||||
/**
|
||||
* @Author: jiangxin14
|
||||
* @Date: 2024-08-09 14:13
|
||||
*/
|
||||
|
||||
public enum ErrorCode {
|
||||
NET_ERR_TIME_OVERLAP(1900, "时间段重叠"),
|
||||
NET_ERR_HOLIDAY_PLAN_OVERLAP(1901, "假日计划重叠"),
|
||||
NET_ERR_CARDNO_NOT_SORT(1902, "卡号未排序"),
|
||||
NET_ERR_CARDNO_NOT_EXIST(1903, "卡号不存在"),
|
||||
NET_ERR_ILLEGAL_CARDNO(1904, "卡号错误"),
|
||||
NET_ERR_ZONE_ALARM(1905, "防区处于布防状态(参数修改不允许)"),
|
||||
NET_ERR_NOT_SUPPORT_ONE_MORE_CARD ( 1920,"不支持一人多卡"),
|
||||
NET_ERR_DELETE_NO_EXISTENCE_FACE(1921,"删除的人脸不存在"),
|
||||
NET_ERR_OFFLINE_CAPTURING(1929, "离线采集中,无法响应"),
|
||||
NET_DVR_ERR_OUTDOOR_COMMUNICATION(1950, "与门口机通信异常"),
|
||||
NET_DVR_ERR_ROOMNO_UNDEFINED(1951, "未设置房间号"),
|
||||
NET_DVR_ERR_NO_CALLING(1952, "无呼叫"),
|
||||
NET_DVR_ERR_RINGING(1953, "响铃"),
|
||||
NET_DVR_ERR_IS_CALLING_NOW(1954, "正在通话"),
|
||||
NET_DVR_ERR_LOCK_PASSWORD_WRONG(1955, "智能锁密码错误"),
|
||||
NET_DVR_ERR_CONTROL_LOCK_FAILURE(1956, "开关锁失败"),
|
||||
NET_DVR_ERR_CONTROL_LOCK_OVERTIME(1957, "开关锁超时"),
|
||||
NET_DVR_ERR_LOCK_DEVICE_BUSY(1958, "智能锁设备繁忙"),
|
||||
NET_DVR_ERR_UNOPEN_REMOTE_LOCK_FUNCTION(1959, "远程开锁功能未打开");
|
||||
|
||||
|
||||
private final int code;
|
||||
private final String description;
|
||||
|
||||
ErrorCode(int code, String description) {
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
// 根据错误码获取描述的方法
|
||||
public static String getDescription(int code) {
|
||||
for (ErrorCode errorCode : ErrorCode.values()) {
|
||||
if (errorCode.getCode() == code) {
|
||||
return errorCode.getDescription();
|
||||
}
|
||||
}
|
||||
return "未知错误码";
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,12 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.common;
|
||||
|
||||
public class osSelect {
|
||||
|
||||
public static boolean isLinux() {
|
||||
return System.getProperty("os.name").toLowerCase().contains("linux");
|
||||
}
|
||||
|
||||
public static boolean isWindows() {
|
||||
return System.getProperty("os.name").toLowerCase().contains("windows");
|
||||
}
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
|
||||
import com.sun.jna.Memory;
|
||||
|
||||
public class SimpleMemory extends Memory {
|
||||
|
||||
|
||||
public SimpleMemory(long size) {
|
||||
super(size);
|
||||
}
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UploadStatus {
|
||||
|
||||
/**
|
||||
* 上传状态码
|
||||
*/
|
||||
private Integer statusCode;
|
||||
|
||||
/**
|
||||
* 上传进度
|
||||
*/
|
||||
private Integer process;
|
||||
|
||||
}
|
@@ -1,83 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
|
||||
/**
|
||||
* 门禁设备管理:
|
||||
* 1、获取(设置)门禁主机参数
|
||||
* 2、获取门禁主机工作状态
|
||||
*/
|
||||
@Slf4j
|
||||
public class AcsService extends SdkBaseServer {
|
||||
|
||||
/**
|
||||
* 获取(设置)门禁主机参数
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
*/
|
||||
public static boolean acsCfg(int lUserID) {
|
||||
/**获取门禁主机参数*/
|
||||
HCNetSDK.NET_DVR_ACS_CFG struAcsCfg = new HCNetSDK.NET_DVR_ACS_CFG();
|
||||
struAcsCfg.dwSize = struAcsCfg.size();
|
||||
struAcsCfg.write();
|
||||
IntByReference intByReference = new IntByReference(0);
|
||||
boolean b_GetAcsCfg = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(),
|
||||
struAcsCfg.size(), intByReference);
|
||||
if (!b_GetAcsCfg) {
|
||||
log.info("获取门禁主机参数失败,错误码={}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return false;
|
||||
} else {
|
||||
struAcsCfg.read();
|
||||
log.info("获取门禁主机参数成功,result={}", JSONObject.toJSONString(struAcsCfg));
|
||||
}
|
||||
/**设置门禁主机参数*/
|
||||
struAcsCfg.byShowCardNo = 1; //开启显示卡号
|
||||
struAcsCfg.byVoicePrompt = 0; //关闭语音提示
|
||||
struAcsCfg.byUploadCapPic = 1; //开启联动抓图后,设备上抓拍的图片才会通过报警布防上传,否则没有不上传
|
||||
struAcsCfg.byShowCapPic = 1;
|
||||
struAcsCfg.write();
|
||||
boolean b_SetAcsCfg = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(), struAcsCfg.size());
|
||||
if (!b_SetAcsCfg) {
|
||||
log.info("设置门禁主机参数,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
}
|
||||
return b_SetAcsCfg;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取梯控主机工作状态
|
||||
* 梯控楼层状态
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
*/
|
||||
public static HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50 getAcsStatus(int lUserID) {
|
||||
HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50 netDvrAcsWorkStatusV50 = new HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50();
|
||||
netDvrAcsWorkStatusV50.dwSize = netDvrAcsWorkStatusV50.size();
|
||||
netDvrAcsWorkStatusV50.write();
|
||||
IntByReference intByReference = new IntByReference(0);
|
||||
boolean b_GetAcsStatus = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_WORK_STATUS_V50, 0xFFFFFFFF,
|
||||
netDvrAcsWorkStatusV50.getPointer(), netDvrAcsWorkStatusV50.size(), intByReference);
|
||||
if (!b_GetAcsStatus) {
|
||||
log.info("获取梯控主机工作状态,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return null;
|
||||
} else {
|
||||
log.info("获取梯控主机工作状态成功!!!");
|
||||
netDvrAcsWorkStatusV50.read();
|
||||
// for (int i = 0; i < 128; i++) {
|
||||
// int floor = i + 1;
|
||||
// log.info("楼层" + floor + " 继电器开合状态:" + netDvrAcsWorkStatusV50.byDoorLockStatus[i] + "\n"); //门锁状态:0- 正常关,1- 正常开,2- 短路报警,3- 断路报警,4- 异常报警
|
||||
// log.info("楼层" + floor + " 梯控状态:" + netDvrAcsWorkStatusV50.byDoorStatus[i] + "\n"); //门状态(或者梯控的楼层状态):1- 休眠,2- 常开状态(对于梯控,表示自由状态),3- 常闭状态(对于梯控,表示禁用状态),4- 普通状态(对于梯控,表示受控状态)
|
||||
// }
|
||||
// log.info("3.门磁状态:" + netDvrAcsWorkStatusV50.byMagneticStatus[0] + "\n"); //门磁状态,0-正常关,1-正常开,2-短路报警,3-断路报警,4-异常报警
|
||||
// log.info("4.事件报警输入状态:" + netDvrAcsWorkStatusV50.byCaseStatus[0] + "\n"); //事件报警输入状态:0- 无输入,1- 有输入
|
||||
log.info(JSONObject.toJSONString(netDvrAcsWorkStatusV50));
|
||||
return netDvrAcsWorkStatusV50;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@@ -1,156 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.sun.jna.Memory;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.HCNetSDK.NET_DVR_GET_IPPARACFG_V40;
|
||||
|
||||
@Slf4j
|
||||
public class CamearService extends SdkBaseServer {
|
||||
|
||||
/**
|
||||
* 获取设备通道信息
|
||||
*
|
||||
* @return DeviceInfo
|
||||
*/
|
||||
public static DeviceInfo getDeviceChannelInfo(int lUserID) {
|
||||
HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40();
|
||||
lpOutBuffer.read();
|
||||
lpOutBuffer.dwSize = lpOutBuffer.size();
|
||||
IntByReference bytesReturned = new IntByReference(0);
|
||||
boolean success = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, 0, lpOutBuffer.getPointer(), lpOutBuffer.size(), bytesReturned);
|
||||
if (success) {
|
||||
lpOutBuffer.read();
|
||||
}
|
||||
|
||||
DeviceInfo deviceInfo = new DeviceInfo();
|
||||
deviceInfo.setDwGroupNum(lpOutBuffer.dwGroupNum);
|
||||
deviceInfo.setDwAChanNum(lpOutBuffer.dwAChanNum);
|
||||
deviceInfo.setDwDChanNum(lpOutBuffer.dwDChanNum);
|
||||
deviceInfo.setDwStartDChan(lpOutBuffer.dwStartDChan);
|
||||
|
||||
List<DeviceInfo.DeviceChannelInfo> channelInfo = new ArrayList<>(64);
|
||||
deviceInfo.setChannelInfo(channelInfo);
|
||||
int num = 0;
|
||||
for (int i = 0; i < lpOutBuffer.dwDChanNum; i++) {
|
||||
|
||||
HCNetSDK.NET_DVR_PICCFG_V30 dvrPiccfgV30 = new HCNetSDK.NET_DVR_PICCFG_V30();
|
||||
dvrPiccfgV30.dwSize = dvrPiccfgV30.size();
|
||||
IntByReference lpBytesReturned = new IntByReference(0);
|
||||
int channelNum = i + lpOutBuffer.dwStartDChan;
|
||||
getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_PICCFG_V30, channelNum, dvrPiccfgV30.getPointer(), dvrPiccfgV30.dwSize, lpBytesReturned);
|
||||
dvrPiccfgV30.read();
|
||||
|
||||
if (dvrPiccfgV30.dwSize == 0) {
|
||||
// 代表此通道不存在数据那次此次不操作
|
||||
log.info("通道[{}],无数据,不处理", channelNum);
|
||||
} else {
|
||||
String channelName = new String(dvrPiccfgV30.sChanName, Charset.forName("GBK")).trim();
|
||||
HCNetSDK.NET_DVR_IPDEVINFO_V31 netDvrIpdevinfoV31 = lpOutBuffer.struIPDevInfo[num];
|
||||
String sUserName = new String(netDvrIpdevinfoV31.sUserName, StandardCharsets.UTF_8).trim();
|
||||
String sPassword = new String(netDvrIpdevinfoV31.sPassword, StandardCharsets.UTF_8).trim();
|
||||
String ip = new String(netDvrIpdevinfoV31.struIP.sIpV4, StandardCharsets.UTF_8).trim();
|
||||
short wDVRPort = netDvrIpdevinfoV31.wDVRPort;
|
||||
|
||||
DeviceInfo.DeviceChannelInfo deviceChannelInfo = new DeviceInfo.DeviceChannelInfo();
|
||||
deviceChannelInfo.setChannelId(channelNum);
|
||||
deviceChannelInfo.setChannelName(channelName);
|
||||
deviceChannelInfo.setChannelIp(ip);
|
||||
deviceChannelInfo.setChannelPort(wDVRPort);
|
||||
deviceChannelInfo.setChannelAccount(sUserName);
|
||||
deviceChannelInfo.setChannelPwd(sPassword);
|
||||
deviceChannelInfo.setChannelStatus(0);
|
||||
// 通道是否在线
|
||||
byte byEnable = lpOutBuffer.struStreamMode[i].uGetStream.struChanInfo.byEnable;
|
||||
deviceChannelInfo.setChannelStatus((int) byEnable);
|
||||
channelInfo.add(deviceChannelInfo);
|
||||
num++;
|
||||
}
|
||||
}
|
||||
return deviceInfo;
|
||||
}
|
||||
|
||||
public static void isAPI(int lUserID, String url) {
|
||||
// 输入参数
|
||||
HCNetSDK.NET_DVR_XML_CONFIG_INPUT strInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT();
|
||||
strInput.dwSize = strInput.size(); // 初始化结构体内存
|
||||
|
||||
// 2. 构造URL - 必须包含 \r\n 结束符
|
||||
// String url = "GET /ISAPI/Intelligent/capabilities\r\n";
|
||||
byte[] urlBytes = url.getBytes();
|
||||
Memory urlMemory = new Memory(urlBytes.length + 1); // +1 for null terminator
|
||||
urlMemory.write(0, urlBytes, 0, urlBytes.length);
|
||||
urlMemory.setByte(urlBytes.length, (byte) 0); // 添加NUL终止符
|
||||
|
||||
strInput.lpRequestUrl = urlMemory;
|
||||
strInput.dwRequestUrlLen = urlBytes.length; // 不包括NUL终止符
|
||||
|
||||
// 3. 输入缓冲区设为空指针
|
||||
strInput.lpInBuffer = Pointer.NULL;
|
||||
strInput.dwInBufferSize = 0;
|
||||
|
||||
|
||||
// 输出参数
|
||||
HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT strOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
|
||||
strOutput.dwSize = strOutput.size();
|
||||
|
||||
// 5. 分配输出缓冲区 (8KB)
|
||||
int outBufSize = 8 * 1024;
|
||||
Memory outBuffer = new Memory(outBufSize);
|
||||
outBuffer.clear(); // 清零缓冲区
|
||||
|
||||
// 6. 分配状态缓冲区 (1KB)
|
||||
int statusSize = 1024;
|
||||
Memory statusBuffer = new Memory(statusSize);
|
||||
statusBuffer.clear(); // 清零缓冲区
|
||||
|
||||
strOutput.lpOutBuffer = outBuffer;
|
||||
strOutput.dwOutBufferSize = outBufSize;
|
||||
strOutput.lpStatusBuffer = statusBuffer;
|
||||
strOutput.dwStatusSize = statusSize;
|
||||
|
||||
// 7. 调用前写入结构体
|
||||
strOutput.write(); // 将Java结构体写入本地内存
|
||||
strOutput.write(); // 将Java结构体写入本地内存
|
||||
|
||||
// 调用SDK方法
|
||||
boolean success = hcNetSDK.NET_DVR_STDXMLConfig(lUserID, strInput, strOutput);
|
||||
|
||||
if (!success) {
|
||||
int errorCode = hcNetSDK.NET_DVR_GetLastError();
|
||||
System.err.println("NET_DVR_STDXMLConfig failed, error code: " + errorCode);
|
||||
|
||||
// 打印状态信息帮助调试
|
||||
if (strOutput.dwReturnedXMLSize > 0) {
|
||||
String status = statusBuffer.getString(0);
|
||||
System.err.println("Status: " + status);
|
||||
}
|
||||
} else {
|
||||
System.out.println("NET_DVR_STDXMLConfig successfully!");
|
||||
|
||||
// 9. 读取前同步结构体字段
|
||||
strOutput.read(); // 从本地内存读取更新后的结构体
|
||||
|
||||
// 检查实际返回的数据大小
|
||||
int returnedSize = strOutput.dwReturnedXMLSize;
|
||||
if (returnedSize > 0) {
|
||||
// 使用正确的长度读取字符串
|
||||
String xmlResponse = outBuffer.getString(0);
|
||||
System.out.println("Response size: " + returnedSize);
|
||||
System.out.println(xmlResponse);
|
||||
} else {
|
||||
System.out.println("No data returned");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,642 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.sdk.hik.common.ErrorCode;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
|
||||
/**
|
||||
* @create 2021-03-12-13:53
|
||||
* 以卡为中心,先下发卡参数(可以一起下发工号),再根据卡号下发人脸、指纹等参数
|
||||
* 卡管理模块,实现功能:卡下发、卡获取(单张、所有)、卡删除(单张、所有)、卡计划模块设置
|
||||
*/
|
||||
@Slf4j
|
||||
public class CardService extends SdkBaseServer {
|
||||
|
||||
public static short iPlanTemplateNumber;
|
||||
//设备字符集
|
||||
|
||||
/**
|
||||
* 卡下发
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param CardNo 卡号
|
||||
* @param iPlanTemplateNumber 关联门计划模板,计划模板的配置可以参考卡计划模板配置模块,(下发卡前要设置好计划模板)
|
||||
* @throws UnsupportedEncodingException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public static void setOneCard(int lUserID, String CardNo, short iPlanTemplateNumber) throws UnsupportedEncodingException, InterruptedException {
|
||||
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
|
||||
struCardCond.read();
|
||||
struCardCond.dwSize = struCardCond.size();
|
||||
struCardCond.dwCardNum = 1; //下发一张
|
||||
struCardCond.write();
|
||||
Pointer ptrStruCond = struCardCond.getPointer();
|
||||
int m_lSetCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD, ptrStruCond, struCardCond.size(), null, null);
|
||||
if (m_lSetCardCfgHandle == -1) {
|
||||
System.out.println("建立下发卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("建立下发卡长连接成功!");
|
||||
}
|
||||
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
|
||||
struCardRecord.read();
|
||||
struCardRecord.dwSize = struCardRecord.size();
|
||||
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
|
||||
struCardRecord.byCardNo[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < CardNo.length(); i++) {
|
||||
struCardRecord.byCardNo[i] = CardNo.getBytes()[i];
|
||||
}
|
||||
struCardRecord.byCardType = 1; //普通卡
|
||||
struCardRecord.byLeaderCard = 0; //是否为首卡,0-否,1-是
|
||||
struCardRecord.byUserType = 0; //用户类型:0– 普通用户,1- 管理员用户
|
||||
//门权限(梯控的楼层权限、锁权限),数组下标对应门编号-1,值为1表示有权限,0表示无权限
|
||||
struCardRecord.byDoorRight[0] = 1; //1层有权限
|
||||
struCardRecord.byDoorRight[1] = 1; //2层有权限
|
||||
struCardRecord.wCardRightPlan[0] = iPlanTemplateNumber; //关联门计划模板,计划模板的配置可以参考卡计划模板配置模块,(下发卡前要设置好计划模板)
|
||||
struCardRecord.struValid.byEnable = 1; //卡有效期使能,下面是卡有效期从2000-1-1 11:11:11到2030-1-1 11:11:11
|
||||
struCardRecord.struValid.byBeginTimeFlag = 1;
|
||||
struCardRecord.struValid.byEnableTimeFlag = 1;
|
||||
struCardRecord.struValid.struBeginTime.wYear = 2023;
|
||||
struCardRecord.struValid.struBeginTime.byMonth = 1;
|
||||
struCardRecord.struValid.struBeginTime.byDay = 1;
|
||||
struCardRecord.struValid.struBeginTime.byHour = 0;
|
||||
struCardRecord.struValid.struBeginTime.byMinute = 0;
|
||||
struCardRecord.struValid.struBeginTime.bySecond = 0;
|
||||
struCardRecord.struValid.struEndTime.wYear = 2030;
|
||||
struCardRecord.struValid.struEndTime.byMonth = 12;
|
||||
struCardRecord.struValid.struEndTime.byDay = 30;
|
||||
struCardRecord.struValid.struEndTime.byHour = 23;
|
||||
struCardRecord.struValid.struEndTime.byMinute = 59;
|
||||
struCardRecord.struValid.struEndTime.bySecond = 59;
|
||||
|
||||
struCardRecord.write();
|
||||
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
|
||||
struCardStatus.read();
|
||||
struCardStatus.dwSize = struCardStatus.size();
|
||||
struCardStatus.write();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
while (true) {
|
||||
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lSetCardCfgHandle, struCardRecord.getPointer(), struCardRecord.size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
|
||||
struCardStatus.read();
|
||||
if (dwState == -1) {
|
||||
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
|
||||
System.out.println("配置等待");
|
||||
Thread.sleep(10);
|
||||
continue;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
|
||||
System.out.println("下发卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
|
||||
System.out.println("下发卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
|
||||
if (struCardStatus.dwErrorCode != 0) {
|
||||
System.out.println("下发卡成功,但是错误码信息: " + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
|
||||
} else {
|
||||
System.out.println("下发卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
|
||||
}
|
||||
continue;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
|
||||
System.out.println("下发卡完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle)) {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量卡号下发
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param CardNo 卡号
|
||||
* @param iEmployeeNo 工号
|
||||
* @param iNum 下发张数
|
||||
* @throws UnsupportedEncodingException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public static void setMultiCard(int lUserID, String[] CardNo, int[] iEmployeeNo, int iNum) throws UnsupportedEncodingException, InterruptedException {
|
||||
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
|
||||
struCardCond.read();
|
||||
struCardCond.dwSize = struCardCond.size();
|
||||
struCardCond.dwCardNum = iNum; //下发张数
|
||||
struCardCond.write();
|
||||
Pointer ptrStruCond = struCardCond.getPointer();
|
||||
int m_lSetMultiCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD, ptrStruCond, struCardCond.size(), null, null);
|
||||
if (m_lSetMultiCardCfgHandle == -1) {
|
||||
System.out.println("建立下发卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("建立下发卡长连接成功!");
|
||||
}
|
||||
HCNetSDK.NET_DVR_CARD_RECORD[] struCardRecord = (HCNetSDK.NET_DVR_CARD_RECORD[]) new HCNetSDK.NET_DVR_CARD_RECORD().toArray(iNum);
|
||||
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
|
||||
struCardStatus.read();
|
||||
struCardStatus.dwSize = struCardStatus.size();
|
||||
struCardStatus.write();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
for (int i = 0; i < iNum; i++) {
|
||||
struCardRecord[i].read();
|
||||
struCardRecord[i].dwSize = struCardRecord[i].size();
|
||||
for (int j = 0; j < HCNetSDK.ACS_CARD_NO_LEN; j++) {
|
||||
struCardRecord[i].byCardNo[j] = 0;
|
||||
}
|
||||
System.arraycopy(CardNo[i].getBytes(), 0, struCardRecord[i].byCardNo, 0, CardNo[i].getBytes().length);
|
||||
struCardRecord[i].byCardType = 1; //普通卡
|
||||
struCardRecord[i].byLeaderCard = 0; //是否为首卡,0-否,1-是
|
||||
struCardRecord[i].byUserType = 0;
|
||||
struCardRecord[i].byDoorRight[0] = 1; //门1有权限
|
||||
struCardRecord[i].wCardRightPlan[0] = iPlanTemplateNumber;//关联门计划模板,使用了前面配置的计划模板
|
||||
struCardRecord[i].struValid.byEnable = 1; //卡有效期使能,下面是卡有效期从2000-1-1 11:11:11到2030-1-1 11:11:11
|
||||
struCardRecord[i].struValid.struBeginTime.wYear = 2000;
|
||||
struCardRecord[i].struValid.struBeginTime.byMonth = 1;
|
||||
struCardRecord[i].struValid.struBeginTime.byDay = 1;
|
||||
struCardRecord[i].struValid.struBeginTime.byHour = 11;
|
||||
struCardRecord[i].struValid.struBeginTime.byMinute = 11;
|
||||
struCardRecord[i].struValid.struBeginTime.bySecond = 11;
|
||||
struCardRecord[i].struValid.struEndTime.wYear = 2030;
|
||||
struCardRecord[i].struValid.struEndTime.byMonth = 1;
|
||||
struCardRecord[i].struValid.struEndTime.byDay = 1;
|
||||
struCardRecord[i].struValid.struEndTime.byHour = 11;
|
||||
struCardRecord[i].struValid.struEndTime.byMinute = 11;
|
||||
struCardRecord[i].struValid.struEndTime.bySecond = 11;
|
||||
struCardRecord[i].dwEmployeeNo = iEmployeeNo[i]; //工号
|
||||
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
|
||||
byte[] strCardName = "张三".getBytes("GBK"); //姓名
|
||||
for (int j = 0; j < HCNetSDK.NAME_LEN; j++) {
|
||||
struCardRecord[i].byName[j] = 0;
|
||||
}
|
||||
System.arraycopy(strCardName, 0, struCardRecord[i].byName, 0, strCardName.length);
|
||||
}
|
||||
if (iCharEncodeType == 6) {
|
||||
byte[] strCardName = "张三".getBytes("UTF-8"); //姓名
|
||||
for (int j = 0; j < HCNetSDK.NAME_LEN; j++) {
|
||||
struCardRecord[i].byName[j] = 0;
|
||||
}
|
||||
System.arraycopy(strCardName, 0, struCardRecord[i].byName, 0, strCardName.length);
|
||||
}
|
||||
struCardRecord[i].write();
|
||||
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lSetMultiCardCfgHandle, struCardRecord[i].getPointer(), struCardRecord[i].size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
|
||||
struCardStatus.read();
|
||||
if (dwState == -1) {
|
||||
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
|
||||
System.out.println("下发卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
//可以继续下发下一个
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
|
||||
System.out.println("下发卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ",错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
//异常是长连接异常,不能继续下发后面的数据,需要重新建立长连接
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
|
||||
if (struCardStatus.dwErrorCode != 0) {
|
||||
System.out.println("下发卡失败,错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
|
||||
} else {
|
||||
System.out.println("下发卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
|
||||
}
|
||||
//可以继续下发下一个
|
||||
} else {
|
||||
System.out.println("其他状态:" + dwState);
|
||||
}
|
||||
}
|
||||
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lSetMultiCardCfgHandle)) {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取(查询)一张卡
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param CardNo 卡号
|
||||
*/
|
||||
public static void getOneCard(int lUserID, String CardNo) {
|
||||
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
|
||||
struCardCond.read();
|
||||
struCardCond.dwSize = struCardCond.size();
|
||||
struCardCond.dwCardNum = 1; //查询一个卡参数
|
||||
struCardCond.write();
|
||||
Pointer ptrStruCond = struCardCond.getPointer();
|
||||
int m_lGetCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD, ptrStruCond, struCardCond.size(), null, null);
|
||||
if (m_lGetCardCfgHandle == -1) {
|
||||
System.out.println("建立查询卡参数长连接失败,错误码为:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("建立查询卡参数长连接成功!");
|
||||
}
|
||||
//查找指定卡号的参数,需要下发查找的卡号条件
|
||||
HCNetSDK.NET_DVR_CARD_SEND_DATA struCardNo = new HCNetSDK.NET_DVR_CARD_SEND_DATA();
|
||||
struCardNo.read();
|
||||
struCardNo.dwSize = struCardNo.size();
|
||||
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
|
||||
struCardNo.byCardNo[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < CardNo.length(); i++) {
|
||||
struCardNo.byCardNo[i] = CardNo.getBytes()[i];
|
||||
}
|
||||
struCardNo.write();
|
||||
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
|
||||
struCardRecord.read();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
while (true) {
|
||||
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lGetCardCfgHandle, struCardNo.getPointer(), struCardNo.size(),
|
||||
struCardRecord.getPointer(), struCardRecord.size(), pInt);
|
||||
struCardRecord.read();
|
||||
if (dwState == -1) {
|
||||
System.out.println("NET_DVR_SendWithRecvRemoteConfig查询卡参数调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
|
||||
System.out.println("配置等待");
|
||||
try {
|
||||
Thread.sleep(10);
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
continue;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
|
||||
System.out.println("获取卡参数失败, 卡号: " + CardNo);
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
|
||||
System.out.println("获取卡参数异常, 卡号: " + CardNo);
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
|
||||
try {
|
||||
String strName = "";
|
||||
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
|
||||
strName = new String(struCardRecord.byName, "GBK").trim();
|
||||
}
|
||||
if (iCharEncodeType == 6) {
|
||||
strName = new String(struCardRecord.byName, "UTF-8").trim();
|
||||
}
|
||||
//获取的卡信息打印
|
||||
System.out.println("获取卡参数成功, 卡号: " + new String(struCardRecord.byCardNo).trim()
|
||||
+ ", 卡类型:" + struCardRecord.byCardType
|
||||
+ ", 姓名:" + strName + ",卡计划模板:" + Short.parseShort(String.valueOf(struCardRecord.wCardRightPlan[0])));
|
||||
System.out.println("是否限制起始时间的标志byBeginTimeFlag :" + struCardRecord.struValid.byEnableTimeFlag);
|
||||
System.out.println("是否限制终止时间的标志byEnableTimeFlag :" + struCardRecord.struValid.byBeginTimeFlag);
|
||||
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
|
||||
System.out.println("获取卡参数完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lGetCardCfgHandle)) {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有卡
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
*/
|
||||
public static void getAllCard(int lUserID) {
|
||||
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
|
||||
struCardCond.read();
|
||||
struCardCond.dwSize = struCardCond.size();
|
||||
struCardCond.dwCardNum = 0xffffffff; //查询所有卡
|
||||
struCardCond.write();
|
||||
Pointer ptrStruCond = struCardCond.getPointer();
|
||||
int m_lGetAllCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD, ptrStruCond, struCardCond.size(), null, null);
|
||||
if (m_lGetAllCardCfgHandle == -1) {
|
||||
System.out.println("建立查询卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("建立查询卡长连接成功!");
|
||||
}
|
||||
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
|
||||
struCardRecord.read();
|
||||
struCardRecord.dwSize = struCardRecord.size();
|
||||
struCardRecord.write();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
while (true) {
|
||||
int dwState = getHcNetSDK().NET_DVR_GetNextRemoteConfig(m_lGetAllCardCfgHandle, struCardRecord.getPointer(), struCardRecord.size());
|
||||
struCardRecord.read();
|
||||
if (dwState == -1) {
|
||||
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
|
||||
System.out.println("配置等待");
|
||||
try {
|
||||
Thread.sleep(10);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
continue;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
|
||||
System.out.println("获取卡参数失败");
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
|
||||
System.out.println("获取卡参数异常");
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
|
||||
try {
|
||||
String strName = "";
|
||||
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
|
||||
strName = new String(struCardRecord.byName, "GBK").trim();
|
||||
}
|
||||
if (iCharEncodeType == 6) {
|
||||
strName = new String(struCardRecord.byName, "UTF-8").trim();
|
||||
}
|
||||
//获取的卡信息打印
|
||||
System.out.println("获取卡参数成功, 卡号: " + new String(struCardRecord.byCardNo).trim()
|
||||
+ ", 卡类型:" + struCardRecord.byCardType
|
||||
+ ", 姓名:" + strName);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
|
||||
System.out.println("获取卡参数完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lGetAllCardCfgHandle)) {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除单张卡(删除单张卡号之前要先删除这张卡关联的人脸和指纹信息)
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param CardNo 卡号
|
||||
* @throws UnsupportedEncodingException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public static void delOneCard(int lUserID, String CardNo) throws UnsupportedEncodingException, InterruptedException {
|
||||
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
|
||||
struCardCond.read();
|
||||
struCardCond.dwSize = struCardCond.size();
|
||||
struCardCond.dwCardNum = 1; //删除一张卡号
|
||||
struCardCond.write();
|
||||
Pointer ptrStruCond = struCardCond.getPointer();
|
||||
int m_lDelCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_DEL_CARD, ptrStruCond, struCardCond.size(), null, null);
|
||||
if (m_lDelCardCfgHandle == -1) {
|
||||
System.out.println("建立删除卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("建立删除卡长连接成功!");
|
||||
}
|
||||
HCNetSDK.NET_DVR_CARD_SEND_DATA struCardData = new HCNetSDK.NET_DVR_CARD_SEND_DATA();
|
||||
struCardData.read();
|
||||
struCardData.dwSize = struCardData.size();
|
||||
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
|
||||
struCardData.byCardNo[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < CardNo.length(); i++) {
|
||||
struCardData.byCardNo[i] = CardNo.getBytes()[i];
|
||||
}
|
||||
struCardData.write();
|
||||
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
|
||||
struCardStatus.read();
|
||||
struCardStatus.dwSize = struCardStatus.size();
|
||||
struCardStatus.write();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
while (true) {
|
||||
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lDelCardCfgHandle, struCardData.getPointer(), struCardData.size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
|
||||
struCardStatus.read();
|
||||
if (dwState == -1) {
|
||||
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
|
||||
System.out.println("配置等待");
|
||||
Thread.sleep(10);
|
||||
continue;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
|
||||
System.out.println("删除卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ",错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
|
||||
System.out.println("删除卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
|
||||
break;
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
|
||||
if (struCardStatus.dwErrorCode != 0) {
|
||||
System.out.println("删除卡成功,但是错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
|
||||
} else {
|
||||
System.out.println("删除卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
|
||||
}
|
||||
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
|
||||
System.out.println("删除卡完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lDelCardCfgHandle)) {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设备中要清除所有已经下发的卡号
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
*/
|
||||
public static void cleanCardInfo(int lUserID) {
|
||||
//清空所有卡号
|
||||
HCNetSDK.NET_DVR_ACS_PARAM_TYPE struAcsPapamType = new HCNetSDK.NET_DVR_ACS_PARAM_TYPE();
|
||||
struAcsPapamType.read();
|
||||
struAcsPapamType.dwSize = struAcsPapamType.size();
|
||||
struAcsPapamType.dwParamType = HCNetSDK.ACS_PARAM_CARD; //清空卡参数
|
||||
struAcsPapamType.wLocalControllerID = 0; // 就地控制器序号[1,255],0代表门禁主机
|
||||
struAcsPapamType.write();
|
||||
boolean b_AcsCard = getHcNetSDK().NET_DVR_RemoteControl(lUserID, HCNetSDK.NET_DVR_CLEAR_ACS_PARAM, struAcsPapamType.getPointer(), struAcsPapamType.size());
|
||||
if (!b_AcsCard) {
|
||||
System.out.println("清空卡号错误,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
System.out.println("清空卡号成功");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 卡计划模板配置
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param iPlanTemplateNumber 计划模板编号,从1开始,最大值从门禁能力集获取
|
||||
*/
|
||||
public static void setCardTemplate(int lUserID, int iPlanTemplateNumber) {
|
||||
//设置卡权限计划模板参数
|
||||
HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND struPlanCond = new HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND();
|
||||
struPlanCond.dwSize = struPlanCond.size();
|
||||
struPlanCond.dwPlanTemplateNumber = iPlanTemplateNumber;//计划模板编号,从1开始,最大值从门禁能力集获取
|
||||
struPlanCond.wLocalControllerID = 0;//就地控制器序号[1,64],0表示门禁主机
|
||||
struPlanCond.write();
|
||||
HCNetSDK.NET_DVR_PLAN_TEMPLATE struPlanTemCfg = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
|
||||
struPlanTemCfg.dwSize = struPlanTemCfg.size();
|
||||
struPlanTemCfg.byEnable = 1; //是否使能:0- 否,1- 是
|
||||
struPlanTemCfg.dwWeekPlanNo = 2;//周计划编号,0表示无效
|
||||
struPlanTemCfg.dwHolidayGroupNo[0] = 0;//假日组编号,按值表示,采用紧凑型排列,中间遇到0则后续无效
|
||||
byte[] byTemplateName;
|
||||
try {
|
||||
byTemplateName = "CardTemplatePlan_2".getBytes("GBK");
|
||||
//计划模板名称
|
||||
for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
|
||||
struPlanTemCfg.byTemplateName[i] = 0;
|
||||
}
|
||||
System.arraycopy(byTemplateName, 0, struPlanTemCfg.byTemplateName, 0, byTemplateName.length);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
struPlanTemCfg.write();
|
||||
IntByReference pInt = new IntByReference(0);
|
||||
Pointer lpStatusList = pInt.getPointer();
|
||||
boolean b = getHcNetSDK().NET_DVR_SetDeviceConfig(
|
||||
lUserID,
|
||||
HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50,
|
||||
1,
|
||||
struPlanCond.getPointer(),
|
||||
struPlanCond.size(),
|
||||
lpStatusList,
|
||||
struPlanTemCfg.getPointer(),
|
||||
struPlanTemCfg.size()
|
||||
);
|
||||
if (!b) {
|
||||
System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
}
|
||||
System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50成功!");
|
||||
//获取卡权限周计划参数
|
||||
HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND();
|
||||
struWeekPlanCond.dwSize = struWeekPlanCond.size();
|
||||
struWeekPlanCond.dwWeekPlanNumber = 2;
|
||||
struWeekPlanCond.wLocalControllerID = 0;
|
||||
HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
|
||||
struWeekPlanCond.write();
|
||||
struWeekPlanCfg.write();
|
||||
Pointer lpCond = struWeekPlanCond.getPointer();
|
||||
Pointer lpInbuferCfg = struWeekPlanCfg.getPointer();
|
||||
boolean b2 = getHcNetSDK().NET_DVR_GetDeviceConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size());
|
||||
if (!b2) {
|
||||
System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
}
|
||||
struWeekPlanCfg.read();
|
||||
struWeekPlanCfg.byEnable = 1; //是否使能:0- 否,1- 是
|
||||
/**避免时间段交叉,先初始化, 七天八小时*/
|
||||
for (int i = 0; i < 7; i++) {
|
||||
for (int j = 0; j < 8; j++) {
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
|
||||
}
|
||||
}
|
||||
/**一周7天,全天24小时*/
|
||||
for (int i = 0; i < 7; i++) {
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 14;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 16;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0;
|
||||
}
|
||||
/**一周7天,每天设置2个时间段*/
|
||||
/*for(int i=0;i<7;i++)
|
||||
{
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 11;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 13;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 30;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 19;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 59;
|
||||
}*/
|
||||
struWeekPlanCfg.write();
|
||||
//设置卡权限周计划参数
|
||||
boolean b1 = getHcNetSDK().NET_DVR_SetDeviceConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size());
|
||||
if (!b1) {
|
||||
System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取/设置事件卡号联动配置参数
|
||||
*
|
||||
* @param userID 登录设备句柄ID
|
||||
*/
|
||||
public static void SetEventCardLingageCfg(int userID) {
|
||||
HCNetSDK.NET_DVR_EVENT_CARD_LINKAGE_COND struEventCardLinkCond = new HCNetSDK.NET_DVR_EVENT_CARD_LINKAGE_COND();
|
||||
struEventCardLinkCond.dwSize = struEventCardLinkCond.size();
|
||||
struEventCardLinkCond.dwEventID = 1;
|
||||
struEventCardLinkCond.wLocalControllerID = 0;
|
||||
struEventCardLinkCond.write();
|
||||
HCNetSDK.NET_DVR_EVENT_LINKAGE_CARD_CFG_V51 netDvrEventCardLinkageCfgV51 = new HCNetSDK.NET_DVR_EVENT_LINKAGE_CARD_CFG_V51();
|
||||
netDvrEventCardLinkageCfgV51.read();
|
||||
netDvrEventCardLinkageCfgV51.dwSize = netDvrEventCardLinkageCfgV51.size();
|
||||
netDvrEventCardLinkageCfgV51.write();
|
||||
Pointer lpCond1 = struEventCardLinkCond.getPointer();
|
||||
Pointer lpInbuferCfg1 = netDvrEventCardLinkageCfgV51.getPointer();
|
||||
IntByReference intByReference = new IntByReference(0);
|
||||
Pointer lpStatusList1 = intByReference.getPointer();
|
||||
boolean b_GetCfg = getHcNetSDK().NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_EVENT_CARD_LINKAGE_CFG_V51, 1,
|
||||
lpCond1, struEventCardLinkCond.size(), lpStatusList1, lpInbuferCfg1, netDvrEventCardLinkageCfgV51.size());
|
||||
if (b_GetCfg) {
|
||||
System.out.println("获取事件/卡号联动配置参数成功");
|
||||
netDvrEventCardLinkageCfgV51.uLinkageInfo.setType(HCNetSDK.NET_DVR_EVENT_LINKAGE_INFO.class);
|
||||
netDvrEventCardLinkageCfgV51.read();
|
||||
System.out.printf("是否联动抓拍: %d\n", netDvrEventCardLinkageCfgV51.byCapturePic);
|
||||
System.out.printf("事件源 ID: %d\n", netDvrEventCardLinkageCfgV51.dwEventSourceID);
|
||||
System.out.printf("事件联动参数-事件主类型: %s\n", netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wMainEventType);
|
||||
System.out.printf("事件联动参数-事件次类型: %s\n", netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wSubEventType);
|
||||
} else {
|
||||
System.out.println("获取事件/卡号联动配置参数失败,错误码为 " + getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
}
|
||||
|
||||
netDvrEventCardLinkageCfgV51.dwEventSourceID = 1;
|
||||
netDvrEventCardLinkageCfgV51.byProMode = 0;
|
||||
netDvrEventCardLinkageCfgV51.byCapturePic = 1;//联动抓图
|
||||
netDvrEventCardLinkageCfgV51.byRecordVideo = 0;
|
||||
netDvrEventCardLinkageCfgV51.byMainDevStopBuzzer = 0;
|
||||
netDvrEventCardLinkageCfgV51.wAudioDisplayID = 0;
|
||||
netDvrEventCardLinkageCfgV51.byAudioDisplayMode = 0;
|
||||
netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wMainEventType = 3;//事件主类型,0-设备事件,1-报警输入事件,2-门事件,3-读卡器事件
|
||||
netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wSubEventType = 25;//EVENT_ACS_FINGERPRINT_PASSWD_VERIFY_PASS;
|
||||
struEventCardLinkCond.dwEventID = 1;
|
||||
struEventCardLinkCond.wLocalControllerID = 0;
|
||||
struEventCardLinkCond.write();
|
||||
netDvrEventCardLinkageCfgV51.write();
|
||||
boolean b = getHcNetSDK().NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_EVENT_CARD_LINKAGE_CFG_V51, 1, lpCond1, struEventCardLinkCond.size(),
|
||||
lpStatusList1, lpInbuferCfg1, netDvrEventCardLinkageCfgV51.size());
|
||||
if (!b) {
|
||||
int iErr = getHcNetSDK().NET_DVR_GetLastError();
|
||||
System.out.println("设置事件/卡号联动配置参数失败,错误码为" + iErr);
|
||||
} else {
|
||||
System.out.println("设置事件/卡号联动配置参数成功");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -1,192 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
/**
|
||||
* 梯控参数配置、梯控计划模板配置,远程梯控
|
||||
*
|
||||
* @create 2021-03-11-14:12
|
||||
*/
|
||||
@Slf4j
|
||||
public class DoorService extends SdkBaseServer {
|
||||
|
||||
/**
|
||||
* 获取梯控楼层参数
|
||||
*
|
||||
* @param lUserID
|
||||
* @param floor 楼层编号
|
||||
*/
|
||||
public static void GetAndSetFloorCfg(int lUserID, int floor) {
|
||||
/**获取梯控楼层参数*/
|
||||
HCNetSDK.NET_DVR_DOOR_CFG struFloorCfg = new HCNetSDK.NET_DVR_DOOR_CFG();
|
||||
struFloorCfg.dwSize = struFloorCfg.size();
|
||||
struFloorCfg.write();
|
||||
IntByReference intByReference = new IntByReference(0);
|
||||
boolean b_Get = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_DOOR_CFG, 1, struFloorCfg.getPointer(),
|
||||
struFloorCfg.size(), intByReference);
|
||||
if (!b_Get) {
|
||||
log.info("获取梯控楼层参数,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
log.info("获取梯控楼层参数成功");
|
||||
struFloorCfg.read();
|
||||
/**
|
||||
* 楼层继电器动作时间:普通卡刷卡后,继电器闭合时间。即刷卡授权后可使用电梯按钮的时间。默认5秒。
|
||||
* 梯控访客延迟时间:访客呼梯后,访客可使用电梯按钮的时间。默认5分钟。
|
||||
*/
|
||||
log.info("楼层名称:{}", new String(struFloorCfg.byDoorName).trim());
|
||||
log.info("楼层继电器动作时间: {}", struFloorCfg.byOpenDuration);
|
||||
log.info("关门延迟时间: {}", struFloorCfg.byDisabledOpenDuration);
|
||||
log.info("梯控访客延迟时间: {}", struFloorCfg.byLadderControlDelayTime);
|
||||
}
|
||||
|
||||
/**设置梯控楼层参数*/
|
||||
struFloorCfg.byDoorName = "floor111".getBytes();
|
||||
struFloorCfg.write();
|
||||
boolean b_Set = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_CFG, 1, struFloorCfg.getPointer(), struFloorCfg.size());
|
||||
if (!b_Set) {
|
||||
log.info("设置梯控楼层参数成功,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
} else {
|
||||
log.info("设置梯控楼层参数成功!!!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 梯控计划模板配置
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param iDoorTemplateNo 计划模板编号,为0表示取消关联,恢复默认状态(普通状态)
|
||||
*/
|
||||
public static void doorTemplate(int lUserID, int iDoorTemplateNo, int floorID) {
|
||||
//设置梯控计划参数:对不同楼层下发不同的权限计划模板
|
||||
HCNetSDK.NET_DVR_DOOR_STATUS_PLAN struDoorStatus = new HCNetSDK.NET_DVR_DOOR_STATUS_PLAN();
|
||||
struDoorStatus.read();
|
||||
struDoorStatus.dwSize = struDoorStatus.size();
|
||||
struDoorStatus.dwTemplateNo = iDoorTemplateNo; //计划模板编号,为0表示取消关联、恢复默认状态(普通状态)。非0回复关联(门序号,与相同序号的门状态计划模板关联)
|
||||
struDoorStatus.write();
|
||||
boolean b_SetDoorStatus = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_STATUS_PLAN, floorID, struDoorStatus.getPointer(), struDoorStatus.size());
|
||||
if (!b_SetDoorStatus) {
|
||||
log.info("设置梯控计划参数,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
log.info("设置梯控计划参数成功");
|
||||
}
|
||||
//设置梯控计划模板参数
|
||||
HCNetSDK.NET_DVR_PLAN_TEMPLATE struDoorTemp = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
|
||||
struDoorTemp.read();
|
||||
struDoorTemp.dwSize = struDoorTemp.size();
|
||||
struDoorTemp.byEnable = 1; //使能
|
||||
struDoorTemp.dwWeekPlanNo = 1; //周计划模板编号;
|
||||
byte[] byTemplateName;
|
||||
try {
|
||||
byTemplateName = "DoorTemplatePlan_1".getBytes("GBK");
|
||||
//计划模板名称
|
||||
for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
|
||||
struDoorTemp.byTemplateName[i] = 0;
|
||||
}
|
||||
System.arraycopy(byTemplateName, 0, struDoorTemp.byTemplateName, 0, byTemplateName.length);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
struDoorTemp.write();
|
||||
boolean b_SetDoorTemp = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_STATUS_PLAN_TEMPLATE, iDoorTemplateNo, struDoorTemp.getPointer(), struDoorTemp.size());
|
||||
if (!b_SetDoorTemp) {
|
||||
log.info("设置梯控计划模板失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
log.info("设置梯控计划模板成功");
|
||||
}
|
||||
//获取(设置)门状态周计划参数
|
||||
HCNetSDK.NET_DVR_WEEK_PLAN_CFG struDoorWeekPlan = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
|
||||
struDoorWeekPlan.read();
|
||||
Pointer pstruDoorWeekPlan = struDoorWeekPlan.getPointer();
|
||||
IntByReference Ipint = new IntByReference(0);
|
||||
boolean b_GetPlan = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_WEEK_PLAN_CFG, 1, pstruDoorWeekPlan, struDoorWeekPlan.size(), Ipint);
|
||||
if (!b_GetPlan) {
|
||||
log.info("获取梯控周计划参数失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
log.info("获取梯控周计划参数成功");
|
||||
}
|
||||
struDoorWeekPlan.read();
|
||||
struDoorWeekPlan.byEnable = 1; //是否使能:0- 否,1- 是
|
||||
/**避免时间段交叉,先初始化*/
|
||||
for (int i = 0; i < 7; i++) {
|
||||
for (int j = 0; j < 8; j++) {
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
|
||||
}
|
||||
}
|
||||
/**一周7天,全天24小时*/
|
||||
for (int i = 0; i < 7; i++) {
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
|
||||
//对接梯控主机需要下发此参数
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].byDoorStatus = 2; //2- 常开状态(梯控的自由状态),3- 常闭状态(梯控的禁用状态)
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 23;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0;
|
||||
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0;
|
||||
}
|
||||
/**一周7天,每天设置2个时间段*/
|
||||
/*for(int i=0;i<7;i++) {
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 11;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 13;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 30;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 19;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 59;
|
||||
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 59;
|
||||
}*/
|
||||
struDoorWeekPlan.write();
|
||||
boolean b_SetPlan = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_WEEK_PLAN_CFG, 2, pstruDoorWeekPlan, struDoorWeekPlan.size());
|
||||
if (!b_SetPlan) {
|
||||
log.info("设置门状态周计划参数失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
|
||||
return;
|
||||
} else {
|
||||
log.info("设置门状态周计划参数成功");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 远程梯控
|
||||
*
|
||||
* @param lUserID 用户登录句柄
|
||||
* @param lGatewayIndex 楼层编号,从1开始,-1表示对所有门(或者梯控的所有楼层)进行操作
|
||||
* @param dwStaic 命令值:0- 关闭(对于梯控,表示受控),1- 打开(对于梯控,表示开门),2- 常开(对于梯控,表示自由、通道状态),3- 常关(对于梯控,表示禁用),4- 恢复(梯控,普通状态),5- 访客呼梯(梯控),6- 住户呼梯(梯控)
|
||||
* 禁用**:电梯不可到达所选楼层。
|
||||
* **受控**:需刷卡后才可以按下所选楼层的按钮,电梯才到达指定楼层。
|
||||
* **自由**:所选楼层按钮一直有效。
|
||||
* **开门**:只能在指定时间内按下所选楼层的按钮。
|
||||
* **访客呼梯**:电梯到达一楼,访客进入电梯后仅可按下所选楼层的按钮。
|
||||
* **住户呼梯**:电梯自动到达所选楼层。
|
||||
*/
|
||||
|
||||
public static boolean controlGateway(int lUserID, int lGatewayIndex, int dwStaic) {
|
||||
boolean b = getHcNetSDK().NET_DVR_ControlGateway(lUserID, lGatewayIndex, dwStaic);
|
||||
log.info("楼层数据下发结果,楼层={},result={}", lGatewayIndex, b);
|
||||
if (!b) {
|
||||
int i = getHcNetSDK().NET_DVR_GetLastError();
|
||||
log.error("梯控控制失败, errCode={}", i);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
public class FaceService extends SdkBaseServer{
|
||||
}
|
@@ -1,155 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import jakarta.xml.bind.JAXBContext;
|
||||
import jakarta.xml.bind.JAXBException;
|
||||
import jakarta.xml.bind.Marshaller;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.Base64Utils;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
|
||||
import org.dromara.sis.sdk.hik.model.upload.SimpleMemory;
|
||||
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.HCNetSDK.IMPORT_DATA_TO_FACELIB;
|
||||
|
||||
/**
|
||||
* 海康上传服务
|
||||
*/
|
||||
@Slf4j
|
||||
public class FdLibUploadService extends SdkBaseServer {
|
||||
|
||||
/**
|
||||
* 上传文件到人脸库
|
||||
*
|
||||
* @param luserId 登录句柄
|
||||
* @return 返回上传句柄
|
||||
*/
|
||||
public static int uploadFile(int luserId, int libId) {
|
||||
HCNetSDK.NET_DVR_FACELIB_COND param = new HCNetSDK.NET_DVR_FACELIB_COND();
|
||||
param.dwSize = param.size();
|
||||
byte[] bytes = String.valueOf(libId).getBytes();
|
||||
System.arraycopy(bytes, 0, param.szFDID, 0, bytes.length);
|
||||
param.byConcurrent = 0; // 设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模)
|
||||
param.byCover = 1;
|
||||
param.byCustomFaceLibID = 0;
|
||||
param.byPictureSaveMode = 0;
|
||||
int dwInBufferSize = param.size();
|
||||
param.write();
|
||||
return hcNetSDK.NET_DVR_UploadFile_V40(luserId, IMPORT_DATA_TO_FACELIB, param.getPointer(), dwInBufferSize, null, null, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传数据发送
|
||||
*
|
||||
* @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值
|
||||
* @param data 上传文件的二进制数据
|
||||
* @param fileType 文件的类型
|
||||
* @return -1表示失败,大于等于0表示本次发送成功的字节数,未发送成功的剩余字节数可以再次调用该接口进行发送。
|
||||
*/
|
||||
public static int uploadSend(int lUploadHandle, byte[] data, byte fileType, FaceAppendData userInfo) throws JAXBException {
|
||||
HCNetSDK.NET_DVR_SEND_PARAM_IN param = new HCNetSDK.NET_DVR_SEND_PARAM_IN();
|
||||
SimpleMemory memory = new SimpleMemory(data.length);
|
||||
memory.write(0, data, 0, data.length);
|
||||
// 设置人像附加信息
|
||||
JAXBContext context = JAXBContext.newInstance(FaceAppendData.class);
|
||||
Marshaller marshaller = context.createMarshaller();
|
||||
// 转换为字符串
|
||||
StringWriter writer = new StringWriter();
|
||||
marshaller.marshal(userInfo, writer);
|
||||
String xmlString = writer.toString();
|
||||
byte[] faceBytes = xmlString.getBytes();
|
||||
SimpleMemory addendData = new SimpleMemory(faceBytes.length);
|
||||
addendData.write(0, faceBytes, 0, faceBytes.length);
|
||||
|
||||
param.pSendData = memory;
|
||||
param.dwSendDataLen = data.length;
|
||||
param.byPicType = fileType;
|
||||
param.pSendAppendData = addendData;
|
||||
param.dwSendAppendDataLen = faceBytes.length;
|
||||
return hcNetSDK.NET_DVR_UploadSend(lUploadHandle, param, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询上传数据进度
|
||||
*
|
||||
* @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值
|
||||
* @return -1表示函数调用失败,其他为上传的状态值见下表说明。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。
|
||||
* -1:表示调用失败
|
||||
* 1:上传成功
|
||||
* 2:正在上传
|
||||
* 3:上传失败
|
||||
* 其他状态码请参考sdk开发文档
|
||||
*/
|
||||
public static UploadStatus getUploadState(int lUploadHandle) {
|
||||
IntByReference reference = new IntByReference(0);
|
||||
int i = hcNetSDK.NET_DVR_GetUploadState(lUploadHandle, reference.getPointer());
|
||||
UploadStatus status = new UploadStatus();
|
||||
status.setStatusCode(i);
|
||||
status.setProcess(reference.getValue());
|
||||
return status;
|
||||
}
|
||||
|
||||
public static String getUploadResult(int lUploadHandle) {
|
||||
HCNetSDK.NET_DVR_UPLOAD_FILE_RET params = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET();
|
||||
params.write();
|
||||
Pointer lpOutBuffer = params.getPointer();
|
||||
int dwOutBufferSize = params.size();
|
||||
boolean b = hcNetSDK.NET_DVR_GetUploadResult(lUploadHandle, lpOutBuffer, dwOutBufferSize);
|
||||
if (b) {
|
||||
params.read();
|
||||
String url = new String(params.sUrl, StandardCharsets.UTF_8);
|
||||
if (StrUtil.isNotEmpty(url)) {
|
||||
return url.trim();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean uploadClose(int lUploadHandle) {
|
||||
// TRUE表示成功,FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。
|
||||
boolean b = hcNetSDK.NET_DVR_UploadClose(lUploadHandle);
|
||||
if (b) {
|
||||
log.info("文件上传关闭成功, lUploadHandle:{}", lUploadHandle);
|
||||
} else {
|
||||
int errorCode = hcNetSDK.NET_DVR_GetLastError();
|
||||
System.out.println("文件上传关闭失败, errorCode:" + errorCode);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
public static int download(int luserId, String url, HCNetSDK.DownloadCallBack callback) {
|
||||
HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM param = new HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM();
|
||||
byte[] fns = url.getBytes();
|
||||
System.arraycopy(fns, 0, param.sUrl, 0, fns.length);
|
||||
param.fnDownloadDataCB = callback;
|
||||
param.write();
|
||||
param.dwSize = param.size();
|
||||
int i = hcNetSDK.NET_DVR_StartDownload(luserId, 20, param, param.dwSize, null);
|
||||
if (i == -1) {
|
||||
log.info("发起图片下载失败,lDownloadHandle={}, errorCode={}", i, getErrorCode());
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭文件下载
|
||||
*
|
||||
* @param lDownloadHandle 下载句柄
|
||||
*/
|
||||
public static void stopDownload(int lDownloadHandle) {
|
||||
boolean b = hcNetSDK.NET_DVR_StopDownload(lDownloadHandle);
|
||||
if (b) {
|
||||
log.info("文件下载关闭成功, lDownloadHandle={}", lDownloadHandle);
|
||||
} else {
|
||||
System.out.println("文件下载关闭失败, errorCode:" + getErrorCode());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,58 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
|
||||
/**
|
||||
* 海康sdk接口服务
|
||||
*
|
||||
* @author LXJ
|
||||
* @since 25-07-08
|
||||
*/
|
||||
@Slf4j
|
||||
public class LoginService extends SdkBaseServer {
|
||||
|
||||
|
||||
/**
|
||||
* 登录设备,支持 V40 和 V30 版本,功能一致。
|
||||
*
|
||||
* @param ip 设备IP地址
|
||||
* @param port SDK端口,默认为设备的8000端口
|
||||
* @param user 设备用户名
|
||||
* @param psw 设备密码
|
||||
* @return 登录成功返回用户ID,失败返回-1
|
||||
*/
|
||||
public static int loginDevice(String ip, short port, String user, String psw) {
|
||||
// 创建设备登录信息和设备信息对象
|
||||
HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
|
||||
HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
|
||||
// 设置设备IP地址
|
||||
byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
|
||||
byte[] ipBytes = ip.getBytes();
|
||||
System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
|
||||
loginInfo.sDeviceAddress = deviceAddress;
|
||||
// 设置用户名和密码
|
||||
byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
|
||||
byte[] password = psw.getBytes();
|
||||
System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
|
||||
System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
|
||||
loginInfo.sUserName = userName;
|
||||
// 设置端口和登录模式
|
||||
loginInfo.wPort = port;
|
||||
loginInfo.bUseAsynLogin = false; // 同步登录
|
||||
loginInfo.byLoginMode = 0; // 使用SDK私有协议
|
||||
// 执行登录操作
|
||||
int userID = hcNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);
|
||||
if (userID == -1) {
|
||||
log.error("登录失败,错误码为: {}", hcNetSDK.NET_DVR_GetLastError());
|
||||
} else {
|
||||
log.info("设备[{}]登录成功.", ip);
|
||||
deviceInfo.read();
|
||||
//获取设备字符编码格式
|
||||
iCharEncodeType = deviceInfo.byCharEncodeType;
|
||||
}
|
||||
return userID; // 返回登录结果
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -1,140 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.common.osSelect.isWindows;
|
||||
|
||||
@Slf4j
|
||||
public class SdkBaseServer {
|
||||
|
||||
|
||||
public static HCNetSDK hcNetSDK;
|
||||
public static int iCharEncodeType = 0;
|
||||
/**
|
||||
* 海康登录失败code
|
||||
*/
|
||||
public static final int LOGIN_FAIL_CODE = -1;
|
||||
|
||||
public static HCNetSDK getHcNetSDK() {
|
||||
if (hcNetSDK == null) {
|
||||
throw new RuntimeException("HIK sdk 初始化失败!");
|
||||
}
|
||||
return hcNetSDK;
|
||||
}
|
||||
|
||||
public static void initSdk() {
|
||||
if (isWindows()) {
|
||||
String dllFilePath = System.getProperty("user.dir") + "\\lib\\hik\\win64\\HCNetSDK.dll";
|
||||
log.info("win系统加载库路径: {}", dllFilePath);
|
||||
hcNetSDK = (HCNetSDK) Native.loadLibrary(dllFilePath, HCNetSDK.class);
|
||||
log.info("window-sdk加载完成。");
|
||||
} else {
|
||||
String soFilePath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
|
||||
log.info("linux系统加载库路径: {}", soFilePath);
|
||||
hcNetSDK = (HCNetSDK) Native.loadLibrary(soFilePath, HCNetSDK.class);
|
||||
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());
|
||||
log.info("window-sdk加载完成。");
|
||||
}
|
||||
//SDK初始化,和进程保持同步,仅需要调用一次
|
||||
hcNetSDK.NET_DVR_Init();
|
||||
//开启SDK日志打印
|
||||
hcNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启定时巡检设备
|
||||
*
|
||||
* @param time 巡检时间
|
||||
* @param workStateCallBack 巡检回调
|
||||
*/
|
||||
public static boolean regularInspection(int time, HCNetSDK.DEV_WORK_STATE_CB workStateCallBack) {
|
||||
Assert.notNull(workStateCallBack, "开启定时巡检设备失败, msg: HCNetSDK.FMSGCallBack 不能为null");
|
||||
HCNetSDK.NET_DVR_CHECK_DEV_STATE struCheckStatus = new HCNetSDK.NET_DVR_CHECK_DEV_STATE();
|
||||
struCheckStatus.read();
|
||||
//定时检测设备工作状态,单位:ms,0表示使用默认值(30000),最小值为1000 30分钟更新一次
|
||||
struCheckStatus.dwTimeout = time;
|
||||
struCheckStatus.fnStateCB = workStateCallBack;
|
||||
struCheckStatus.write();
|
||||
boolean state = hcNetSDK.NET_DVR_StartGetDevState(struCheckStatus);
|
||||
if (!state) {
|
||||
log.info("定时巡检设备开启失败:{}", hcNetSDK.NET_DVR_GetLastError());
|
||||
} else {
|
||||
log.info("定时巡检设备开启成功");
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启hik 设备报警
|
||||
*
|
||||
* @param iIndex 回调函数索引,取值范围:[0,15]
|
||||
* @param callBack 回调函数
|
||||
* @return
|
||||
*/
|
||||
public static boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
|
||||
boolean b = hcNetSDK.NET_DVR_SetDVRMessageCallBack_V50(iIndex, callBack, null);
|
||||
if (b) {
|
||||
log.info("hik 报警回调函数设置完成,iIndex={}", iIndex);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
public static boolean setAlarmChan(int lUserID) {
|
||||
//报警布防参数设置
|
||||
HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 m_strAlarmInfoV50 = new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50();
|
||||
m_strAlarmInfoV50.dwSize = m_strAlarmInfoV50.size();
|
||||
m_strAlarmInfoV50.byLevel = 0; //布防等级
|
||||
m_strAlarmInfoV50.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
|
||||
m_strAlarmInfoV50.byRetAlarmTypeV40 = 1; //0- 移动侦测、视频丢失、遮挡、IO信号量等报警信息以普通方式上传(报警类型:COMM_ALARM_V30,报警信息结构体:NET_DVR_ALARMINFO_V30),
|
||||
// 1- 报警信息以数据可变长方式上传(报警类型:COMM_ALARM_V40,报警信息结构体:NET_DVR_ALARMINFO_V40,设备若不支持则仍以普通方式上传)
|
||||
m_strAlarmInfoV50.byDeployType = 0; //布防类型:0-客户端布防,1-实时布防
|
||||
m_strAlarmInfoV50.write();
|
||||
int lAlarmHandle = hcNetSDK.NET_DVR_SetupAlarmChan_V50(lUserID, m_strAlarmInfoV50, Pointer.NULL, 0);
|
||||
if (lAlarmHandle == -1) {
|
||||
System.err.println("布防失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
|
||||
return false;
|
||||
} else {
|
||||
System.out.println("布防成功");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static int getErrorCode() {
|
||||
return getHcNetSDK().NET_DVR_GetLastError();
|
||||
}
|
||||
|
||||
/**
|
||||
* 登出操作
|
||||
*/
|
||||
public static boolean logout(int lUserID) {
|
||||
if (lUserID >= 0) {
|
||||
return hcNetSDK.NET_DVR_Logout(lUserID);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void clearSdk() {
|
||||
if (hcNetSDK != null) {
|
||||
hcNetSDK.NET_DVR_Cleanup();
|
||||
}
|
||||
}
|
||||
}
|
@@ -31,6 +31,7 @@ public class VideoAlarmService {
|
||||
private final E8PlatformApi e8PlatformApi;
|
||||
private final ISisAccessControlService sisAccessControlService;
|
||||
private final ISisDeviceBindRefService deviceBindRefService;
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
|
||||
public void handleAlarmData(UvModel.AlarmReportInfo alarmReportData) {
|
||||
@@ -132,9 +133,9 @@ public class VideoAlarmService {
|
||||
compareResults.forEach(result -> {
|
||||
// 下发梯控权限数据
|
||||
// List<Integer> arrs = Arrays.asList(2, 2, 2, 3, 3, 3 ,3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
|
||||
List<Integer> arrs = Arrays.asList(3, 3, 3, 2, 2, 2 ,2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
|
||||
List<Integer> arrs = Arrays.asList(3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
|
||||
for (int i = 0; i < arrs.size(); i++) {
|
||||
HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i));
|
||||
hikApiService.controlGateway("192.168.24.188", (i + 1), arrs.get(i));
|
||||
}
|
||||
|
||||
});
|
||||
|
@@ -155,7 +155,6 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private AddStreamProxyResp addStreamProxy(String app, String stream, String url) {
|
||||
Map<String, Object> commonParams = getCommonParams();
|
||||
commonParams.put("vhost", zlmConfig.getVhost());
|
||||
@@ -243,8 +242,8 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService {
|
||||
commonParams.put("src_url", url);
|
||||
commonParams.put("dst_url", targetUrl);
|
||||
commonParams.put("timeout_ms", 10000);
|
||||
commonParams.put("enable_hls", true);
|
||||
commonParams.put("enable_mp4", true);
|
||||
commonParams.put("enable_hls", false);
|
||||
commonParams.put("enable_mp4", false);
|
||||
R<AddStreamProxyResp> result = HttpClientUtil.get(getRequestUrl("addFFmpegSource"), commonParams, AddStreamProxyResp.class);
|
||||
if (result != null) {
|
||||
if (result.getCode() == 0) {
|
||||
|
@@ -193,7 +193,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
|
||||
Date now = new Date();
|
||||
SisAlarmEvents alarmEvents = new SisAlarmEvents();
|
||||
alarmEvents.setBigType(EventBigTypeEnum.EQUIPMENT_UP.getCode());
|
||||
alarmEvents.setSmallType(EventSmallTypeEnum.EQP_REPORT_SBSB.getCode());
|
||||
alarmEvents.setSmallType(EventSmallTypeEnum.SMART_REPORT_ZJCR.getCode());
|
||||
alarmEvents.setLevel(Long.valueOf(level));
|
||||
alarmEvents.setDeviceIp(deviceIp);
|
||||
alarmEvents.setDeviceName(sisDeviceManage.getDeviceName());
|
||||
@@ -202,11 +202,12 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
|
||||
alarmEvents.setState(AlarmStatus.REPORTED.getCode());
|
||||
alarmEvents.setTenantId(sisDeviceManage.getTenantId());
|
||||
alarmEvents.setCreateDept(sisDeviceManage.getCreateDept());
|
||||
|
||||
// -1 默认为系统创建
|
||||
alarmEvents.setCreateBy(-1L);
|
||||
// 默认服务时间为2个小时
|
||||
alarmEvents.setServBeginTime(now);
|
||||
alarmEvents.setServEndTime(DateUtil.offset(now, DateField.HOUR, 2));
|
||||
|
||||
alarmEvents.setDescription(EventSmallTypeEnum.SMART_REPORT_ZJCR.getDesc());
|
||||
|
||||
int insert = this.baseMapper.insert(alarmEvents);
|
||||
log.info("写入报警事件表完成,num={}", insert);
|
||||
|
@@ -21,9 +21,9 @@ import org.dromara.sis.domain.bo.SisDeviceManageBo;
|
||||
import org.dromara.sis.domain.vo.SisDeviceChannelVo;
|
||||
import org.dromara.sis.domain.vo.SisDeviceGroupVo;
|
||||
import org.dromara.sis.mapper.SisDeviceChannelMapper;
|
||||
import org.dromara.sis.sdk.hik.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.HikApiService;
|
||||
import org.dromara.sis.sdk.hik.HikSdkConstans;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.HikConstants;
|
||||
import org.dromara.sis.service.ISisDeviceChannelService;
|
||||
import org.dromara.sis.service.ISisDeviceGroupService;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
@@ -47,6 +47,9 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
|
||||
private final SisDeviceChannelMapper baseMapper;
|
||||
private final ISisDeviceGroupService deviceGroupService;
|
||||
private HikApiService hikApiService;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询设备通道管理
|
||||
@@ -206,7 +209,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
@Override
|
||||
public void handleHikDeviceChannel(SisDeviceManageBo bo) {
|
||||
// 调用hik sdk登录
|
||||
boolean isLogin = HikApiService.getInstance().login(bo.getDeviceIp(), bo.getDevicePort().shortValue(), bo.getDeviceAccount(), bo.getDevicePwd());
|
||||
boolean isLogin = hikApiService.login(bo.getDeviceIp(), bo.getDevicePort().shortValue(), bo.getDeviceAccount(), bo.getDevicePwd(), bo.getDeviceType());
|
||||
if (!isLogin) {
|
||||
throw new RuntimeException("海康设备添加失败.");
|
||||
}
|
||||
@@ -220,12 +223,12 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
channel.setChannelName(bo.getDeviceName());
|
||||
channel.setGroupId(bo.getGroupId());
|
||||
channel.setDeviceIp(bo.getDeviceIp());
|
||||
channel.setDevicePort(HikSdkConstans.DEFAULT_RTSP_PORT);
|
||||
channel.setDevicePort(HikConstants.DEFAULT_RTSP_PORT);
|
||||
channel.setFactoryNo(bo.getFactoryNo());
|
||||
channel.setDeviceAccount(bo.getDeviceAccount());
|
||||
channel.setDevicePwd(bo.getDevicePwd());
|
||||
channel.setDeviceMac(bo.getDeviceMac());
|
||||
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
|
||||
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
|
||||
channel.setTenantId(bo.getTenantId());
|
||||
// 默认设备在线
|
||||
channel.setChannelState(1);
|
||||
@@ -235,7 +238,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
log.info("设备通道[{}]已存在,放弃添加通道信息", bo.getDeviceIp());
|
||||
}
|
||||
} else if (DeviceTypeEnum.NVR.getType().equals(bo.getDeviceType()) || DeviceTypeEnum.DVR.getType().equals(bo.getDeviceType())) {
|
||||
DeviceInfo channelInfo = HikApiService.getInstance().getChannelInfo(bo.getDeviceIp());
|
||||
DeviceInfo channelInfo = hikApiService.getChannelInfo(bo.getDeviceIp());
|
||||
if (channelInfo != null && CollUtil.isNotEmpty(channelInfo.getChannelInfo())) {
|
||||
List<SisDeviceChannel> insertChannels = new ArrayList<>(channelInfo.getChannelInfo().size());
|
||||
List<SisDeviceChannel> updateChannels = new ArrayList<>(channelInfo.getChannelInfo().size());
|
||||
@@ -251,19 +254,19 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
channel.setDeviceIp(item.getChannelIp());
|
||||
channel.setDevicePort(Integer.valueOf(item.getChannelPort()));
|
||||
channel.setDeviceAccount(item.getChannelAccount());
|
||||
channel.setFactoryNo(channelInfo.getFactoryNo());
|
||||
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
|
||||
channel.setFactoryNo(bo.getFactoryNo());
|
||||
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
|
||||
channel.setChannelState(item.getChannelStatus());
|
||||
if (StrUtil.isNotEmpty(item.getChannelPwd())) {
|
||||
channel.setDevicePwd(item.getChannelPwd());
|
||||
}
|
||||
// nvr 设备信息
|
||||
channel.setNvrIp(bo.getDeviceIp());
|
||||
channel.setNvrPort(HikSdkConstans.DEFAULT_RTSP_PORT);
|
||||
channel.setNvrPort(HikConstants.DEFAULT_RTSP_PORT);
|
||||
channel.setNvrAccount(bo.getDeviceAccount());
|
||||
channel.setNvrPwd(bo.getDevicePwd());
|
||||
channel.setNvrFactoryNo(bo.getFactoryNo());
|
||||
channel.setNvrChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setNvrChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
|
||||
|
||||
// 系统设备信息
|
||||
channel.setDeviceMac(bo.getDeviceMac());
|
||||
@@ -271,7 +274,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
|
||||
channel.setDeviceId(bo.getId());
|
||||
channel.setGroupId(bo.getGroupId());
|
||||
channel.setChannelName(item.getChannelName());
|
||||
channel.setChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
|
||||
channel.setTenantId(bo.getTenantId());
|
||||
if (isUpdate) {
|
||||
updateChannels.add(channel);
|
||||
|
@@ -42,6 +42,7 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService {
|
||||
|
||||
private final SisDeviceManageMapper baseMapper;
|
||||
private final ISisDeviceChannelService deviceChannelService;
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
/**
|
||||
* 查询设备管理
|
||||
@@ -172,7 +173,7 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService {
|
||||
// 删除设备
|
||||
deviceIds.add(item.getId());
|
||||
if (FactoryNoEnum.HIK.getCode().equals(item.getFactoryNo())) {
|
||||
HikApiService.getInstance().loginOut(item.getDeviceIp());
|
||||
hikApiService.loginOut(item.getDeviceIp());
|
||||
}
|
||||
});
|
||||
int num = deviceChannelService.deleteByDeviceIds(deviceIds);
|
||||
|
@@ -50,7 +50,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
private final ISisElevatorFloorChannelRefService elevatorFloorChannelRefService;
|
||||
private final E8PlatformApi e8PlatformApi;
|
||||
private final ISisAlarmEventsService alarmEventsService;
|
||||
|
||||
private final HikApiService hikApiService;
|
||||
private final CleanLiftAuthRocketProducer cleanLiftAuthRocketProducer;
|
||||
|
||||
@DubboReference
|
||||
@@ -150,11 +150,11 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
|
||||
if (channelRefVo != null) {
|
||||
if (channelRefVo.getDownChannel() != null) {
|
||||
HikApiService.getInstance().controlGateway(ele.getControlIp(), channelRefVo.getDownChannel().intValue(), 2);
|
||||
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getDownChannel().intValue(), 2);
|
||||
}
|
||||
|
||||
if (channelRefVo.getUpChannel() != null) {
|
||||
HikApiService.getInstance().controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
|
||||
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
|
||||
}
|
||||
}
|
||||
cleanLiftAuthRocketProducer.sendMessage(item.getBindId(), 0L, item.getDeviceFloorId(), "清除电梯" + item.getBindId() + "梯控权限", 3);
|
||||
@@ -210,11 +210,11 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
log.info("开始下发外部面板梯控权限....");
|
||||
for (SisElevatorFloorRefVo ref : eleRef) {
|
||||
if (ref.getUpChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)) {
|
||||
HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 2);
|
||||
hikApiService.controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 2);
|
||||
}
|
||||
|
||||
if (ref.getDownChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)) {
|
||||
HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
|
||||
hikApiService.controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
|
||||
}
|
||||
}
|
||||
cleanLiftAuthRocketProducer.sendMessage(deviceId, groupId, deviceFloorId, "清除电梯" + deviceId + "梯控权限", 3);
|
||||
|
@@ -31,6 +31,7 @@ import java.util.Objects;
|
||||
public class SyncLiftAuthTask {
|
||||
|
||||
private final E8PlatformApi apiService;
|
||||
private final HikApiService hikApiService;
|
||||
|
||||
/**
|
||||
* 同步电梯权限
|
||||
@@ -88,7 +89,7 @@ public class SyncLiftAuthTask {
|
||||
RedisUtils.setCacheObject(redisKey, recordId);
|
||||
RedisUtils.expire(redisKey, 10);
|
||||
for (int i = 0; i < 18; i++) {
|
||||
HikApiService.getInstance().controlGateway(controlIP, (i + 1), 2);
|
||||
hikApiService.controlGateway(controlIP, (i + 1), 2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -96,7 +97,7 @@ public class SyncLiftAuthTask {
|
||||
RedisUtils.setCacheObject(redisKey, recordId);
|
||||
RedisUtils.expire(redisKey, 10);
|
||||
for (int i = 0; i < 18; i++) {
|
||||
HikApiService.getInstance().controlGateway(controlIP, (i + 1), 2);
|
||||
hikApiService.controlGateway(controlIP, (i + 1), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -152,6 +152,13 @@ public class HikDeviceCheckStateTask {
|
||||
* @return 返回设备是否在线
|
||||
*/
|
||||
private boolean updateDeviceStatus(RemoteSisDeviceManage item) {
|
||||
Integer deviceType = item.getDeviceType();
|
||||
if(item.getDeviceType().equals(DeviceTypeEnum.IPC.getType())) {
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
// 调用设备登录验证次设备在线
|
||||
Boolean isLogin = remoteHikSdkService.deviceLogin(item);
|
||||
int onLineState = isLogin ? 1 : 0;
|
||||
|
@@ -40,9 +40,9 @@ spring.sql.init.platform=mysql
|
||||
db.num=1
|
||||
|
||||
### Connect URL of DB:
|
||||
db.url.0=jdbc:mysql://192.168.24.101:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
|
||||
db.user.0=by
|
||||
db.password.0=123456
|
||||
db.url.0=jdbc:mysql://10.20.1.65:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
|
||||
db.user.0=root
|
||||
db.password.0=By@2025!
|
||||
|
||||
### the maximum retry times for push
|
||||
nacos.config.push.maxRetryTime=50
|
||||
|
Reference in New Issue
Block a user