SubscribeHandle.java 5.51 KB
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<Subscribe> 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<String> httpEntity = new HttpEntity<>(JSONUtils.toJsonString(subscribeRequestObject),
                buildHttpHeaders(deviceId));
        if (log.isDebugEnabled()) {
            log.debug("上传人脸消息体:{}", JSONUtils.toJsonString(subscribeRequestObject));
        }
        // 请求执行
        ResponseEntity<String> 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<Subscribe> subscribeList = new ArrayList<>();

        Subscribe subscribe = new Subscribe();
        subscribe.setSubscribeId(subscribeIdObj.toString());
        subscribe.setOperateType(1);
        subscribeList.add(subscribe);
        subscribeListObject.setSubscribeObject(subscribeList);

        HttpEntity<String> httpEntity = new HttpEntity<>(JSONUtils.toJsonString(subscribeRequestObject),
                buildHttpHeaders(deviceId));
        ResponseEntity<String> 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;
    }
}