¶Ô±ÈÐÂÎļþ |
| | |
| | | The dll in this directoryï¼iconv.dll,libxml2.dll,zlib1.dll,calib.dllï¼only used in ClientDemo. |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <parent> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-parent</artifactId> |
| | | <version>2.7.12</version> |
| | | <relativePath/> <!-- lookup parent from repository --> |
| | | </parent> |
| | | <groupId>com.ard</groupId> |
| | | <artifactId>ard-alarm</artifactId> |
| | | <version>0.0.1-SNAPSHOT</version> |
| | | <name>ard-alarm</name> |
| | | <description>ard-alarm</description> |
| | | <properties> |
| | | <java.version>1.8</java.version> |
| | | <docker.image.prefix>ard</docker.image.prefix> |
| | | </properties> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter</artifactId> |
| | | </dependency> |
| | | <!-- nettyä¾èµ springboot2.xèªå¨å¯¼å
¥çæ¬ --> |
| | | <dependency> |
| | | <groupId>io.netty</groupId> |
| | | <artifactId>netty-all</artifactId> |
| | | </dependency> |
| | | <!--mqtt--> |
| | | <dependency> |
| | | <groupId>org.springframework.integration</groupId> |
| | | <artifactId>spring-integration-mqtt</artifactId> |
| | | <version>6.0.3</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.alibaba.fastjson2</groupId> |
| | | <artifactId>fastjson2</artifactId> |
| | | <version>2.0.23</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | <optional>true</optional> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.postgresql</groupId> |
| | | <artifactId>postgresql</artifactId> |
| | | </dependency> |
| | | <!--海康å½åæºäºæ¬¡å¼åä¾èµjarå
--> |
| | | <dependency> |
| | | <groupId>net.java.jna</groupId> |
| | | <artifactId>jna</artifactId> |
| | | <version>1.0.0</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>net.java.examples</groupId> |
| | | <artifactId>examples</artifactId> |
| | | <version>1.0.0</version> |
| | | </dependency> |
| | | <!--mybatisä¾èµ--> |
| | | <dependency> |
| | | <groupId>org.mybatis.spring.boot</groupId> |
| | | <artifactId>mybatis-spring-boot-starter</artifactId> |
| | | <version>2.2.2</version> |
| | | </dependency> |
| | | <!--minioä¾èµ--> |
| | | <dependency> |
| | | <groupId>io.minio</groupId> |
| | | <artifactId>minio</artifactId> |
| | | <version>8.3.5</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.apache.commons</groupId> |
| | | <artifactId>commons-lang3</artifactId> |
| | | <version>3.12.0</version> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | <build> |
| | | <!-- é¡¹ç®æå
åç§° --> |
| | | <finalName>ard_alarm</finalName> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-maven-plugin</artifactId> |
| | | <configuration> |
| | | <excludes> |
| | | <exclude> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | </exclude> |
| | | </excludes> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <groupId>com.spotify</groupId> |
| | | <artifactId>dockerfile-maven-plugin</artifactId> |
| | | <version>1.3.6</version> |
| | | <configuration> |
| | | <repository>${docker.image.prefix}/${project.artifactId}</repository> |
| | | <buildArgs> |
| | | <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> |
| | | </buildArgs> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | |
| | | </project> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard; |
| | | |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.scheduling.annotation.EnableScheduling; |
| | | |
| | | @SpringBootApplication |
| | | @EnableScheduling |
| | | public class ArdAlarmApplication { |
| | | |
| | | public static void main(String[] args) { |
| | | SpringApplication.run(ArdAlarmApplication.class, args); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.camera.domain; |
| | | |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * ç¸æºè®¾å¤å¯¹è±¡ ard_cameras |
| | | * |
| | | * @author åèä¹ |
| | | * @date 2023-02-11 |
| | | */ |
| | | @Data |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class ArdCameras { |
| | | private static final long serialVersionUID = 1L; |
| | | public ArdCameras(String gdtype) |
| | | { |
| | | this.gdtype=gdtype; |
| | | } |
| | | /** |
| | | * id |
| | | */ |
| | | |
| | | private String id; |
| | | |
| | | /** |
| | | * åç§° |
| | | */ |
| | | |
| | | private String name; |
| | | |
| | | /** |
| | | * ip |
| | | */ |
| | | |
| | | private String ip; |
| | | |
| | | /** |
| | | * ç«¯å£ |
| | | */ |
| | | |
| | | private Integer port; |
| | | |
| | | /** |
| | | * rtspç«¯å£ |
| | | */ |
| | | |
| | | private Integer rtspPort; |
| | | |
| | | /** |
| | | * ç¨æ·å |
| | | */ |
| | | |
| | | private String username; |
| | | |
| | | /** |
| | | * å¯ç |
| | | */ |
| | | |
| | | private String password; |
| | | |
| | | /** |
| | | * å
çµç±»å |
| | | */ |
| | | |
| | | private String gdtype; |
| | | |
| | | /** |
| | | * ééå· |
| | | */ |
| | | |
| | | private Integer channel; |
| | | |
| | | /** |
| | | * ç»åº¦ |
| | | */ |
| | | |
| | | private Double longitude; |
| | | |
| | | /** |
| | | * 纬度 |
| | | */ |
| | | |
| | | private Double latitude; |
| | | |
| | | /** |
| | | * é«å± |
| | | */ |
| | | |
| | | private Double altitude; |
| | | |
| | | /** |
| | | * ç¨æ·ID |
| | | */ |
| | | |
| | | private String userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | |
| | | private Integer deptId; |
| | | |
| | | /** |
| | | * æ¹ä½è§ |
| | | */ |
| | | |
| | | private Double camHeading; |
| | | |
| | | /** |
| | | * ä¿¯ä»°è§ |
| | | */ |
| | | |
| | | private Double camPitch; |
| | | |
| | | /** |
| | | * æè½¬è§ |
| | | */ |
| | | |
| | | private Double camRoll; |
| | | |
| | | /** |
| | | * 设å¤ç¦è· |
| | | */ |
| | | |
| | | private Double camNear; |
| | | |
| | | /** |
| | | * ææè·ç¦» |
| | | */ |
| | | |
| | | private Double camFar; |
| | | |
| | | /** |
| | | * 宽髿¯ |
| | | */ |
| | | |
| | | private Double camAspectratio; |
| | | |
| | | /** |
| | | * èåæ·±åº¦ |
| | | */ |
| | | |
| | | private Double camDepth; |
| | | |
| | | /** |
| | | * è§åºè§ |
| | | */ |
| | | |
| | | private Double camFov; |
| | | |
| | | /** |
| | | * æå¤§å¯è§è·ç¦» |
| | | */ |
| | | |
| | | private Double camMaxVisibleDistance; |
| | | /** ç¸æºæ¥è¦å¼å¯¼å¼å
³ */ |
| | | |
| | | private Integer camAlarmGuideEnable; |
| | | /** |
| | | * æå±å¡ID |
| | | */ |
| | | private String towerId; |
| | | |
| | | /** |
| | | * ç»å½ID |
| | | */ |
| | | private Integer loginId; |
| | | private String operatorId; |
| | | private Date operatorExpired; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.camera.domain; |
| | | |
| | | import lombok.Data; |
| | | import java.util.Map; |
| | | |
| | | @Data |
| | | public class CameraCmd { |
| | | |
| | | /*ç¸æºID*/ |
| | | String cameraId; |
| | | /*ç¸æºééå·*/ |
| | | Integer channelNum; |
| | | /*äºå°ä»£ç */ |
| | | Integer code; |
| | | /*äºå°é度*/ |
| | | Integer speed; |
| | | /*å¼å¯å
³éæ è¯*/ |
| | | boolean enable; |
| | | /*é¢ç½®ä½å·*/ |
| | | Integer presetIndex; |
| | | /*èç¦å¼*/ |
| | | Integer dwFocusPos; |
| | | /*PTZå¼*/ |
| | | Map<String,Double>ptzMap; |
| | | |
| | | /*ç®æ ç»çº¬åº¦*/ |
| | | double[] targetPosition; |
| | | |
| | | /*å½åæä½è
*/ |
| | | String operator; |
| | | /*è¿æé´éï¼ç§ï¼*/ |
| | | Integer expired; |
| | | |
| | | /*å卿± åç§°*/ |
| | | String bucketName; |
| | | /*æä»¶åç§°*/ |
| | | String objectName; |
| | | /*æ¯å¦ä¸ä¼ minio*/ |
| | | boolean isUploadMinio; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.camera.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * ç¸æºè®¾å¤Mapperæ¥å£ |
| | | * |
| | | * @author åèä¹ |
| | | * @date 2023-02-11 |
| | | */ |
| | | @Mapper |
| | | public interface ArdCamerasMapper |
| | | { |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤ |
| | | * |
| | | * @param id ç¸æºè®¾å¤ä¸»é® |
| | | * @return ç¸æºè®¾å¤ |
| | | */ |
| | | public ArdCameras selectArdCamerasById(String id); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤å表 |
| | | * |
| | | * @param ardCameras ç¸æºè®¾å¤ |
| | | * @return ç¸æºè®¾å¤éå |
| | | */ |
| | | public List<ArdCameras> selectArdCamerasList(ArdCameras ardCameras); |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.camera.service; |
| | | |
| | | import java.util.List; |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | |
| | | |
| | | |
| | | /** |
| | | * ç¸æºè®¾å¤Serviceæ¥å£ |
| | | * |
| | | * @author åèä¹ |
| | | * @date 2023-02-11 |
| | | */ |
| | | public interface IArdCamerasService |
| | | { |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤ |
| | | * |
| | | * @param id ç¸æºè®¾å¤ä¸»é® |
| | | * @return ç¸æºè®¾å¤ |
| | | */ |
| | | public ArdCameras selectArdCamerasById(String id); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤å表 |
| | | * |
| | | * @param ardCameras ç¸æºè®¾å¤ |
| | | * @return ç¸æºè®¾å¤éå |
| | | */ |
| | | public List<ArdCameras> selectArdCamerasList(ArdCameras ardCameras); |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.camera.service.impl; |
| | | |
| | | import java.util.*; |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import com.ard.alarm.camera.mapper.ArdCamerasMapper; |
| | | import com.ard.alarm.camera.service.IArdCamerasService; |
| | | import com.ard.hiksdk.service.impl.HikClientUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.Resource; |
| | | |
| | | /** |
| | | * ç¸æºè®¾å¤Serviceä¸å¡å±å¤ç |
| | | * |
| | | * @author åèä¹ |
| | | * @date 2023-02-11 |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | | public class ArdCamerasServiceImpl implements IArdCamerasService { |
| | | @Resource |
| | | private ArdCamerasMapper ardCamerasMapper; |
| | | |
| | | |
| | | @PostConstruct |
| | | public void init() |
| | | { |
| | | List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); |
| | | HikClientUtil.loadHCNetSDKLib(); |
| | | HikClientUtil.loginAll(ardCameras); |
| | | } |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤ |
| | | * |
| | | * @param id ç¸æºè®¾å¤ä¸»é® |
| | | * @return ç¸æºè®¾å¤ |
| | | */ |
| | | @Override |
| | | public ArdCameras selectArdCamerasById(String id) { |
| | | return ardCamerasMapper.selectArdCamerasById(id); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¸æºè®¾å¤å表 |
| | | * |
| | | * @param ardCameras ç¸æºè®¾å¤ |
| | | * @return ç¸æºè®¾å¤ |
| | | */ |
| | | @Override |
| | | public List<ArdCameras> selectArdCamerasList(ArdCameras ardCameras) { |
| | | return ardCamerasMapper.selectArdCamerasList(ardCameras); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.stealelec.domain; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import lombok.Data; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | public class ArdAlarmStealelec { |
| | | private static final long serialVersionUID = 1L; |
| | | /** |
| | | * id |
| | | */ |
| | | private String id; |
| | | /** |
| | | * command |
| | | */ |
| | | private Integer command; |
| | | /** |
| | | * æ²¹äºä»£ç |
| | | */ |
| | | private String name; |
| | | /** |
| | | * äºå· |
| | | */ |
| | | private String describe; |
| | | |
| | | /** |
| | | * æ¥è¦ç±»å |
| | | */ |
| | | private String catalogText; |
| | | /** |
| | | * æ¥è¦å¼ |
| | | */ |
| | | private String description; |
| | | /** |
| | | * æ¥è¦å¼å§æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date startTime; |
| | | /** |
| | | * æ¥è¦ç»ææ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date endTime; |
| | | |
| | | /** |
| | | * ç¨æ·ID |
| | | */ |
| | | private String userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | /** |
| | | * æ¥çæ¶é´ |
| | | */ |
| | | private Date viewTime; |
| | | /** |
| | | * ç»åº¦ |
| | | */ |
| | | private double longitude; |
| | | /** |
| | | * 纬度 |
| | | */ |
| | | private double latitude; |
| | | /** |
| | | * é«å± |
| | | */ |
| | | private double altitude; |
| | | /** |
| | | * æ¥è¦æ»æ° |
| | | */ |
| | | private Integer total; |
| | | /** |
| | | * æªè¯»æ¥è¦æ°é |
| | | */ |
| | | private Integer count; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.stealelec.service; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.ard.alarm.stealelec.domain.ArdAlarmStealelec; |
| | | import com.ard.utils.mqtt.MqttConsumer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.client.RestTemplate; |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @ClassName StealElecAlarmServiceImpl |
| | | * @Description:ççµè¦æ¥æå¡å®ç°ç±» |
| | | * @Author åèä¹ |
| | | * @Date 2022/12/26 16:34 |
| | | * @Version 1.0 |
| | | */ |
| | | @Slf4j(topic = "stealAlarm") |
| | | @Service |
| | | public class StealElecAlarmService{ |
| | | @Resource |
| | | RestTemplate restTemplate; |
| | | @Value("${spring.stealelec.url}") |
| | | private String stealElecUrl; |
| | | List<String> tempList=new ArrayList<>(); |
| | | /** |
| | | * @æè¿° è·åapiæ°æ®æ¨émqtt |
| | | * @åæ° [] |
| | | * @è¿åå¼ void |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/6/14 9:45 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | @Async("alarm") |
| | | // @Scheduled(cron="0/5 * * * * ?") |
| | | public void alarmHandler() { |
| | | try { |
| | | String allAlarmData = restTemplate.getForObject(stealElecUrl, String.class); |
| | | //å餿æ\ç¬¦å· |
| | | String message = allAlarmData.replaceAll("\\\\", ""); |
| | | //å餿´ä¸ªå符串é¦å°¾åå¼å· |
| | | if (message.startsWith("\"")) { |
| | | message = message.substring(1); |
| | | } |
| | | if (message.endsWith("\"")) { |
| | | message = message.substring(0, message.length() - 1); |
| | | } |
| | | Map<String, Object> result = (Map<String, Object>) JSON.parse(message); |
| | | //è·åå°json对象listéå |
| | | List<JSONObject> list = (List<JSONObject>) result.get("data"); |
| | | if (list.size() > 0) { |
| | | for (JSONObject object : list) { |
| | | String JSONStr = JSON.toJSONString(object); |
| | | //转æå®ä½å¯¹è±¡ |
| | | ArdAlarmStealelec wd = JSON.parseObject(JSONStr, ArdAlarmStealelec.class); |
| | | if(tempList.contains(wd.getId())) |
| | | { |
| | | continue; |
| | | } |
| | | MqttConsumer.publish(2,false,"stealelec", JSON.toJSONString(wd)); |
| | | tempList.add(wd.getId()); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("stealelecæ¥è¦æ°æ®æ¨éå¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.alarm.tube.service; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.ard.utils.DateUtils; |
| | | import com.ard.utils.mqtt.MqttConsumer; |
| | | import com.ard.utils.udp.NettyUdpServer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * @Description: ç®¡çº¿æ³æ¼æ¥è¦æå¡ |
| | | * @ClassName: TubeAlarmService |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ06æ¥8:56 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Service |
| | | @Slf4j(topic = "tube") |
| | | public class TubeAlarmService { |
| | | @Resource |
| | | NettyUdpServer nettyUdpServer; |
| | | @Value("${spring.netty.port}") |
| | | private Integer udpPort; |
| | | @Value("${spring.netty.enabled}") |
| | | private String UdpServerEnable; |
| | | |
| | | @PostConstruct |
| | | public void init() { |
| | | if (UdpServerEnable.equals("false")) { |
| | | return; |
| | | } |
| | | nettyUdpServer.init(udpPort); |
| | | log.info("UDPæå¡å·²ç»å¯å¨"); |
| | | } |
| | | |
| | | @Async("alarm") |
| | | public void alarmHandler(String message) { |
| | | try { |
| | | String[] messages = message.split(","); |
| | | if (messages.length == 8) { |
| | | String start = messages[0]; |
| | | String host = messages[1]; |
| | | String tubeId = messages[2]; |
| | | String alarmTime = DateUtils.convertDate(messages[3]); |
| | | String position = messages[4]; |
| | | String type = messages[5]; |
| | | String watcher = messages[6]; |
| | | String stop = messages[7]; |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("host", host); |
| | | map.put("tubeId", tubeId); |
| | | map.put("alarmTime", alarmTime); |
| | | map.put("type", type); |
| | | map.put("alarmType", start); |
| | | map.put("position", position); |
| | | map.put("watcher", watcher); |
| | | log.info("å¼å§è§£æ" + start); |
| | | log.info("主æºï¼" + host); |
| | | log.info("管线ç¼å·ï¼" + tubeId); |
| | | log.info("æ¥è¦æ¶é´ï¼" + alarmTime); |
| | | log.info("æ¥è¦ç±»åï¼" + type); |
| | | log.info("ä½ç½®ï¼" + position); |
| | | log.info("å¼ç人ï¼" + watcher); |
| | | log.info("ç»æè§£æ" + stop); |
| | | MqttConsumer.publish(2, false, "tube", JSON.toJSONString(map)); |
| | | } else { |
| | | log.error("æ°æ®å¼å¸¸"); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("tubeæ¥è¦æ°æ®æ¨éå¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.async; |
| | | |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.scheduling.annotation.EnableAsync; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | |
| | | /** |
| | | * @ClassName: AsyncConfiguration |
| | | * @Description: 弿¥çº¿ç¨é
置类 |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´02æ03æ¥ 11:25 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Configuration |
| | | @EnableAsync(proxyTargetClass = true) |
| | | public class AsyncConfiguration { |
| | | @Bean("alarm") |
| | | public ThreadPoolTaskExecutor executor(){ |
| | | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
| | | //é
ç½®æ ¸å¿çº¿ç¨æ° |
| | | executor.setCorePoolSize(15); |
| | | //é
ç½®æå¤§çº¿ç¨æ° |
| | | executor.setMaxPoolSize(30); |
| | | //é
ç½®éåå¤§å° |
| | | executor.setQueueCapacity(1000); |
| | | //线ç¨çåç§°åç¼ |
| | | executor.setThreadNamePrefix("Executor-"); |
| | | //çº¿ç¨æ´»è·æ¶é´ï¼ç§ï¼ |
| | | //executor.setKeepAliveSeconds(60); |
| | | //çå¾
ææä»»å¡ç»æååå
³éçº¿ç¨æ± |
| | | executor.setWaitForTasksToCompleteOnShutdown(true); |
| | | //设置æç»çç¥ |
| | | //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); |
| | | //æ§è¡åå§å |
| | | executor.initialize(); |
| | | return executor; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.config; |
| | | |
| | | import io.minio.MinioClient; |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; |
| | | import org.springframework.core.io.ClassPathResource; |
| | | import org.springframework.core.io.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.Properties; |
| | | |
| | | /** |
| | | * @Description: |
| | | * @ClassName: MinioClientSingleton |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´05æ18æ¥9:32 |
| | | * @Version: 1.0 |
| | | **/ |
| | | |
| | | @Slf4j(topic = "minio") |
| | | @Component |
| | | public class MinioClientSingleton { |
| | | |
| | | public static String domainUrl; |
| | | private static String accessKey; |
| | | private static String secretKey; |
| | | |
| | | private volatile static MinioClient minioClient; |
| | | |
| | | static { |
| | | domainUrl = getYmlNew("minio.endpoint"); |
| | | accessKey = getYmlNew("minio.accessKey"); |
| | | secretKey = getYmlNew("minio.secretKey"); |
| | | log.info("minioä¿¡æ¯ï¼" + domainUrl + "(" + accessKey + "/" + secretKey + ")"); |
| | | } |
| | | |
| | | /** |
| | | * è·åminio客æ·ç«¯å®ä¾ |
| | | * |
| | | * @return {@link MinioClient} |
| | | */ |
| | | public static MinioClient getMinioClient() { |
| | | if (minioClient == null) { |
| | | synchronized (MinioClientSingleton.class) { |
| | | if (minioClient == null) { |
| | | minioClient = MinioClient.builder() |
| | | .endpoint(domainUrl) |
| | | .credentials(accessKey, secretKey) |
| | | .build(); |
| | | } |
| | | } |
| | | } |
| | | return minioClient; |
| | | } |
| | | |
| | | /*ymlé
置信æ¯è·å*/ |
| | | public static String getYmlNew(String key) { |
| | | Resource resource = new ClassPathResource("application.yml"); |
| | | Properties properties = null; |
| | | try { |
| | | YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); |
| | | yamlFactory.setResources(resource); |
| | | properties = yamlFactory.getObject(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return null; |
| | | } |
| | | return properties.get(key).toString(); |
| | | } |
| | | |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.config; |
| | | |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | /** |
| | | * @Description: |
| | | * @ClassName: RestTemplateConfig |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ14æ¥9:32 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Configuration |
| | | public class RestTemplateConfig { |
| | | @Bean |
| | | public RestTemplate restTemplate() { |
| | | return new RestTemplate(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.common; |
| | | |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import lombok.Data; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @ClassName: globalVariable |
| | | * @Description: å
¨å±åé |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´01æ31æ¥ 17:05 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Data |
| | | public class GlobalVariable { |
| | | //ä¿åç¸æºä¿¡æ¯key:ip value:camera对象 |
| | | public static Map<String, ArdCameras> cameraMap = new HashMap<>(); |
| | | //ä¿åç¸æºç»å½ä¿¡æ¯key:cameraId value:loginId |
| | | public static Map<String, Integer> loginMap = new HashMap<>(); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.domain; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @ClassName alarmInfo |
| | | * @Description: |
| | | * @Author åèä¹ |
| | | * @Date 2023/2/16 20:31 |
| | | * @Version 1.0 |
| | | */ |
| | | @Data |
| | | public class alarmEventInfo { |
| | | /** |
| | | * æ¥è¦åç§° |
| | | */ |
| | | String alarmName; |
| | | /** |
| | | * æ¥è¦ç±»å« |
| | | */ |
| | | String alarmType; |
| | | /** |
| | | * æ¥è¦æ¶é´ |
| | | */ |
| | | String alarmTime; |
| | | /** |
| | | * ç®æ è¯å« |
| | | */ |
| | | String targetIdentification; |
| | | /** |
| | | * å
³èç¸æºid |
| | | */ |
| | | String cameraId; |
| | | /** |
| | | * å
³èç¸æºåç§° |
| | | */ |
| | | String cameraName; |
| | | /** |
| | | * å
³èç¸æºip |
| | | */ |
| | | String cameraIp; |
| | | /** |
| | | * å
³èç¸æºéé |
| | | */ |
| | | Integer cameraChannel; |
| | | |
| | | /** |
| | | * å
³èç¸æºç»åº¦ |
| | | */ |
| | | Double longitude; |
| | | /** |
| | | * å
³èç¸æºçº¬åº¦ |
| | | */ |
| | | Double latitude; |
| | | /** |
| | | * å
³èç¸æºç±»å |
| | | */ |
| | | String cameraType; |
| | | /** |
| | | * å¾ç龿¥ |
| | | */ |
| | | String picUrl; |
| | | /** |
| | | * è§åID |
| | | */ |
| | | Integer ruleId; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.domain; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | /** |
| | | * @ClassName: recordInfo |
| | | * @Description:å½åå®ä½-ä¿åé¢è§idåå½åè·¯å¾ |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´01æ28æ¥ 9:24 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Data |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class recordInfo { |
| | | Integer lRealHandle; |
| | | String recordPath; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import com.ard.alarm.camera.domain.CameraCmd; |
| | | import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl; |
| | | import com.ard.config.MinioClientSingleton; |
| | | import com.ard.hiksdk.common.GlobalVariable; |
| | | import com.ard.hiksdk.domain.alarmEventInfo; |
| | | import com.ard.hiksdk.util.DateUtils; |
| | | import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK; |
| | | import com.ard.hiksdk.util.minio.MinioUtils; |
| | | import com.ard.utils.SpringTool; |
| | | import com.ard.utils.mqtt.MqttConsumer; |
| | | import com.sun.jna.Pointer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.InputStream; |
| | | import java.nio.ByteBuffer; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @ClassName: FMSGCallBack |
| | | * @Description: |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´02æ15æ¥ 12:16 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Slf4j(topic = "hiksdk") |
| | | public class FMSGCallBack implements HCNetSDK.FMSGCallBack_V31 { |
| | | |
| | | /** |
| | | * æ¥è¦ä¿¡æ¯åè°å½æ° |
| | | * |
| | | * @param lCommand ä¸ä¼ æ¶æ¯ç±»å |
| | | * @param pAlarmer æ¥è¦è®¾å¤ä¿¡æ¯ |
| | | * @param pAlarmInfo æ¥è¦ä¿¡æ¯ |
| | | * @param dwBufLen æ¥è¦ä¿¡æ¯ç¼åå¤§å° |
| | | * @param pUser ç¨æ·æ°æ® |
| | | */ |
| | | @Override |
| | | public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { |
| | | ArdCamerasServiceImpl ardCamerasService = SpringTool.getApplicationContext().getBean(ArdCamerasServiceImpl.class); |
| | | |
| | | String sTime;//äºä»¶æ¶é´ |
| | | String url;//äºä»¶å¾ç |
| | | alarmEventInfo info;//äºä»¶ä¿¡æ¯ |
| | | //lCommandæ¯ä¼ çæ¥è¦ç±»å |
| | | switch (lCommand) { |
| | | case HCNetSDK.COMM_ALARM_RULE: |
| | | //region è¡ä¸ºåæä¿¡æ¯ |
| | | log.info("æ¥è¦äºä»¶ç±»å:lCommand:" + Integer.toHexString(lCommand)); |
| | | 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(); |
| | | Integer ruleID = Integer.valueOf(strVcaAlarm.struRuleInfo.byRuleID); |
| | | sTime = DateUtils.parseTime(strVcaAlarm.dwAbsTime);//äºä»¶æ¶é´ |
| | | String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//设å¤ip |
| | | Integer channel = Integer.valueOf(strVcaAlarm.struDevInfo.byChannel);//éé |
| | | ArdCameras ardCameras = new ArdCameras(); |
| | | ardCameras.setIp(ipaddr); |
| | | ArdCameras ardcamere = ardCamerasService.selectArdCamerasList(ardCameras).get(0); |
| | | info = new alarmEventInfo(); |
| | | info.setAlarmName("人åè¡ä¸ºåæ"); |
| | | info.setAlarmTime(sTime); |
| | | info.setCameraName(ardcamere.getName()); |
| | | info.setCameraId(ardcamere.getId()); |
| | | info.setCameraIp(ipaddr); |
| | | info.setCameraType(ardcamere.getGdtype()); |
| | | info.setCameraChannel(channel); |
| | | info.setLongitude(ardcamere.getLongitude()); |
| | | info.setLatitude(ardcamere.getLatitude()); |
| | | info.setAlarmType(ardcamere.getGdtype()); |
| | | info.setRuleId(ruleID); |
| | | switch (strVcaAlarm.struRuleInfo.wEventTypeEx) { |
| | | case 1: //regionç©¿è¶è¦æé¢ (è¶ç侦æµ) |
| | | info.setAlarmType("è¶çä¾¦æµæ¥è¦"); |
| | | strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_TRAVERSE_PLANE.class); |
| | | //endregion |
| | | break; |
| | | case 2: //region ç®æ è¿å
¥åºå |
| | | info.setAlarmType("ç®æ è¿å
¥åºåæ¥è¦"); |
| | | strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); |
| | | //endregion |
| | | break; |
| | | case 3: //region ç®æ 离å¼åºå |
| | | info.setAlarmType("ç®æ 离å¼åºåæ¥è¦"); |
| | | strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class); |
| | | //endregion |
| | | break; |
| | | case 4: //region å¨çå
¥ä¾µ |
| | | info.setAlarmType("å¨çå
¥ä¾µæ¥è¦"); |
| | | strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_INTRUSION.class); |
| | | //endregion |
| | | break; |
| | | case 5: //region å¾å¾ |
| | | info.setAlarmType("å¾å¾äºä»¶æ¥è¦"); |
| | | //endregion |
| | | break; |
| | | case 8: //region å¿«éç§»å¨(å¥è·) |
| | | info.setAlarmType("å¿«éç§»å¨(å¥è·)äºä»¶æ¥è¦"); |
| | | //endregion |
| | | break; |
| | | case 13: //region ç©åéçäºä»¶ |
| | | info.setAlarmType("ç©åéçäºä»¶æ¥è¦"); |
| | | //endregion |
| | | break; |
| | | case 14: //region ç©åæ¿åäºä»¶ |
| | | info.setAlarmType("ç©åæ¿åäºä»¶äºä»¶æ¥è¦"); |
| | | //endregion |
| | | break; |
| | | case 20: //region åå°æ£æµ |
| | | info.setAlarmType("åå°äºä»¶è§¦å"); |
| | | //endregion |
| | | break; |
| | | case 44: //region ç©ææº |
| | | info.setAlarmType("ç©ææºæ¥è¦äºä»¶"); |
| | | //endregion |
| | | break; |
| | | default: |
| | | log.info("æªç¥è¡ä¸ºäºä»¶ç±»å:" + strVcaAlarm.struRuleInfo.wEventTypeEx); |
| | | printLog(info); |
| | | break; |
| | | } |
| | | //endregion |
| | | //å¾çåå
¥minio |
| | | url = savePicture(info); |
| | | info.setPicUrl(url); |
| | | publishMqtt(info); |
| | | break; |
| | | case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: |
| | | log.info("äººè¸æ£æµäºä»¶"); |
| | | break; |
| | | default: |
| | | log.info("æªç¥æ¥è¦äºä»¶ç±»å:lCommand:" + Integer.toHexString(lCommand)); |
| | | break; |
| | | |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° ä¿åå¾çå°è£
æ¹æ³ |
| | | * @åæ° [strVcaAlarm, eventName, eventNameEng] |
| | | * @è¿åå¼ java.lang.String |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/2/17 15:05 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | private String savePicture(HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm, String eventName, String eventNameEng) { |
| | | String url = ""; |
| | | if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) { |
| | | String currentTime = new SimpleDateFormat("yyyyMMdd").format(new Date()); |
| | | try { |
| | | //åå
¥minio |
| | | long offset = 0; |
| | | ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen); |
| | | byte[] bytes = new byte[strVcaAlarm.dwPicDataLen]; |
| | | buffers.rewind(); |
| | | buffers.get(bytes); |
| | | InputStream inputStream = new ByteArrayInputStream(bytes); |
| | | String ipaddr = new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4).trim();//设å¤ip |
| | | String UUID = java.util.UUID.randomUUID().toString().replace("-", ""); |
| | | String filename = ipaddr + "/" + currentTime + "/" + eventNameEng + "/" + UUID + ".jpg"; |
| | | boolean uploadRes = MinioUtils.uploadObject("pic", filename, inputStream, inputStream.available(), "image/jpeg"); |
| | | if (uploadRes) { |
| | | url = MinioClientSingleton.domainUrl + filename; |
| | | log.info("åå
¥minioå¾çå°åï¼" + url); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error(eventName + "å¤çå¾çå¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | return url; |
| | | } |
| | | |
| | | /** |
| | | * æä¿åå¾ç |
| | | */ |
| | | private String savePicture(alarmEventInfo info) { |
| | | CameraCmd cmd = new CameraCmd(); |
| | | ArdCameras Cameras = GlobalVariable.cameraMap.get(info.getCameraIp()); |
| | | cmd.setCameraId(Cameras.getId()); |
| | | cmd.setChannelNum(info.getCameraChannel()); |
| | | cmd.setBucketName("pic"); |
| | | String UUID = java.util.UUID.randomUUID().toString().replace("-", ""); |
| | | String filename = info.getCameraName() + "/" + info.getAlarmType() + "/" + UUID + ".jpg"; |
| | | cmd.setObjectName(filename); |
| | | String url = HikClientUtil.picCutCate(cmd); |
| | | return url; |
| | | } |
| | | |
| | | /** |
| | | * æå°æ¥å¿ |
| | | */ |
| | | private void printLog(alarmEventInfo info) { |
| | | log.info("ãè§åã" + info.getAlarmName() +"ãè§åidã" + info.getRuleId() + "ãç±»åã" + info.getAlarmType() + |
| | | "ãæ¶é´ã" + info.getAlarmTime() + "ãç¸æºidã" + info.getCameraId() + "ãç¸æºã" + info.getCameraName() + |
| | | "ãIPã" + info.getCameraIp() + "ãééã" + info.getCameraChannel() +"ãåå·ã" + info.getCameraType() + |
| | | "ãå¾çã" + info.getPicUrl() + "ãåæ ã" + info.getLongitude() + "," + info.getLatitude()); |
| | | } |
| | | /** |
| | | * æ¨émqtt |
| | | */ |
| | | private void publishMqtt(alarmEventInfo info) { |
| | | // printLog(info); |
| | | MqttConsumer.publish(2, false, "camera", JSON.toJSONString(info)); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.service.impl; |
| | | |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import com.ard.alarm.camera.domain.CameraCmd; |
| | | import com.ard.hiksdk.common.GlobalVariable; |
| | | import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK; |
| | | import com.ard.hiksdk.util.minio.MinioUtils; |
| | | import com.sun.jna.Native; |
| | | import com.sun.jna.Platform; |
| | | import com.sun.jna.ptr.IntByReference; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.io.*; |
| | | import java.nio.ByteBuffer; |
| | | import java.util.*; |
| | | |
| | | import static com.ard.hiksdk.common.GlobalVariable.cameraMap; |
| | | |
| | | |
| | | /** |
| | | * @ClassName: hikClientServiceImpl |
| | | * @Description: 海康æä½å®¢æ·ç«¯å®ç°ç±» |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´01æ17æ¥ 11:25 |
| | | * @Version: 1.2 |
| | | **/ |
| | | @Slf4j(topic = "hikSdk") |
| | | public class HikClientUtil { |
| | | |
| | | private static HCNetSDK hCNetSDK; |
| | | // æ¥è¦åè°å½æ°å®ç° |
| | | public static HCNetSDK.FMSGCallBack_V31 fMSFCallBack_V31; |
| | | |
| | | public static void loadHCNetSDKLib() { |
| | | try { |
| | | log.debug("å¼å§å è½½sdkåºæä»¶è·¯å¾"); |
| | | if (Platform.isWindows()) { |
| | | String WIN_PATH = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "HCNetSDK.dll"; |
| | | log.debug("å½åWindowså¹³å°çsdkåºè·¯å¾ï¼" + WIN_PATH); |
| | | hCNetSDK = (HCNetSDK) Native.loadLibrary(WIN_PATH, HCNetSDK.class); |
| | | } else { |
| | | log.debug("Linuxå¹³å°"); |
| | | String LINUX_PATH = System.getProperty("user.dir") + File.separator + "hiklib" + File.separator + "libhcnetsdk.so"; |
| | | log.debug("å½åLinuxå¹³å°çsdkåºè·¯å¾ï¼" + LINUX_PATH); |
| | | hCNetSDK = (HCNetSDK) Native.loadLibrary(LINUX_PATH, HCNetSDK.class); |
| | | |
| | | //设置HCNetSDKComç»ä»¶åºæå¨è·¯å¾ |
| | | //libhcnetsdk.so |
| | | String strPathCom = "/home/hiklib"; |
| | | 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()); |
| | | |
| | | //设置libcrypto.soæå¨è·¯å¾ |
| | | HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256); |
| | | String strPathCrypto = "/home/hiklib/libcrypto.so.1.1"; |
| | | System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length()); |
| | | ptrByteArrayCrypto.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer()); |
| | | |
| | | //设置libssl.soæå¨è·¯å¾ |
| | | HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256); |
| | | String strPathSsl = "/home/hiklib/libssl.so.1.1"; |
| | | System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length()); |
| | | ptrByteArraySsl.write(); |
| | | hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer()); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("å è½½åºæä»¶å¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° 注åç»å½ åªæ¯æåæ¥ç»éï¼ä¸å®æ¹ä¸å»ºè®®ç´æ¥å¨æ¤æ¥å£ä¸åèæ¶æä½ |
| | | * @åæ° [dvrLogin] |
| | | * @è¿åå¼ java.lang.Integer |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/1/17 16:12 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | public ArdCameras login1(ArdCameras camera) { |
| | | // åå§å |
| | | if (!hCNetSDK.NET_DVR_Init()) { |
| | | log.error("SDKåå§å失败"); |
| | | } |
| | | //æå°æµ·åº·sdkæ¥å¿ |
| | | if (Platform.isWindows()) { |
| | | String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator; |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true); |
| | | } else { |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true); |
| | | } |
| | | String m_sDeviceIP = camera.getIp(); |
| | | String m_sUsername = camera.getUsername(); |
| | | String m_sPassword = camera.getPassword(); |
| | | short m_sPort = camera.getPort().shortValue(); |
| | | //è®¾ç½®è¿æ¥æ¶é´ä¸éè¿æ¶é´ |
| | | hCNetSDK.NET_DVR_SetConnectTime(2000, 1); |
| | | hCNetSDK.NET_DVR_SetReconnect(100000, true); |
| | | //设å¤ä¿¡æ¯, è¾åºåæ° |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); |
| | | int lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP, m_sPort, m_sUsername, m_sPassword, m_strDeviceInfo); |
| | | if (lUserID < 0) { |
| | | //éæ¾SDKèµæº |
| | | hCNetSDK.NET_DVR_Cleanup(); |
| | | camera.setLoginId(-1); |
| | | } |
| | | if (GlobalVariable.loginMap.containsKey(camera.getId())) { |
| | | GlobalVariable.loginMap.remove(camera.getId()); |
| | | } |
| | | GlobalVariable.loginMap.put(camera.getId(), lUserID); |
| | | |
| | | camera.setLoginId(lUserID); |
| | | camera.setChannel((int) m_strDeviceInfo.byStartChan); |
| | | return camera; |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° 注åç»å½ éæäºNET_DVR_Login_V30ï¼æ¯æåæ¥å弿¥ç»å½ |
| | | * @åæ° [dvrLogin] |
| | | * @è¿åå¼ java.lang.Integer |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/1/17 16:12 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | |
| | | public static void login(ArdCameras camera) { |
| | | // åå§å |
| | | if (!hCNetSDK.NET_DVR_Init()) { |
| | | log.error("SDKåå§å失败"); |
| | | } |
| | | //æå°æµ·åº·sdkæ¥å¿ |
| | | if (Platform.isWindows()) { |
| | | String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator; |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true); |
| | | } else { |
| | | hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true); |
| | | } |
| | | String m_sDeviceIP = camera.getIp(); |
| | | String m_sUsername = camera.getUsername(); |
| | | String m_sPassword = camera.getPassword(); |
| | | short m_sPort = camera.getPort().shortValue(); |
| | | //è®¾ç½®è¿æ¥æ¶é´ä¸éè¿æ¶é´ |
| | | hCNetSDK.NET_DVR_SetConnectTime(2000, 1); |
| | | hCNetSDK.NET_DVR_SetReconnect(100000, true); |
| | | //设å¤ä¿¡æ¯, è¾åºåæ° |
| | | HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); |
| | | HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); |
| | | |
| | | // 注å设å¤-ç»å½åæ°ï¼å
æ¬è®¾å¤å°åãç»å½ç¨æ·ãå¯ç ç |
| | | m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; |
| | | System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); |
| | | m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; |
| | | System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); |
| | | m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; |
| | | System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); |
| | | m_strLoginInfo.wPort = m_sPort; |
| | | m_strLoginInfo.byVerifyMode = 0; |
| | | m_strLoginInfo.byLoginMode = 0; |
| | | //æ¯å¦å¼æ¥ç»å½ï¼0- å¦ï¼1- æ¯ windowsSDK鿝trueåfalse |
| | | m_strLoginInfo.bUseAsynLogin = true; |
| | | //弿¥ç»å½åè° |
| | | m_strLoginInfo.cbLoginResult = new LoginResultCallBack(camera); |
| | | m_strLoginInfo.write(); |
| | | int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); |
| | | if (i < 0) { |
| | | int errorCode = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("ç»å½å¼å¸¸ï¼" + errorCode); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° ç»å½ææç¸æº |
| | | * @åæ° [] |
| | | * @è¿åå¼ void |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/2/3 10:10 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | |
| | | public static void loginAll(List<ArdCameras> ardCameras) { |
| | | try { |
| | | log.debug("å è½½lib宿ï¼"); |
| | | for (ArdCameras camera : ardCameras) { |
| | | Thread.sleep(100); |
| | | login(camera); |
| | | String ip = camera.getIp(); |
| | | cameraMap.put(ip,camera); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("åå§åç»å½ç¸æºå¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° 注éç»å½ |
| | | * @åæ° [dvrLogin] |
| | | * @è¿åå¼ java.lang.Integer |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/1/17 16:12 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | |
| | | public static boolean loginOut(String cameraId) { |
| | | if (!GlobalVariable.loginMap.containsKey(cameraId)) { |
| | | return false; |
| | | } |
| | | Integer userId = GlobalVariable.loginMap.get(cameraId); |
| | | boolean b = hCNetSDK.NET_DVR_Logout(userId); |
| | | if (b) { |
| | | GlobalVariable.loginMap.remove(cameraId); |
| | | } |
| | | return b; |
| | | } |
| | | |
| | | /** |
| | | * æ¯å¦å¨çº¿ |
| | | * |
| | | * @param cmd |
| | | */ |
| | | |
| | | public static boolean isOnLine(CameraCmd cmd) { |
| | | String cameraId = cmd.getCameraId(); |
| | | if (!GlobalVariable.loginMap.containsKey(cameraId)) { |
| | | return false; |
| | | } |
| | | Integer userId = GlobalVariable.loginMap.get(cameraId); |
| | | boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0); |
| | | return isOnLine; |
| | | } |
| | | |
| | | /** |
| | | * 建ç«å¸é²ä¸ä¼ ééï¼ç¨äºä¼ è¾æ°æ® |
| | | * |
| | | * @param lUserID å¯ä¸æ è¯ç¬¦ |
| | | * @param lAlarmHandle æ¥è¦å¤çå¨ |
| | | */ |
| | | public static int setupAlarmChan(int lUserID, int lAlarmHandle) { |
| | | // æ ¹æ®è®¾å¤æ³¨åçæçlUserID建ç«å¸é²çä¸ä¼ ééï¼å³æ°æ®çä¸ä¼ éé |
| | | if (lUserID == -1) { |
| | | log.info("请å
注å"); |
| | | return lUserID; |
| | | } |
| | | if (lAlarmHandle < 0) { |
| | | // 设å¤å°æªå¸é²,éè¦å
è¿è¡å¸é² |
| | | if (fMSFCallBack_V31 == null) { |
| | | fMSFCallBack_V31 = new FMSGCallBack(); |
| | | if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V50(0, fMSFCallBack_V31, null)) { |
| | | log.info("设置åè°å½æ°å¤±è´¥!é误ç ==========ã" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | } |
| | | // è¿ééè¦å¯¹è®¾å¤è¿è¡ç¸åºçåæ°è®¾ç½®ï¼ä¸è®¾ç½®æè®¾ç½®é误é½ä¼å¯¼è´è®¾å¤æ³¨å失败 |
| | | HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM(); |
| | | m_strAlarmInfo.dwSize = m_strAlarmInfo.size(); |
| | | // æºè½äº¤éå¸é²ä¼å
级ï¼0 - ä¸ç级ï¼é«ï¼ï¼1 - äºç级ï¼ä¸ï¼ï¼2 - ä¸ç级ï¼ä½ï¼ |
| | | m_strAlarmInfo.byLevel = 1; |
| | | // æºè½äº¤éæ¥è¦ä¿¡æ¯ä¸ä¼ ç±»åï¼0 - èæ¥è¦ä¿¡æ¯ï¼NET_DVR_PLATE_RESULTï¼, 1 - æ°æ¥è¦ä¿¡æ¯(NET_ITS_PLATE_RESULT) |
| | | m_strAlarmInfo.byAlarmInfoType = 1; |
| | | // å¸é²ç±»å(ä»
é对é¨ç¦ä¸»æºã人è¯è®¾å¤)ï¼0 - 客æ·ç«¯å¸é²(伿ç½ç»ä¼ )ï¼1 - 宿¶å¸é²(åªä¸ä¼ 宿¶æ°æ®) |
| | | m_strAlarmInfo.byDeployType = 1; |
| | | m_strAlarmInfo.write(); |
| | | // å¸é²æåï¼è¿åå¸é²æåçæ°æ®ä¼ è¾ééå· |
| | | lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo); |
| | | if (lAlarmHandle == -1) { |
| | | log.error("设å¤å¸é²å¤±è´¥ï¼é误ç ==========ã" + hCNetSDK.NET_DVR_GetLastError()); |
| | | log.error("设å¤å¸é²å¤±è´¥ï¼é误ç ==========ã" + hCNetSDK.NET_DVR_GetLastError()); |
| | | // 注é éæ¾sdkèµæº |
| | | logout(lUserID); |
| | | return lAlarmHandle; |
| | | } else { |
| | | log.info("ç¸æºå¸é²æå"); |
| | | return lAlarmHandle; |
| | | } |
| | | } |
| | | return lAlarmHandle; |
| | | } |
| | | |
| | | /** |
| | | * 注é |
| | | * |
| | | * @param lUserID è®¾å¤æ³¨åæåå¯ä¸æ è¯ç¬¦ |
| | | */ |
| | | public static void logout(int lUserID) { |
| | | // 注é |
| | | hCNetSDK.NET_DVR_Logout(lUserID); |
| | | // éæ¾sdkèµæº |
| | | hCNetSDK.NET_DVR_Cleanup(); |
| | | } |
| | | /** |
| | | * æå¾ |
| | | * |
| | | * @param cmd æå¾å½ä»¤ |
| | | */ |
| | | public static String picCutCate(CameraCmd cmd) { |
| | | String cameraId = cmd.getCameraId(); |
| | | Integer channelNum = cmd.getChannelNum(); |
| | | if (!GlobalVariable.loginMap.containsKey(cameraId)) { |
| | | return ""; |
| | | } |
| | | Integer userId = GlobalVariable.loginMap.get(cameraId); |
| | | //å¾çä¿¡æ¯ |
| | | HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA(); |
| | | //设置å¾çå辨ç |
| | | //å¾ç尺寸ï¼0-CIF(352*288/352*240)ï¼1-QCIF(176*144/176*120)ï¼2-4CIF(704*576/704*480)æD1(720*576/720*486)ï¼3-UXGA(1600*1200)ï¼ |
| | | // 4-SVGA(800*600)ï¼5-HD720P(1280*720)ï¼6-VGA(640*480)ï¼7-XVGA(1280*960)ï¼8-HD900P(1600*900)ï¼9-HD1080P(1920*1080)ï¼10-2560*1920ï¼ |
| | | // 11-1600*304ï¼12-2048*1536ï¼13-2448*2048ï¼14-2448*1200ï¼15-2448*800ï¼16-XGA(1024*768)ï¼17-SXGA(1280*1024)ï¼18-WD1(960*576/960*480), |
| | | // 19-1080I(1920*1080)ï¼20-576*576ï¼21-1536*1536ï¼22-1920*1920ï¼23-320*240ï¼24-720*720ï¼25-1024*768ï¼26-1280*1280ï¼27-1600*600ï¼ |
| | | // 28-2048*768ï¼29-160*120ï¼75-336*256ï¼78-384*256ï¼79-384*216ï¼80-320*256ï¼82-320*192ï¼83-512*384ï¼127-480*272ï¼128-512*272ï¼ 161-288*320ï¼ |
| | | // 162-144*176ï¼163-480*640ï¼164-240*320ï¼165-120*160ï¼166-576*720ï¼167-720*1280ï¼168-576*960ï¼180-180*240, 181-360*480, 182-540*720, |
| | | // 183-720*960, 184-960*1280, 185-1080*1440, 500-384*288, 0xff-Auto(使ç¨å½åç æµå辨ç) |
| | | jpeg.wPicSize = 0; |
| | | //设置å¾çè´¨éï¼0-æå¥½ï¼1-è¾å¥½ï¼2-ä¸è¬ |
| | | jpeg.wPicQuality = 0; |
| | | IntByReference a = new IntByReference(); |
| | | //设置å¾çå¤§å° |
| | | ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024); |
| | | // æå¾å°å
åï¼åå¸§æ°æ®æè·å¹¶ä¿åæJPEG忾卿å®çå
å空é´ä¸ |
| | | log.debug("-----------è¿éå¼å§å°è£
NET_DVR_CaptureJPEGPicture_NEW---------"); |
| | | boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a); |
| | | log.debug("-----------è¿éå¼å§å¾çåå
¥å
å----------" + is); |
| | | if (is) { |
| | | log.debug("hksdk(æå¾)-ç»æç¶æå¼(0表示æå):" + hCNetSDK.NET_DVR_GetLastError()); |
| | | byte[] array = jpegBuffer.array(); |
| | | //åå¨å°minio |
| | | |
| | | String ContentType = "image/JPEG"; |
| | | InputStream input = new ByteArrayInputStream(array); |
| | | String url = ""; |
| | | try { |
| | | boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, input.available(), ContentType); |
| | | if (b) { |
| | | url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName()); |
| | | url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url; |
| | | log.debug("ä¸ä¼ æä»¶æå!" + url); |
| | | } |
| | | } catch (IOException ex) { |
| | | log.error("ä¸ä¼ æä»¶å¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | return url; |
| | | } else { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.debug("æå¾å¤±è´¥,请ç¨åéè¯" + code); |
| | | return ""; |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.service.impl; |
| | | |
| | | import com.ard.alarm.camera.domain.ArdCameras; |
| | | import com.ard.hiksdk.common.GlobalVariable; |
| | | import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK; |
| | | import com.sun.jna.Pointer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | /** |
| | | * @Description: 弿¥ç»å½åè° |
| | | * @ClassName: FLoginResultCallBack |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ12æ¥13:34 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Slf4j(topic = "hikSdk") |
| | | public class LoginResultCallBack implements HCNetSDK.FLoginResultCallBack { |
| | | |
| | | private ArdCameras camera; |
| | | public LoginResultCallBack(ArdCameras camera) { |
| | | this.camera = camera; |
| | | } |
| | | |
| | | @Override |
| | | public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) { |
| | | if (GlobalVariable.loginMap.containsKey(camera.getId())) { |
| | | GlobalVariable.loginMap.remove(camera.getId()); |
| | | } |
| | | if (dwResult == 1) { |
| | | GlobalVariable.loginMap.put(camera.getId(), lUserID); |
| | | log.info(camera.getIp() + ":" + camera.getPort() + "ç»å½æå"); |
| | | camera.setLoginId(lUserID); |
| | | camera.setChannel((int) lpDeviceinfo.byChanNum); |
| | | // 设置æ¥è¦åè°å½æ°ï¼å»ºç«æ¥è¦ä¸ä¼ ééï¼å¯ç¨å¸é²ï¼ |
| | | HikClientUtil.setupAlarmChan(lUserID, -1); |
| | | } else { |
| | | log.info(camera.getIp() + ":" + camera.getPort() + "ç»å½å¤±è´¥"); |
| | | camera.setChannel(0); |
| | | camera.setLoginId(-1); |
| | | } |
| | | return 1; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.util; |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | |
| | | import java.lang.management.ManagementFactory; |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.*; |
| | | import java.util.Date; |
| | | /** |
| | | * @ClassName DateUtils |
| | | * @Description: è¿æ¯ä¸ä¸ªæ¶é´å·¥å
·ç±» |
| | | * @Author åèä¹ |
| | | * @Date 2023/2/16 21:58 |
| | | * @Version 1.0 |
| | | */ |
| | | public class DateUtils extends org.apache.commons.lang3.time.DateUtils |
| | | { |
| | | public static String YYYY = "yyyy"; |
| | | |
| | | public static String YYYY_MM = "yyyy-MM"; |
| | | |
| | | public static String YYYY_MM_DD = "yyyy-MM-dd"; |
| | | |
| | | public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; |
| | | |
| | | public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; |
| | | |
| | | private static String[] parsePatterns = { |
| | | "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", |
| | | "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", |
| | | "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; |
| | | |
| | | /** |
| | | * è·åå½åDate忥æ |
| | | * |
| | | * @return Date() å½åæ¥æ |
| | | */ |
| | | public static Date getNowDate() |
| | | { |
| | | return new Date(); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¥æ, é»è®¤æ ¼å¼ä¸ºyyyy-MM-dd |
| | | * |
| | | * @return String |
| | | */ |
| | | public static String getDate() |
| | | { |
| | | return dateTimeNow(YYYY_MM_DD); |
| | | } |
| | | |
| | | public static final String getTime() |
| | | { |
| | | return dateTimeNow(YYYY_MM_DD_HH_MM_SS); |
| | | } |
| | | |
| | | public static final String dateTimeNow() |
| | | { |
| | | return dateTimeNow(YYYYMMDDHHMMSS); |
| | | } |
| | | |
| | | public static final String dateTimeNow(final String format) |
| | | { |
| | | return parseDateToStr(format, new Date()); |
| | | } |
| | | |
| | | public static final String dateTime(final Date date) |
| | | { |
| | | return parseDateToStr(YYYY_MM_DD, date); |
| | | } |
| | | |
| | | public static final String parseDateToStr(final String format, final Date date) |
| | | { |
| | | return new SimpleDateFormat(format).format(date); |
| | | } |
| | | |
| | | public static final Date dateTime(final String format, final String ts) |
| | | { |
| | | try |
| | | { |
| | | return new SimpleDateFormat(format).parse(ts); |
| | | } |
| | | catch (ParseException e) |
| | | { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¥æè·¯å¾ å³å¹´/æ/æ¥ å¦2018/08/08 |
| | | */ |
| | | public static final String datePath() |
| | | { |
| | | Date now = new Date(); |
| | | return DateFormatUtils.format(now, "yyyy/MM/dd"); |
| | | } |
| | | |
| | | /** |
| | | * æ¥æè·¯å¾ å³å¹´/æ/æ¥ å¦20180808 |
| | | */ |
| | | public static final String dateTime() |
| | | { |
| | | Date now = new Date(); |
| | | return DateFormatUtils.format(now, "yyyyMMdd"); |
| | | } |
| | | |
| | | /** |
| | | * æ¥æåå符串转åä¸ºæ¥æ æ ¼å¼ |
| | | */ |
| | | public static Date parseDate(Object str) |
| | | { |
| | | if (str == null) |
| | | { |
| | | return null; |
| | | } |
| | | try |
| | | { |
| | | return parseDate(str.toString(), parsePatterns); |
| | | } |
| | | catch (ParseException e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæå¡å¨å¯å¨æ¶é´ |
| | | */ |
| | | public static Date getServerStartDate() |
| | | { |
| | | long time = ManagementFactory.getRuntimeMXBean().getStartTime(); |
| | | return new Date(time); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®ç¸å·®å¤©æ° |
| | | */ |
| | | public static int differentDaysByMillisecond(Date date1, Date date2) |
| | | { |
| | | return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®ä¸¤ä¸ªæ¶é´å·® |
| | | */ |
| | | public static String getDatePoor(Date endDate, Date nowDate) |
| | | { |
| | | long nd = 1000 * 24 * 60 * 60; |
| | | long nh = 1000 * 60 * 60; |
| | | long nm = 1000 * 60; |
| | | // long ns = 1000; |
| | | // è·å¾ä¸¤ä¸ªæ¶é´çæ¯«ç§æ¶é´å·®å¼ |
| | | long diff = endDate.getTime() - nowDate.getTime(); |
| | | // 计ç®å·®å¤å°å¤© |
| | | long day = diff / nd; |
| | | // 计ç®å·®å¤å°å°æ¶ |
| | | long hour = diff % nd / nh; |
| | | // 计ç®å·®å¤å°åé |
| | | long min = diff % nd % nh / nm; |
| | | // 计ç®å·®å¤å°ç§//è¾åºç»æ |
| | | // long sec = diff % nd % nh % nm / ns; |
| | | return day + "天" + hour + "å°æ¶" + min + "åé"; |
| | | } |
| | | |
| | | /** |
| | | * å¢å LocalDateTime ==> Date |
| | | */ |
| | | public static Date toDate(LocalDateTime temporalAccessor) |
| | | { |
| | | ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * å¢å LocalDate ==> Date |
| | | */ |
| | | public static Date toDate(LocalDate temporalAccessor) |
| | | { |
| | | LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); |
| | | ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | //SDKæ¶é´è§£æ |
| | | public static String parseTime(int time) |
| | | { |
| | | int year=(time>>26)+2000; |
| | | int month=(time>>22)&15; |
| | | int day=(time>>17)&31; |
| | | int hour=(time>>12)&31; |
| | | int min=(time>>6)&63; |
| | | int second=(time>>0)&63; |
| | | String sTime=String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, second); |
| | | return sTime; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.util.hikSdkUtil; |
| | | |
| | | import com.sun.jna.Structure; |
| | | |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.Modifier; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @ClassName: HIKSDKStructure |
| | | * @Description: |
| | | * å 为海康jna.jaræ¯è¾è,ç»æä½å®ä¹æ²¡ægetFiledOrderï¼å建ä¸ä¸ªç±»ç»§æ¿ Structure |
| | | * ç¶å HCNetSDK ç±»éææç»§æ¿ Structure æ¿æ¢ä¸º HIKSDKStructure å³å¯ |
| | | * @Author: Administrator |
| | | * @Date: 2023å¹´02æ01æ¥ 11:44 |
| | | * @Version: 1.0 |
| | | **/ |
| | | public class HIKSDKStructure extends Structure { |
| | | protected List<String> getFieldOrder(){ |
| | | List<String> fieldOrderList = new ArrayList<String>(); |
| | | for (Class<?> cls = getClass(); |
| | | !cls.equals(HIKSDKStructure.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()); |
| | | } |
| | | } |
| | | return fieldOrderList; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.util.imageUtil; |
| | | |
| | | /** |
| | | * @ClassName WaterMarkUtil |
| | | * @Description: |
| | | * @Author åèä¹ |
| | | * @Date 2023/1/17 20:20 |
| | | * @Version 1.0 |
| | | */ |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import java.awt.*; |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.File; |
| | | import java.io.FileOutputStream; |
| | | import java.io.InputStream; |
| | | import java.io.OutputStream; |
| | | |
| | | /** |
| | | * å¾çæ°´å°å·¥å
·ç±» |
| | | * |
| | | */ |
| | | public class waterMarkUtil { |
| | | |
| | | // æ°´å°éæåº¦ |
| | | private static final float alpha = 0.8f; |
| | | // æ°´å°æ¨ªåä½ç½® |
| | | private static int positionWidth = 100; |
| | | // æ°´å°çºµåä½ç½® |
| | | private static int positionHeight = 300; |
| | | // æ°´å°æååä½ |
| | | private static final Font font = new Font("å®ä½", Font.BOLD, 30); |
| | | // æ°´å°æåé¢è² |
| | | private static final Color color = Color.white; |
| | | |
| | | /** |
| | | * ç»å¾çæ·»å æ°´å°æå |
| | | * |
| | | * @param text æ°´å°æå |
| | | * @param srcImgPath æºå¾çè·¯å¾ |
| | | * @param targetPath ç®æ å¾çè·¯å¾ |
| | | */ |
| | | public static void markImage(String text, String srcImgPath, String targetPath) { |
| | | markImage(text, srcImgPath, targetPath, null); |
| | | } |
| | | |
| | | /** |
| | | * ç»å¾çæ·»å æ°´å°æåãå¯è®¾ç½®æ°´å°æåçæè½¬è§åº¦ |
| | | * |
| | | * @param text |
| | | * @param srcImgPath |
| | | * @param targetPath |
| | | * @param degree |
| | | */ |
| | | public static void markImage(String text, String srcImgPath, String targetPath, Integer degree) { |
| | | |
| | | OutputStream os = null; |
| | | try { |
| | | // 0ãå¾çç±»å |
| | | String type = srcImgPath.substring(srcImgPath.indexOf(".") + 1, srcImgPath.length()); |
| | | |
| | | // 1ãæºå¾ç |
| | | Image srcImg = ImageIO.read(new File(srcImgPath)); |
| | | |
| | | int imgWidth = srcImg.getWidth(null); |
| | | int imgHeight = srcImg.getHeight(null); |
| | | |
| | | BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); |
| | | |
| | | // 2ãå¾å°ç»ç¬å¯¹è±¡ |
| | | Graphics2D g = buffImg.createGraphics(); |
| | | // 3ã设置对线段çé¯é½¿ç¶è¾¹ç¼å¤ç |
| | | g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); |
| | | g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null); |
| | | // 4ãè®¾ç½®æ°´å°æè½¬ |
| | | if (null != degree) { |
| | | g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); |
| | | } |
| | | // 5ãè®¾ç½®æ°´å°æåé¢è² |
| | | g.setColor(color); |
| | | // 6ãè®¾ç½®æ°´å°æåFont |
| | | g.setFont(font); |
| | | // 7ãè®¾ç½®æ°´å°æåéæåº¦ |
| | | g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); |
| | | // 8ã第ä¸åæ°->设置çå
容ï¼åé¢ä¸¤ä¸ªåæ°->æåå¨å¾çä¸çåæ ä½ç½®(x,y) |
| | | positionWidth = 50; |
| | | positionHeight = imgHeight - 30; |
| | | g.drawString(text, positionWidth, positionHeight); |
| | | // 9ãéæ¾èµæº |
| | | g.dispose(); |
| | | // 10ãçæå¾ç |
| | | os = new FileOutputStream(targetPath); |
| | | // ImageIO.write(buffImg, "JPG", os); |
| | | ImageIO.write(buffImg, type.toUpperCase(), os); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | try { |
| | | if (null != os) { |
| | | os.close(); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ç»å¾çæ·»å æ°´å°æåãå¯è®¾ç½®æ°´å°æåçæè½¬è§åº¦ |
| | | * |
| | | * @param text |
| | | * @param inputStream |
| | | * @param outputStream |
| | | * @param degree |
| | | * @param typeName |
| | | */ |
| | | public static void markImageByIO(String text, InputStream inputStream, OutputStream outputStream, |
| | | Integer degree, String typeName) { |
| | | try { |
| | | // 1ãæºå¾ç |
| | | Image srcImg = ImageIO.read(inputStream); |
| | | |
| | | int imgWidth = srcImg.getWidth(null); |
| | | int imgHeight = srcImg.getHeight(null); |
| | | BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); |
| | | |
| | | // 2ãå¾å°ç»ç¬å¯¹è±¡ |
| | | Graphics2D g = buffImg.createGraphics(); |
| | | // 3ã设置对线段çé¯é½¿ç¶è¾¹ç¼å¤ç |
| | | g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); |
| | | g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null); |
| | | // 4ãè®¾ç½®æ°´å°æè½¬ |
| | | if (null != degree) { |
| | | g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); |
| | | } |
| | | // 5ãè®¾ç½®æ°´å°æåé¢è² |
| | | g.setColor(color); |
| | | // 6ãè®¾ç½®æ°´å°æåFont |
| | | g.setFont(font); |
| | | // 7ãè®¾ç½®æ°´å°æåéæåº¦ |
| | | g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); |
| | | // 8ã第ä¸åæ°->设置çå
容ï¼åé¢ä¸¤ä¸ªåæ°->æåå¨å¾çä¸çåæ ä½ç½®(x,y) |
| | | |
| | | g.drawString(text, positionWidth, positionHeight); |
| | | // 9ãéæ¾èµæº |
| | | g.dispose(); |
| | | // 10ãçæå¾ç |
| | | ImageIO.write(buffImg, typeName.toUpperCase(), outputStream); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | // public static void main(String[] args) { |
| | | // String srcImgPath = "D:\\testSmile.jpg"; |
| | | // String text = "JCccc"; |
| | | // // ç»å¾çæ·»å æ°´å°æå |
| | | // markImage(text, srcImgPath, "D:\\testSmileWithMark.jpg"); |
| | | // // ç»å¾çæ·»å æ°´å°æå,æ°´å°æåæè½¬-45 |
| | | // markImage(text, srcImgPath, "D:\\testSmileWithMarkRotate.jpg", -45); |
| | | // System.out.println("ç»å¾çæ·»å æ°´å°æå宿¯"); |
| | | // } |
| | | |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.hiksdk.util.minio; |
| | | |
| | | import com.ard.config.MinioClientSingleton; |
| | | import io.minio.*; |
| | | import io.minio.http.Method; |
| | | import io.minio.messages.Bucket; |
| | | import io.minio.messages.DeleteError; |
| | | import io.minio.messages.DeleteObject; |
| | | import io.minio.messages.Item; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import java.io.*; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * @Description: Minio客æ·ç«¯å·¥å
·ç±» |
| | | * @ClassName: MinioUtils |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´05æ18æ¥9:34 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @SuppressWarnings("ALL") |
| | | @Slf4j(topic = "minio") |
| | | public class MinioUtils { |
| | | |
| | | /** |
| | | * å¤ææ¡¶æ¯å¦åå¨ |
| | | */ |
| | | public static boolean exitsBucket(String bucketName) { |
| | | boolean found = false; |
| | | try { |
| | | BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build(); |
| | | found = MinioClientSingleton.getMinioClient().bucketExists(bucketExistsArgs); |
| | | } catch (Exception ex) { |
| | | log.error("minioå¤ææ¡¶åå¨å¼å¸¸ï¼", ex.getMessage()); |
| | | } |
| | | return found; |
| | | } |
| | | |
| | | /** |
| | | * å建桶,并设置桶çç¥ä¸ºå
Œ
± |
| | | */ |
| | | public static boolean createBucket(String bucketName) { |
| | | try { |
| | | /*å建桶*/ |
| | | MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); |
| | | MinioClientSingleton.getMinioClient().makeBucket(makeBucketArgs); |
| | | /*设置çç¥*/ |
| | | String sb = "{\"Version\":\"2012-10-17\"," + |
| | | "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" + |
| | | "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," + |
| | | "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + |
| | | "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" + |
| | | bucketName + "/*\"]}]}"; |
| | | SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder() |
| | | .bucket(bucketName) |
| | | .config(sb) |
| | | .build(); |
| | | MinioClientSingleton.getMinioClient().setBucketPolicy(setBucketPolicyArgs); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioå建桶å¼å¸¸ï¼", ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å é¤ä¸ä¸ªæ¡¶ |
| | | * |
| | | * @param bucket æ¡¶åç§° |
| | | */ |
| | | public static boolean removeBucket(String bucket) { |
| | | try { |
| | | boolean found = exitsBucket(bucket); |
| | | if (found) { |
| | | Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder().bucket(bucket).build()); |
| | | for (Result<Item> result : myObjects) { |
| | | Item item = result.get(); |
| | | //æå¯¹è±¡æä»¶ï¼åå é¤å¤±è´¥ |
| | | if (item.size() > 0) { |
| | | return false; |
| | | } |
| | | } |
| | | // å é¤`bucketName`å卿¡¶ï¼æ³¨æï¼åªæå卿¡¶ä¸ºç©ºæ¶æè½å 餿åã |
| | | MinioClientSingleton.getMinioClient().removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); |
| | | found = exitsBucket(bucket); |
| | | return !found; |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("å 餿¡¶å¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æææ¡¶æä»¶ |
| | | * |
| | | * @return |
| | | */ |
| | | public static List<Bucket> getListBuckets() { |
| | | try { |
| | | return MinioClientSingleton.getMinioClient().listBuckets(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | /** |
| | | * çæä¸ä¸ªGET请æ±ç带æå¤±ææ¶é´çåäº«é¾æ¥ã |
| | | * å¤±ææ¶é´é»è®¤æ¯7天ã |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param objectName å卿¡¶éç对象åç§° |
| | | * @param expires å¤±ææ¶é´ï¼ä»¥ç§ä¸ºåä½ï¼ï¼é»è®¤æ¯7天ï¼ä¸å¾å¤§äºä¸å¤© |
| | | * @return |
| | | */ |
| | | public static String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) { |
| | | String url = ""; |
| | | if (exitsBucket(bucketName)) { |
| | | try { |
| | | GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder() |
| | | .method(Method.GET) |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .expiry(expires, timeUnit) |
| | | .build(); |
| | | url = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); |
| | | } catch (Exception ex) { |
| | | log.error("minioçæå¤±æurlå¼å¸¸", ex.getMessage()); |
| | | } |
| | | } |
| | | return url; |
| | | } |
| | | |
| | | /** |
| | | * @æè¿° ä¸ä¼ MultipartFileæä»¶è¿åurl |
| | | * @åæ° [bucketName, file] |
| | | * @è¿åå¼ java.lang.String |
| | | * @å建人 åèä¹ |
| | | * @å建æ¶é´ 2023/5/18 12:16 |
| | | * @ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | public static String putObjectAndGetUrl(String bucketName, MultipartFile file) { |
| | | //夿æä»¶æ¯å¦ä¸ºç©º |
| | | if (null == file || 0 == file.getSize()) { |
| | | log.error("ä¸ä¼ minioæä»¶æå¡å¨é误ï¼ä¸ä¼ æä»¶ä¸ºç©º"); |
| | | } |
| | | boolean exsit = exitsBucket(bucketName); |
| | | if (!exsit) { |
| | | log.error(bucketName + "-æ¡¶ä¸åå¨"); |
| | | } |
| | | //æä»¶å |
| | | String originalFilename = file.getOriginalFilename(); |
| | | //æ°çæä»¶å |
| | | String fileName = UUID.randomUUID().toString().replace("-", "") + originalFilename; |
| | | try { |
| | | InputStream inputStream = file.getInputStream(); |
| | | /*ä¸ä¼ 对象*/ |
| | | PutObjectArgs putObjectArgs = PutObjectArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .object(fileName) |
| | | .stream(inputStream, file.getSize(), -1) |
| | | .contentType(file.getContentType()) |
| | | .build(); |
| | | MinioClientSingleton.getMinioClient().putObject(putObjectArgs); |
| | | inputStream.close(); |
| | | /*è·åurl*/ |
| | | GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .object(fileName) |
| | | .build(); |
| | | return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); |
| | | } catch (Exception ex) { |
| | | log.error("ä¸ä¼ 对象è¿åurlå¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | /** |
| | | * å 餿件 |
| | | * |
| | | * @param bucket æ¡¶åç§° |
| | | * @param objectName 对象åç§° |
| | | * @return boolean |
| | | */ |
| | | public static boolean removeObject(String bucket, String objectName) { |
| | | try { |
| | | boolean exsit = exitsBucket(bucket); |
| | | if (exsit) { |
| | | RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(objectName).build(); |
| | | MinioClientSingleton.getMinioClient().removeObject(removeObjectArgs); |
| | | return true; |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("removeObject", e); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå 餿件 |
| | | * |
| | | * @param objectNames 对象åç§° |
| | | * @return boolean |
| | | */ |
| | | public static boolean removeObjects(String bucket, List<String> objectNames) { |
| | | if (exitsBucket(bucket)) { |
| | | try { |
| | | List<DeleteObject> objects = new LinkedList<>(); |
| | | for (String str : objectNames) { |
| | | objects.add(new DeleteObject(str)); |
| | | } |
| | | RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucket).objects(objects).build(); |
| | | Iterable<Result<DeleteError>> results = MinioClientSingleton.getMinioClient().removeObjects(removeObjectsArgs); |
| | | /*å é¤å®éåç»æï¼å¦åå 䏿*/ |
| | | for (Result<DeleteError> result : results) { |
| | | DeleteError error = result.get(); |
| | | log.error("Error in deleting object " + error.objectName() + "; " + error.message()); |
| | | } |
| | | |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioæ¹éå 餿件å¼å¸¸", ex.getMessage()); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * è·åå个桶ä¸çæææä»¶å¯¹è±¡åç§° |
| | | * |
| | | * @param bucket æ¡¶åç§° |
| | | * @return {@link List}<{@link String}> |
| | | */ |
| | | public static List<String> getBucketObjectName(String bucket) { |
| | | boolean exsit = exitsBucket(bucket); |
| | | if (exsit) { |
| | | List<String> listObjetcName = new ArrayList<>(); |
| | | try { |
| | | ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucket).build(); |
| | | Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(listObjectsArgs); |
| | | for (Result<Item> result : myObjects) { |
| | | Item item = result.get(); |
| | | listObjetcName.add(item.objectName()); |
| | | } |
| | | return listObjetcName; |
| | | } catch (Exception ex) { |
| | | log.error("minioè·åæ¡¶ä¸å¯¹è±¡å¼å¸¸ï¼" + ex.getMessage()); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * è·åæä¸ªæ¡¶ä¸æä¸ªå¯¹è±¡çURL |
| | | * |
| | | * @param bucket æ¡¶åç§° |
| | | * @param objectName 对象å (æä»¶å¤¹å + æä»¶å) |
| | | * @return |
| | | */ |
| | | public static String getBucketObjectUrl(String bucketName, String objectName) { |
| | | try { |
| | | if (!exitsBucket(bucketName)) { |
| | | return ""; |
| | | } |
| | | GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .method(Method.GET) |
| | | .build(); |
| | | return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); |
| | | } catch (Exception ex) { |
| | | log.error("minioè·å对象URLå¼å¸¸" + ex.getMessage()); |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ 对象-stream |
| | | * |
| | | * @param bucketName bucketåç§° |
| | | * @param objectName â½ä»¶åç§° |
| | | * @param stream â½ä»¶æµ |
| | | * @param size ⼤⼩ |
| | | * @param contextType ç±»å Image/jpeg æµè§å¨å¯ä»¥ç´æ¥æå¼ï¼å¦åä¸è½½ |
| | | */ |
| | | public static boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) { |
| | | try { |
| | | PutObjectArgs putObjectArgs = PutObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .stream(stream, size, -1) |
| | | .contentType(contextType) |
| | | .build(); |
| | | ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioä¸ä¼ æä»¶(éè¿stream)å¼å¸¸" + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ 对象-File |
| | | * |
| | | * @param bucketName bucketåç§° |
| | | * @param objectName â½ä»¶åç§° |
| | | * @param file â½ä»¶ |
| | | * @param contextType ç±»å Image/jpeg æµè§å¨å¯ä»¥ç´æ¥æå¼ï¼å¦åä¸è½½ |
| | | */ |
| | | public static boolean uploadObject(String bucketName, String objectName, File file, String contextType) { |
| | | try { |
| | | FileInputStream fileInputStream = new FileInputStream(file); |
| | | PutObjectArgs putObjectArgs = PutObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .stream(fileInputStream, file.length(), -1) |
| | | .contentType(contextType) |
| | | .build(); |
| | | ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioä¸ä¼ æä»¶(éè¿File)å¼å¸¸" + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ 对象-MultipartFile |
| | | * |
| | | * @param bucketName bucketåç§° |
| | | * @param objectName â½ä»¶åç§° |
| | | * @param MultipartFile â½ä»¶ |
| | | * @param contextType ç±»å Image/jpeg æµè§å¨å¯ä»¥ç´æ¥æå¼ï¼å¦åä¸è½½ |
| | | */ |
| | | public static boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) { |
| | | try { |
| | | if (bucketName.isEmpty()) { |
| | | log.error("bucketå称为空"); |
| | | return false; |
| | | } |
| | | if (objectName.isEmpty()) { |
| | | log.error("对象å称为空"); |
| | | return false; |
| | | } |
| | | InputStream inputStream = multipartFile.getInputStream(); |
| | | PutObjectArgs putObjectArgs = PutObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .stream(inputStream, multipartFile.getSize(), -1) |
| | | .contentType(contextType) |
| | | .build(); |
| | | ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioä¸ä¼ æä»¶(éè¿File)å¼å¸¸" + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ 对象,ç¨multipartFileåç§°ä½ä¸ºå¯¹è±¡å |
| | | * |
| | | * @param bucketName bucketåç§° |
| | | * @param objectName â½ä»¶åç§° |
| | | * @param MultipartFile â½ä»¶ |
| | | * @param contextType ç±»å Image/jpeg æµè§å¨å¯ä»¥ç´æ¥æå¼ï¼å¦åä¸è½½ |
| | | */ |
| | | public static boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) { |
| | | try { |
| | | if (multipartFile == null) { |
| | | log.error("ä¸ä¼ æä»¶ä¸ºç©º"); |
| | | return false; |
| | | } |
| | | String objectName = multipartFile.getOriginalFilename(); |
| | | InputStream inputStream = multipartFile.getInputStream(); |
| | | PutObjectArgs putObjectArgs = PutObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .stream(inputStream, multipartFile.getSize(), -1) |
| | | .contentType(contextType) |
| | | .build(); |
| | | MinioClientSingleton.getMinioClient().putObject(putObjectArgs); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | log.error("minioä¸ä¼ æä»¶(éè¿File)å¼å¸¸" + ex.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ 对象-éè¿æ¬å°è·¯å¾ |
| | | * |
| | | * @param bulkName |
| | | * @param objectName |
| | | * @param localFilePathName |
| | | * @return |
| | | */ |
| | | public static boolean uploadObject(String bulkName, String objectName, String localFilePathName, String contextType) { |
| | | try { |
| | | if (!exitsBucket(bulkName)) { |
| | | log.debug(bulkName + "ä¸åå¨"); |
| | | return false; |
| | | } |
| | | File file = new File(localFilePathName); |
| | | if (!file.exists()) { |
| | | log.debug("æä»¶ä¸åå¨"); |
| | | return false; |
| | | } |
| | | UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder() |
| | | .bucket(bulkName) |
| | | .object(objectName) |
| | | .filename(localFilePathName) |
| | | .contentType(contextType) |
| | | .build(); |
| | | ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().uploadObject(uploadObjectArgs); |
| | | return true; |
| | | } catch (Exception e) { |
| | | log.error("minio upload object file error " + e.getMessage()); |
| | | return false; |
| | | } |
| | | } |
| | | /** |
| | | *@æè¿° è·åæ¡¶ä¸ææå¯¹è±¡ |
| | | *@åæ° [bucketName] |
| | | *@è¿åå¼ java.lang.Iterable<io.minio.Result<io.minio.messages.Item>> |
| | | *@å建人 åèä¹ |
| | | *@å建æ¶é´ 2023/2/6 10:32 |
| | | *@ä¿®æ¹äººåå
¶å®ä¿¡æ¯ |
| | | */ |
| | | public static Iterable<Result<Item>> getObjectsByBucket(String bucketName) { |
| | | Iterable<Result<Item>> listObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder() |
| | | .bucket(bucketName) |
| | | .recursive(true) |
| | | .build()); |
| | | return listObjects; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | // /*å 餿¡¶*/ |
| | | // boolean b = removeBucket("lsy"); |
| | | // log.info(String.valueOf(b)); |
| | | // /*å建桶*/ |
| | | // boolean lsy = createBucket("lsy"); |
| | | // log.info(String.valueOf(lsy)); |
| | | // /*å¤ææ¡¶æ¯å¦åå¨*/ |
| | | // boolean pic = exitsBucket("lsy"); |
| | | // log.info(String.valueOf(pic)); |
| | | /*æ¥è¯¢æææ¡¶*/ |
| | | // List<Bucket> listBuckets = getListBuckets(); |
| | | // for (Bucket bucket : listBuckets) { |
| | | // log.info(bucket.name()); |
| | | // } |
| | | String bucket = "lsy"; |
| | | String filename = UUID.randomUUID().toString().replace("-", "") + "pic.jpeg"; |
| | | String fileFullPath = "C:\\Users\\Administrator\\Desktop\\微信æªå¾_20230518102605.png"; |
| | | // uploadObject(bucket, filename, fileFullPath, "Image/jpeg"); |
| | | // String url = getObjectWithExpired(bucket, filename, 10, SECONDS); |
| | | // System.out.println(url); |
| | | boolean b = removeBucket(bucket); |
| | | System.out.println(b); |
| | | // boolean b = uploadObjectBylocalPath(bucket, filename, fileFullPath); |
| | | // System.out.println(b); |
| | | //String url = getObjectWithExpired(bucket, filename, 10000); |
| | | // |
| | | //String url = getBucketObject(bucket, filename); |
| | | // System.out.println(url); package com.example.minio; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | |
| | | /** |
| | | * @Description: æ¶é´å¤çå·¥å
· |
| | | * @ClassName: DateUtils |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ06æ¥10:04 |
| | | * @Version: 1.0 |
| | | **/ |
| | | public class DateUtils { |
| | | |
| | | /** |
| | | * æ¥æåç¬¦ä¸²çææ¥æ¶åç§èªå¨è¡¥é¶,å¹¶å°/æ¿æ¢æ- |
| | | * */ |
| | | public static String convertDate(String startDate) { |
| | | DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy/M/d H:m:s"); |
| | | DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | return LocalDateTime.parse(startDate, inputFormat).format(outputFormat); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils; |
| | | |
| | | import org.springframework.beans.BeansException; |
| | | import org.springframework.context.ApplicationContext; |
| | | import org.springframework.context.ApplicationContextAware; |
| | | import org.springframework.stereotype.Component; |
| | | /** |
| | | * @Description: |
| | | * @ClassName: SpringTool |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ06æ¥9:14 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Component |
| | | public class SpringTool implements ApplicationContextAware { |
| | | |
| | | private static ApplicationContext applicationContext = null; |
| | | |
| | | @Override |
| | | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
| | | if (SpringTool.applicationContext == null) { |
| | | SpringTool.applicationContext = applicationContext; |
| | | } |
| | | } |
| | | |
| | | //è¯¥æ¹æ³ç¨äºå¤çè·åApplicationContext对象 |
| | | public static ApplicationContext getApplicationContext() { |
| | | return applicationContext; |
| | | } |
| | | |
| | | //è¯¥æ¹æ³ç¨äºå¤çéè¿beançååè·åBean对象 |
| | | public static Object getBean(String name) { |
| | | return getApplicationContext().getBean(name); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils.mqtt; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.*; |
| | | import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; |
| | | import org.springframework.boot.ApplicationArguments; |
| | | import org.springframework.boot.ApplicationRunner; |
| | | import org.springframework.stereotype.Component; |
| | | import java.io.UnsupportedEncodingException; |
| | | /** |
| | | * @Description: mqttæ¶è´¹å®¢æ·ç«¯ |
| | | * @ClassName: MqttConsumer |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´05æ29æ¥9:55 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Component |
| | | @Slf4j(topic = "mqtt") |
| | | public class MqttConsumer implements ApplicationRunner { |
| | | |
| | | private static MqttClient client; |
| | | |
| | | @Override |
| | | public void run(ApplicationArguments args) { |
| | | log.info("åå§åå¹¶å¯å¨mqtt......"); |
| | | if(PropertiesUtil.MQTT_ENABLED) |
| | | { |
| | | this.connect(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è¿æ¥mqttæå¡å¨ |
| | | */ |
| | | private void connect() { |
| | | try { |
| | | // 1 å建客æ·ç«¯ |
| | | getClient(); |
| | | // 2 设置é
ç½® |
| | | MqttConnectOptions options = getOptions(); |
| | | String[] topic = PropertiesUtil.MQTT_TOPIC.split(","); |
| | | // 3 æ¶æ¯åå¸è´¨é |
| | | int[] qos = getQos(topic.length); |
| | | // 4 æå设置 |
| | | create(options, topic, qos); |
| | | } catch (Exception e) { |
| | | log.error("mqttè¿æ¥å¼å¸¸ï¼" + e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å建客æ·ç«¯ --- 1 --- |
| | | */ |
| | | public void getClient() { |
| | | try { |
| | | if (null == client) { |
| | | client = new MqttClient(PropertiesUtil.MQTT_HOST, PropertiesUtil.MQTT_CLIENT_ID, new MemoryPersistence()); |
| | | } |
| | | log.info("--å建mqtt客æ·ç«¯"); |
| | | } catch (Exception e) { |
| | | log.error("å建mqtt客æ·ç«¯å¼å¸¸ï¼" + e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çæé
置对象ï¼ç¨æ·åï¼å¯ç ç --- 2 --- |
| | | */ |
| | | public MqttConnectOptions getOptions() { |
| | | MqttConnectOptions options = new MqttConnectOptions(); |
| | | //è®¾ç½®ç¨æ·åå¯ç |
| | | options.setUserName(PropertiesUtil.MQTT_USER_NAME); |
| | | options.setPassword(PropertiesUtil.MQTT_PASSWORD.toCharArray()); |
| | | // 设置è¶
æ¶æ¶é´ |
| | | options.setConnectionTimeout(PropertiesUtil.MQTT_TIMEOUT); |
| | | // 设置ä¼è¯å¿è·³æ¶é´ |
| | | options.setKeepAliveInterval(PropertiesUtil.MQTT_KEEP_ALIVE); |
| | | // æ¯å¦æ¸
é¤session |
| | | options.setCleanSession(false); |
| | | log.info("--çæmqtté
置对象"); |
| | | return options; |
| | | } |
| | | |
| | | /** |
| | | * qos --- 3 --- |
| | | */ |
| | | public int[] getQos(int length) { |
| | | |
| | | int[] qos = new int[length]; |
| | | for (int i = 0; i < length; i++) { |
| | | /** |
| | | * MQTTåè®®ä¸æä¸ç§æ¶æ¯å叿å¡è´¨é: |
| | | * |
| | | * QOS0ï¼ âè³å¤ä¸æ¬¡âï¼æ¶æ¯åå¸å®å
¨ä¾èµåºå± TCP/IP ç½ç»ãä¼åçæ¶æ¯ä¸¢å¤±æéå¤ãè¿ä¸çº§å«å¯ç¨äºå¦ä¸æ
åµï¼ç¯å¢ä¼ æå¨æ°æ®ï¼ä¸¢å¤±ä¸æ¬¡è¯»è®°å½æ æè°ï¼å 为ä¸ä¹
åè¿ä¼æç¬¬äºæ¬¡åéã |
| | | * QOS1ï¼ âè³å°ä¸æ¬¡âï¼ç¡®ä¿æ¶æ¯å°è¾¾ï¼ä½æ¶æ¯éå¤å¯è½ä¼åçã |
| | | * QOS2ï¼ âåªæä¸æ¬¡âï¼ç¡®ä¿æ¶æ¯å°è¾¾ä¸æ¬¡ãè¿ä¸çº§å«å¯ç¨äºå¦ä¸æ
åµï¼å¨è®¡è´¹ç³»ç»ä¸ï¼æ¶æ¯é夿䏢失ä¼å¯¼è´ä¸æ£ç¡®çç»æï¼èµæºå¼é大 |
| | | */ |
| | | qos[i] = 1; |
| | | } |
| | | log.info("--è®¾ç½®æ¶æ¯åå¸è´¨é"); |
| | | return qos; |
| | | } |
| | | |
| | | /** |
| | | * è£
è½½åç§å®ä¾å订é
ä¸»é¢ --- 4 --- |
| | | */ |
| | | public void create(MqttConnectOptions options, String[] topic, int[] qos) { |
| | | try { |
| | | client.setCallback(new MqttConsumerCallback(client, options, topic, qos)); |
| | | log.info("--æ·»å åè°å¤çç±»"); |
| | | client.connect(options); |
| | | } catch (Exception e) { |
| | | log.info("è£
è½½å®ä¾æè®¢é
主é¢å¼å¸¸ï¼" + e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 订é
æä¸ªä¸»é¢ |
| | | * |
| | | * @param topic |
| | | * @param qos |
| | | */ |
| | | public void subscribe(String topic, int qos) { |
| | | try { |
| | | log.info("topic:" + topic); |
| | | client.subscribe(topic, qos); |
| | | } catch (MqttException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå¸ï¼éæä¹
å |
| | | * |
| | | * qosæ ¹æ®ææ¡£è®¾ç½®ä¸º1 |
| | | * |
| | | * @param topic |
| | | * @param msg |
| | | */ |
| | | public static void publish(String topic, String msg) { |
| | | publish(1, false, topic, msg); |
| | | } |
| | | |
| | | /** |
| | | * åå¸ |
| | | */ |
| | | public static void publish(int qos, boolean retained, String topic, String pushMessage) { |
| | | log.info("ã主é¢ã:" + topic + "ãqosã:" + qos + "ãpushMessageã:" + pushMessage); |
| | | MqttMessage message = new MqttMessage(); |
| | | message.setQos(qos); |
| | | message.setRetained(retained); |
| | | try { |
| | | message.setPayload(pushMessage.getBytes("UTF-8")); |
| | | } catch (UnsupportedEncodingException e) { |
| | | log.error("mqttç¼ç å¼å¸¸ï¼" + e.getMessage()); |
| | | } |
| | | MqttTopic mTopic = client.getTopic(topic); |
| | | if (null == mTopic) { |
| | | log.error("topicï¼" + topic + " ä¸åå¨"); |
| | | } |
| | | MqttDeliveryToken token; |
| | | try { |
| | | token = mTopic.publish(message); |
| | | token.waitForCompletion(); |
| | | if (token.isComplete()) { |
| | | log.info("æ¶æ¯åéæå"); |
| | | } |
| | | } catch (MqttPersistenceException e) { |
| | | e.printStackTrace(); |
| | | } catch (MqttException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils.mqtt; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.*; |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * @Description: mqttåè°å¤çç±» |
| | | * @ClassName: MqttConsumerCallback |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´05æ29æ¥9:55 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Slf4j(topic = "mqtt") |
| | | public class MqttConsumerCallback implements MqttCallbackExtended { |
| | | |
| | | private MqttClient client; |
| | | private MqttConnectOptions options; |
| | | private String[] topic; |
| | | private int[] qos; |
| | | |
| | | public MqttConsumerCallback(MqttClient client, MqttConnectOptions options, String[] topic, int[] qos) { |
| | | this.client = client; |
| | | this.options = options; |
| | | this.topic = topic; |
| | | this.qos = qos; |
| | | } |
| | | |
| | | /** |
| | | * æå¼éè¿ |
| | | */ |
| | | @Override |
| | | public void connectionLost(Throwable cause) { |
| | | log.info("MQTTè¿æ¥æå¼ï¼åèµ·éè¿......"); |
| | | try { |
| | | while (!client.isConnected()) { |
| | | Thread.sleep(5000); |
| | | if (null != client && !client.isConnected()) { |
| | | client.reconnect(); |
| | | log.error("å°è¯éæ°è¿æ¥"); |
| | | } else { |
| | | client.connect(options); |
| | | log.error("å°è¯å»ºç«æ°è¿æ¥"); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¥æ¶å°æ¶æ¯è°ç¨ä»¤çä¸è°ç¨ |
| | | */ |
| | | @Override |
| | | public void deliveryComplete(IMqttDeliveryToken token) { |
| | | |
| | | //log.info("deliveryComplete---------" + Arrays.toString(topic)); |
| | | } |
| | | |
| | | /** |
| | | * æ¶æ¯å¤ç |
| | | */ |
| | | @Override |
| | | public void messageArrived(String topic, MqttMessage message) { |
| | | try { |
| | | // subscribeåå¾å°çæ¶æ¯ä¼æ§è¡å°è¿éé¢ |
| | | log.info("æ¥æ¶æ¶æ¯ ã主é¢ã:" + topic + " ãå
容ã:" + new String(message.getPayload())); |
| | | //è¿è¡ä¸å¡å¤ç |
| | | |
| | | } catch (Exception e) { |
| | | log.info("å¤çmqttæ¶æ¯å¼å¸¸:" + e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * mqttè¿æ¥å订é
ä¸»é¢ |
| | | */ |
| | | @Override |
| | | public void connectComplete(boolean b, String s) { |
| | | try { |
| | | if (null != topic && null != qos) { |
| | | if (client.isConnected()) { |
| | | client.subscribe(topic, qos); |
| | | log.info("mqttè¿æ¥æåï¼å®¢æ·ç«¯IDï¼" + PropertiesUtil.MQTT_CLIENT_ID); |
| | | log.info("--订é
主é¢:ï¼" + Arrays.toString(topic)); |
| | | } else { |
| | | log.info("mqttè¿æ¥å¤±è´¥ï¼å®¢æ·ç«¯IDï¼" + PropertiesUtil.MQTT_CLIENT_ID); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.info("mqtt订é
主é¢å¼å¸¸:" + e); |
| | | } |
| | | } |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils.mqtt; |
| | | |
| | | import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; |
| | | import org.springframework.core.io.ClassPathResource; |
| | | import org.springframework.core.io.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Objects; |
| | | import java.util.Properties; |
| | | |
| | | /** |
| | | * @Description: è·åé
ç½®ä¿¡æ¯ |
| | | * @ClassName: PropertiesUtil |
| | | * @Author: åèä¹ |
| | | * @Date: 2023å¹´06æ06æ¥9:40 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Component |
| | | public class PropertiesUtil { |
| | | |
| | | public static String MQTT_HOST; |
| | | public static String MQTT_CLIENT_ID; |
| | | public static String MQTT_USER_NAME; |
| | | public static String MQTT_PASSWORD; |
| | | public static String MQTT_TOPIC; |
| | | public static Integer MQTT_TIMEOUT; |
| | | public static Integer MQTT_KEEP_ALIVE; |
| | | public static Boolean MQTT_ENABLED; |
| | | static { |
| | | MQTT_HOST = getYmlNew("spring.mqtt.host"); |
| | | MQTT_CLIENT_ID = getYmlNew("spring.mqtt.clientId"); |
| | | MQTT_USER_NAME = getYmlNew("spring.mqtt.username"); |
| | | MQTT_PASSWORD = getYmlNew("spring.mqtt.password"); |
| | | MQTT_TOPIC = getYmlNew("spring.mqtt.topic"); |
| | | MQTT_TIMEOUT = Integer.valueOf(Objects.requireNonNull(getYmlNew("spring.mqtt.timeout"))); |
| | | MQTT_KEEP_ALIVE = Integer.valueOf(Objects.requireNonNull(getYmlNew("spring.mqtt.keepalive"))); |
| | | MQTT_ENABLED = Boolean.valueOf(getYmlNew("spring.mqtt.enabled")); |
| | | } |
| | | |
| | | public static String getYmlNew(String key) { |
| | | Resource resource = new ClassPathResource("application.yml"); |
| | | Properties properties; |
| | | try { |
| | | YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); |
| | | yamlFactory.setResources(resource); |
| | | properties = yamlFactory.getObject(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return null; |
| | | } |
| | | assert properties != null; |
| | | return properties.get(key).toString(); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils.udp; |
| | | |
| | | import com.ard.alarm.tube.service.TubeAlarmService; |
| | | import com.ard.utils.SpringTool; |
| | | import io.netty.buffer.ByteBuf; |
| | | import io.netty.buffer.Unpooled; |
| | | import io.netty.channel.ChannelHandlerContext; |
| | | import io.netty.channel.SimpleChannelInboundHandler; |
| | | import io.netty.channel.socket.DatagramPacket; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.nio.charset.Charset; |
| | | |
| | | @Slf4j(topic = "tube") |
| | | public class NettyUdpHandler extends SimpleChannelInboundHandler<DatagramPacket> { |
| | | |
| | | @Override |
| | | protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) { |
| | | try { |
| | | ByteBuf byteBuf = packet.content(); |
| | | String str = byteBuf.toString(Charset.forName("GBK")); |
| | | log.info("udpæ¶å°æ°æ®: " + str); |
| | | TubeAlarmService tubeAlarmService = (TubeAlarmService) SpringTool.getApplicationContext().getBean("tubeAlarmService"); |
| | | tubeAlarmService.alarmHandler(str); |
| | | String resStr = "ok"; |
| | | byte[] resBytes = resStr.getBytes(Charset.forName("GBK")); |
| | | DatagramPacket resData = new DatagramPacket(Unpooled.copiedBuffer(resBytes), packet.sender()); |
| | | ctx.writeAndFlush(resData); |
| | | } catch (Exception e) { |
| | | log.error("udpæ¥æ¶æ°æ®å¼å¸¸:" + e.getMessage()); |
| | | } |
| | | } |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ard.utils.udp; |
| | | |
| | | import io.netty.bootstrap.Bootstrap; |
| | | import io.netty.channel.ChannelFuture; |
| | | import io.netty.channel.ChannelOption; |
| | | import io.netty.channel.EventLoopGroup; |
| | | import io.netty.channel.nio.NioEventLoopGroup; |
| | | import io.netty.channel.socket.nio.NioDatagramChannel; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.scheduling.annotation.EnableAsync; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | @EnableAsync |
| | | @Component |
| | | @Slf4j(topic = "tube") |
| | | public class NettyUdpServer { |
| | | /** |
| | | * å¯å¨æå¡ |
| | | */ |
| | | @Async |
| | | public void init(int port) { |
| | | |
| | | //表示æå¡å¨è¿æ¥çå¬çº¿ç¨ç»ï¼ä¸é¨æ¥å accept æ°ç客æ·ç«¯client è¿æ¥ |
| | | EventLoopGroup bossLoopGroup = new NioEventLoopGroup(); |
| | | try { |
| | | //1ãå建netty bootstrap å¯å¨ç±» |
| | | Bootstrap serverBootstrap = new Bootstrap(); |
| | | //2ã设置boostrap çeventLoopGroup线ç¨ç» |
| | | serverBootstrap = serverBootstrap.group(bossLoopGroup); |
| | | //3ã设置NIO UDPè¿æ¥éé |
| | | serverBootstrap = serverBootstrap.channel(NioDatagramChannel.class); |
| | | //4ã设置ééåæ° SO_BROADCAST广æå½¢å¼ |
| | | serverBootstrap = serverBootstrap.option(ChannelOption.SO_BROADCAST, true); |
| | | //5ã设置å¤çç±» è£
é
æµæ°´çº¿ |
| | | serverBootstrap = serverBootstrap.handler(new NettyUdpHandler()); |
| | | //6ãç»å®serverï¼éè¿è°ç¨syncï¼ï¼æ¹æ³å¼æ¥é»å¡ï¼ç´å°ç»å®æå |
| | | ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); |
| | | log.info("started and listened on " + channelFuture.channel().localAddress()); |
| | | //7ãçå¬ééå
³éäºä»¶ï¼åºç¨ç¨åºä¼ä¸ç´çå¾
ï¼ç´å°channelå
³é |
| | | channelFuture.channel().closeFuture().sync(); |
| | | } catch (Exception e) { |
| | | log.error("error:"+e.getMessage()); |
| | | } finally { |
| | | log.info("netty udp close!"); |
| | | //8 å
³éEventLoopGroupï¼ |
| | | bossLoopGroup.shutdownGracefully(); |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | spring: |
| | | netty: |
| | | port: 40000 |
| | | enabled: true |
| | | mqtt: |
| | | host: tcp://192.168.1.15:1883 |
| | | clientId: c3 |
| | | username: admin |
| | | password: xzx12345 |
| | | topic: tube |
| | | timeout: 100 |
| | | keepalive: 60 |
| | | enabled: true |
| | | stealelec: |
| | | url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil |
| | | datasource: |
| | | driver-class-name: org.postgresql.Driver |
| | | # url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified |
| | | # username: postgres |
| | | # password: Yykj.2021 |
| | | url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified |
| | | username: postgres |
| | | password: postgres |
| | | mybatis: |
| | | type-aliases-package: com.ard.alarm.camera.domain.ArdCameras |
| | | mapper-locations: classpath:/mapper/*.xml |
| | | # minioé
ç½® |
| | | minio: |
| | | endpoint: http://192.168.1.15:9001 |
| | | accessKey: admin |
| | | secretKey: xzx12345 |
| | | logging: |
| | | level: |
| | | com.ard: info |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <configuration> |
| | | <!--æ¥å¿åæ¾è·¯å¾--> |
| | | <property name="log.path" value="./logs"/> |
| | | <!--æ¥å¿è¾åºæ ¼å¼--> |
| | | <property name="log.pattern" value="%d{HH:mm:ss.SSS}[%thread]%-5level%logger{20}-[%method,%line]-%msg%n"/> |
| | | <!--æ§å¶å°è¾åº--> |
| | | <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | </appender> |
| | | <!--ç³»ç»æ¥å¿è¾åº--> |
| | | <appender name="sys-info" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/sys-info.log</file> |
| | | <!--å¾ªç¯æ¿çï¼åºäºæ¶é´å建æ¥å¿æä»¶--> |
| | | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| | | <!--æ¥å¿æä»¶åæ ¼å¼--> |
| | | <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern> |
| | | <!--æ¥å¿æå¤§çåå²60天--> |
| | | <maxHistory>60</maxHistory> |
| | | </rollingPolicy> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | <filter class="ch.qos.logback.classic.filter.LevelFilter"> |
| | | <!--è¿æ»¤ç级å«--> |
| | | <level>INFO</level> |
| | | <!--å¹é
æ¶çæä½ï¼æ¥æ¶ï¼è®°å½ï¼--> |
| | | <onMatch>ACCEPT</onMatch> |
| | | <!--ä¸å¹é
æ¶çæä½ï¼æç»ï¼ä¸è®°å½ï¼--> |
| | | <onMismatch>DENY</onMismatch> |
| | | </filter> |
| | | </appender> |
| | | <!--管线æ³é²æ¥è¦æ¥å¿è¾åº--> |
| | | <appender name="tube" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/tube.log</file> |
| | | <!--å¾ªç¯æ¿çï¼åºäºæ¶é´å建æ¥å¿æä»¶--> |
| | | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| | | <!--æ¥å¿æä»¶åæ ¼å¼--> |
| | | <fileNamePattern>${log.path}/tube.%d{yyyy-MM-dd}.log</fileNamePattern> |
| | | <!--æ¥å¿æå¤§çåå²60天--> |
| | | <maxHistory>60</maxHistory> |
| | | </rollingPolicy> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | <filter class="ch.qos.logback.classic.filter.LevelFilter"> |
| | | <!--è¿æ»¤ç级å«--> |
| | | <level>INFO</level> |
| | | <!--å¹é
æ¶çæä½ï¼æ¥æ¶ï¼è®°å½ï¼--> |
| | | <onMatch>ACCEPT</onMatch> |
| | | <!--ä¸å¹é
æ¶çæä½ï¼æç»ï¼ä¸è®°å½ï¼--> |
| | | <onMismatch>DENY</onMismatch> |
| | | </filter> |
| | | </appender> |
| | | <root level="DEBUG"> |
| | | <appender-ref ref="console"/> |
| | | </root> |
| | | <!--ç³»ç»æä½æ¥å¿--> |
| | | <root level="INFO"> |
| | | <appender-ref ref="sys-info"/> |
| | | </root> |
| | | <!--管线æ³é²æ¥è¦æä½æ¥å¿--> |
| | | <root level="INFO"> |
| | | <appender-ref ref="tube"/> |
| | | </root> |
| | | </configuration> |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ard.alarm.camera.mapper.ArdCamerasMapper"> |
| | | |
| | | <resultMap type="com.ard.alarm.camera.domain.ArdCameras" id="ArdCamerasResult"> |
| | | <result property="id" column="id"/> |
| | | <result property="name" column="name"/> |
| | | <result property="ip" column="ip"/> |
| | | <result property="port" column="port"/> |
| | | <result property="rtspPort" column="rtsp_port"/> |
| | | <result property="username" column="username"/> |
| | | <result property="password" column="password"/> |
| | | <result property="gdtype" column="gdtype"/> |
| | | <result property="channel" column="channel"/> |
| | | <result property="longitude" column="longitude"/> |
| | | <result property="latitude" column="latitude"/> |
| | | <result property="altitude" column="altitude"/> |
| | | <result property="userId" column="user_id"/> |
| | | <result property="deptId" column="dept_id"/> |
| | | <result property="camHeading" column="cam_heading"/> |
| | | <result property="camPitch" column="cam_pitch"/> |
| | | <result property="camRoll" column="cam_roll"/> |
| | | <result property="camNear" column="cam_near"/> |
| | | <result property="camFar" column="cam_far"/> |
| | | <result property="camAspectratio" column="cam_aspectratio"/> |
| | | <result property="camDepth" column="cam_depth"/> |
| | | <result property="camFov" column="cam_fov"/> |
| | | <result property="loginId" column="login_id"/> |
| | | <result property="operatorId" column="operator_id"/> |
| | | <result property="operatorExpired" column="operator_expired"/> |
| | | <result property="camMaxVisibleDistance" column="cam_max_visible_distance"/> |
| | | <result property="camAlarmGuideEnable" column="cam_alarm_guide_enable"/> |
| | | </resultMap> |
| | | |
| | | <sql id="selectArdCamerasVo"> |
| | | select c.id, |
| | | c.name, |
| | | c.ip, |
| | | c.port, |
| | | c.rtsp_port, |
| | | c.username, |
| | | c.password, |
| | | c.gdtype, |
| | | c.channel, |
| | | c.longitude, |
| | | c.latitude, |
| | | c.altitude, |
| | | c.user_id, |
| | | c.dept_id, |
| | | c.cam_heading, |
| | | c.cam_pitch, |
| | | c.cam_roll, |
| | | c.cam_near, |
| | | c.cam_far, |
| | | c.cam_aspectratio, |
| | | c.cam_depth, |
| | | c.cam_fov, |
| | | c.operator_id, |
| | | c.operator_expired, |
| | | c.cam_max_visible_distance, |
| | | c.cam_alarm_guide_enable |
| | | from ard_cameras c |
| | | </sql> |
| | | |
| | | <select id="selectArdCamerasList" parameterType="com.ard.alarm.camera.domain.ArdCameras" resultMap="ArdCamerasResult"> |
| | | <include refid="selectArdCamerasVo"/> |
| | | <where> |
| | | <if test="id != null and id != ''">and c.id = #{id}</if> |
| | | <if test="name != null and name != ''">and c.name like '%'||#{name}||'%'</if> |
| | | <if test="ip != null and ip != ''">and c.ip = #{ip}</if> |
| | | <if test="port != null ">and c.port = #{port}</if> |
| | | <if test="rtspPort != null ">and c.rtsp_port = #{rtspPort}</if> |
| | | <if test="username != null and username != ''">and c.username like '%'||#{username}||'%'</if> |
| | | <if test="password != null and password != ''">and c.password = #{password}</if> |
| | | <if test="gdtype != null and gdtype != ''">and c.gdtype = #{gdtype}</if> |
| | | <if test="channel != null ">and c.channel = #{channel}</if> |
| | | <if test="longitude != null ">and c.longitude = #{longitude}</if> |
| | | <if test="latitude != null ">and c.latitude = #{latitude}</if> |
| | | <if test="altitude != null ">and c.altitude = #{altitude}</if> |
| | | <if test="userId != null and userId != ''">and c.user_id = #{userId}</if> |
| | | <if test="deptId != null ">and (c.dept_id = #{deptId} OR c.dept_id IN ( SELECT t.dept_id FROM sys_dept t |
| | | WHERE cast(#{deptId} as varchar) = any(string_to_array(ancestors,',')) )) |
| | | </if> |
| | | <if test="camHeading != null ">and c.cam_heading = #{camHeading}</if> |
| | | <if test="camPitch != null ">and c.cam_pitch = #{camPitch}</if> |
| | | <if test="camRoll != null ">and c.cam_roll = #{camRoll}</if> |
| | | <if test="camNear != null ">and c.cam_near = #{camNear}</if> |
| | | <if test="camFar != null ">and c.cam_far = #{camFar}</if> |
| | | <if test="camAspectratio != null ">and c.cam_aspectratio = #{camAspectratio}</if> |
| | | <if test="camDepth != null ">and c.cam_depth = #{camDepth}</if> |
| | | <if test="camFov != null ">and c.cam_fov = #{camFov}</if> |
| | | <if test="camMaxVisibleDistance != null ">and c.cam_max_visible_distance = #{camMaxVisibleDistance}</if> |
| | | <if test="camAlarmGuideEnable != null ">and c.cam_alarm_guide_enable = #{camAlarmGuideEnable}</if> |
| | | <if test="loginId != null ">and c.login_id = #{loginId}</if> |
| | | </where> |
| | | </select> |
| | | |
| | | <select id="selectArdCamerasById" parameterType="String" resultMap="ArdCamerasResult"> |
| | | <include refid="selectArdCamerasVo"/> |
| | | where id = #{id} |
| | | </select> |
| | | |
| | | </mapper> |