package com.objecteye.handle.viid; import com.objecteye.config.Gat1400Properties; import com.objecteye.content.VIIDApi; import com.objecteye.content.ViidCollectorRedisKey; import com.objecteye.pojo.viid.subscribe.Subscribe; import com.objecteye.pojo.viid.subscribe.SubscribeRequestObject; import com.objecteye.utils.JSONUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; /** * @author: liuhaoyu * @date: 2023/7/5 */ @Slf4j @Component @RequiredArgsConstructor public class SubscribeHandle { private final StringRedisTemplate stringRedisTemplate; private final Gat1400Properties gat1400Properties; private final RestTemplate restTemplate; @Value("${receiver}") private String receiver; public boolean subscribe(String deviceId) { // 订阅统一标识码 = 公安机关机构代码 + 子类型编码(03-订阅)+ 时间编码(YYYYMMDDhhmmss) + 流水序号(00001) String time = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now()); String toSecond = time.substring(0, 14); String toMill = time.substring(14); String subscribeId = "123456789012" + "03" + toSecond + StringUtils.leftPad(toMill, 5, "0"); String title = "订阅人脸识别、车牌识别消息"; // 订阅类别: 12-人脸信息 13-车辆信息 String subscribeDetail = "12,13"; String beginTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); String endTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now().plusMinutes(10L)); Integer operateType = 0; SubscribeRequestObject subscribeRequestObject = new SubscribeRequestObject(); SubscribeRequestObject.SubscribeListObject subscribeListObject = new SubscribeRequestObject.SubscribeListObject(); subscribeRequestObject.setSubscribeListObject(subscribeListObject); List subscribeList = new ArrayList<>(); Subscribe subscribe = new Subscribe(); subscribe.setSubscribeId(subscribeId); subscribe.setTitle(title); subscribe.setSubscribeDetail(subscribeDetail); subscribe.setResourceUri(deviceId); subscribe.setBeginTime(beginTime); subscribe.setEndTime(endTime); subscribe.setReceiveAddr(receiver); subscribe.setOperateType(operateType); subscribeList.add(subscribe); subscribeListObject.setSubscribeObject(subscribeList); HttpEntity httpEntity = new HttpEntity<>(JSONUtils.toJsonString(subscribeRequestObject), buildHttpHeaders(deviceId)); if (log.isDebugEnabled()) { log.debug("上传人脸消息体:{}", JSONUtils.toJsonString(subscribeRequestObject)); } // 请求执行 ResponseEntity responseEntity = restTemplate.exchange(getUrl(VIIDApi.SUBSCRIBES), HttpMethod.POST, httpEntity, String.class); if (org.apache.http.HttpStatus.SC_OK == responseEntity.getStatusCode().value()) { stringRedisTemplate.opsForHash().put(ViidCollectorRedisKey.DEVICE_CACHE, deviceId, subscribeId); return true; } return false; } public boolean unsubscribe(String deviceId) { Object subscribeIdObj = stringRedisTemplate.opsForHash().get(ViidCollectorRedisKey.DEVICE_CACHE, deviceId); if (null == subscribeIdObj) { return false; } SubscribeRequestObject subscribeRequestObject = new SubscribeRequestObject(); SubscribeRequestObject.SubscribeListObject subscribeListObject = new SubscribeRequestObject.SubscribeListObject(); subscribeRequestObject.setSubscribeListObject(subscribeListObject); List subscribeList = new ArrayList<>(); Subscribe subscribe = new Subscribe(); subscribe.setSubscribeId(subscribeIdObj.toString()); subscribe.setOperateType(1); subscribeList.add(subscribe); subscribeListObject.setSubscribeObject(subscribeList); HttpEntity httpEntity = new HttpEntity<>(JSONUtils.toJsonString(subscribeRequestObject), buildHttpHeaders(deviceId)); ResponseEntity responseEntity = restTemplate.exchange(getUrl(VIIDApi.SUBSCRIBES), HttpMethod.POST, httpEntity, String.class); if (org.apache.http.HttpStatus.SC_OK == responseEntity.getStatusCode().value()) { stringRedisTemplate.opsForHash().delete(ViidCollectorRedisKey.DEVICE_CACHE, deviceId); return true; } return false; } private String getUrl(String uri) { return "http://" + gat1400Properties.getServerAddress() + ":" + gat1400Properties.getPort() + uri; } private HttpHeaders buildHttpHeaders(String deviceId) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json;charset=utf-8"); headers.set("User-Identify", deviceId); return headers; } }