记得上下班打卡 | git大法好,push需谨慎

Commit a97e0c67 authored by jiangxiulong's avatar jiangxiulong

视频人流量 完善url 人体检测

parent db367dc5
package com.liquidnet.service.kylin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* <p>
* 人流量排队检测摄像头表
* </p>
*
* @author jiangxiulong
* @since 2022-01-11
*/
@Data
@ApiModel
public class KylinCameraDevicesVo implements Serializable {
/*@ApiModelProperty(value = "camera_id")
private String cameraId;
@ApiModelProperty(value = "设备用户名/国标ID")
private String streamName;
@ApiModelProperty(value = "场地ID")
private String fieldId;
@ApiModelProperty(value = "截图url")
private String imgUrl;
@ApiModelProperty(value = "地点类型 1卫生间 2。。。")
private Integer siteType;
@ApiModelProperty(value = "创建时间")
private String createdAt;
@ApiModelProperty(value = "修改时间")
private String updatedAt;*/
@ApiModelProperty(value = "设备描述 暂时用来村特殊参数json")
private String Description;
@ApiModelProperty(value = "国标ID")
private String GbId;
@ApiModelProperty(value = "设备状态 取值:on(在线),off(离线),failed(锁定),new(未注册)")
private String status;
}
......@@ -2,11 +2,12 @@ package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 人流量排队检测摄像头表
......@@ -17,7 +18,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinCamera implements Serializable {
public class KylinCamera implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
......@@ -30,28 +31,41 @@ public class KylinCamera implements Serializable {
private String cameraId;
/**
* 设备用户名/国标ID
* 国标ID
*/
private String streamName;
private String gbId;
/**
* 场地ID
* 截图url
*/
private String fieldId;
private String imgUrl;
/**
* 截图url
* 场地ID
*/
private String imgUrl;
private String fieldId;
/**
* 地点类型 1卫生间 2。。。
*/
private Integer siteType;
/**
* 设备状态 取值:on(在线),off(离线),failed(锁定),new(未注册)
*/
private String status;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private static final KylinCamera obj = new KylinCamera();
public static KylinCamera getNew() {
try {
return (KylinCamera) obj.clone();
} catch (CloneNotSupportedException e) {
return new KylinCamera();
}
}
}
drop TABLE if exists `kylin_camera`;
CREATE TABLE `kylin_camera`
(
`mid` int unsigned NOT NULL AUTO_INCREMENT,
`camera_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'camera_id',
`stream_name` varchar(255) NOT NULL DEFAULT '' COMMENT '设备用户名/国标ID',
`field_id` varchar(64) NOT NULL DEFAULT '' COMMENT '场地ID',
`img_url` varchar(500) NOT NULL DEFAULT '' COMMENT '截图url',
`site_type` tinyint NOT NULL DEFAULT 0 COMMENT '地点类型 1卫生间 2。。。',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`mid` int unsigned NOT NULL AUTO_INCREMENT,
`camera_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'camera_id',
`gb_id` varchar(255) NOT NULL DEFAULT '' COMMENT '国标ID',
`img_url` varchar(500) NOT NULL DEFAULT '' COMMENT '截图url',
`field_id` varchar(64) NOT NULL DEFAULT '' COMMENT '场地ID',
`site_type` tinyint NOT NULL DEFAULT 0 COMMENT '地点类型 1卫生间 2。。。',
`status` varchar(64) NOT NULL DEFAULT '' COMMENT '设备状态 取值:on(在线),off(离线),failed(锁定),new(未注册)',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
KEY `idx_camera_id` (`camera_id`),
PRIMARY KEY (`mid`)
) ENGINE = InnoDB
......@@ -22,8 +23,8 @@ CREATE TABLE `kylin_camera_record`
`camera_record_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'camera_record_id',
`camera_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'camera_id',
`person_num` int NOT NULL DEFAULT 0 COMMENT '检测到的人数',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
KEY `idx_camera_record_id` (`camera_record_id`),
PRIMARY KEY (`mid`)
) ENGINE = InnoDB
......
......@@ -71,6 +71,26 @@
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dypnsapi</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.0.7</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>openplatform20191219</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>oss-client</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-facebody</artifactId>
<version>1.2.27</version>
</dependency>
<dependency>
......
package com.liquidnet.service.platform.controller.kylin;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 人流量排队检测摄像头表 前端控制器
* </p>
*
* @author jiangxiulong
* @since 2022-01-10
*/
@Api(tags = "截图回调")
@Slf4j
@RestController
@RequestMapping("/camera")
public class KylinCameraCallBackController {
@PostMapping(value = "create", produces = "application/xml;charset=UTF-8")
@ApiOperation("截图回调")
public String record(
@RequestBody String requestBody,
@RequestParam(value = "siteType") Integer siteType,
@RequestParam(value = "fieldId") String fieldId
) {
try {
log.info("接收截图回调请求:[siteType=[{}], fieldId=[{}], requestBody=[{}]",
siteType, fieldId, requestBody);
// TODO: 2022/1/10 jxltodo 验签
return "success";
} catch (Exception e) {
log.error("截图回调Exception:[msg={}, e={}]", e.getMessage(), e);
return "error";
}
}
}
package com.liquidnet.service.platform.controller.kylin;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.facebody.model.v20191230.DetectPedestrianRequest;
import com.aliyuncs.facebody.model.v20191230.DetectPedestrianResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.kylin.dto.vo.KylinCameraDevicesVo;
import com.liquidnet.service.kylin.entity.KylinCamera;
import com.liquidnet.service.kylin.mapper.KylinCameraMapper;
import com.liquidnet.service.platform.utils.ViapiFileUtilAdvance;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 人流量排队检测摄像头表 前端控制器
* </p>
*
* @author jiangxiulong
* @since 2022-01-10
*/
@Api(tags = "视频计算")
@Slf4j
@RestController
@RequestMapping("/camera")
public class KylinCameraController {
@Autowired
private KylinCameraMapper cameraMapper;
@PostMapping(value = "callBack", produces = "application/xml;charset=UTF-8")
@ApiOperation("截图回调")
public String callBack(
@RequestBody String requestBody,
@RequestParam(value = "siteType") Integer siteType,
@RequestParam(value = "fieldId") String fieldId
) {
try {
log.info("接收截图回调请求:[siteType=[{}], fieldId=[{}], requestBody=[{}]",
siteType, fieldId, requestBody);
// TODO: 2022/1/10 jxltodo 验签
return "success";
} catch (Exception e) {
log.error("截图回调Exception:[msg={}, e={}]", e.getMessage(), e);
return "error";
}
}
@GetMapping(value = "describeDevices")
@ApiOperation("获取设备列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "Integer", name = "pageNum", value = "页码"),
@ApiImplicitParam(type = "query", dataType = "Integer", name = "pageSize", value = "数量")
})
public String describeDevices(
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize
) {
// TODO: 2022/1/10 jxltodo 改成配置
DefaultProfile profile = DefaultProfile.getProfile(
"cn-beijing",
"LTAI5t5kniDKEadiKHWiCM9Q",
"hIZPi0AluvrgBE5xg5Pa9fBvvAqnbw"
);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("vs.cn-beijing.aliyuncs.com");
request.setSysVersion("2018-12-12");
request.setSysAction("DescribeDevices");
request.putQueryParameter("GroupId", "410751715516867255-cn-beijing");
request.putQueryParameter("PageNum", String.valueOf(pageNum));
request.putQueryParameter("PageSize", String.valueOf(pageSize));
try {
CommonResponse response = client.getCommonResponse(request);
JsonNode devices = JsonUtils.fromJson(response.getData(), JsonNode.class).get("Devices");
ObjectMapper configure = JsonUtils.OM().configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
List<KylinCameraDevicesVo> kylinCameraDevicesVos = configure.readValue(JsonUtils.toJson(devices), new TypeReference<List<KylinCameraDevicesVo>>() {
});
for (KylinCameraDevicesVo devicesVo : kylinCameraDevicesVos) {
String gbId = devicesVo.getGbId();
KylinCamera kylinCamera = cameraMapper.selectOne(
Wrappers.lambdaQuery(KylinCamera.class)
.eq(KylinCamera::getGbId, gbId)
);
KylinCamera camera = KylinCamera.getNew();
camera.setStatus(devicesVo.getStatus());
JsonNode jsonNode = JsonUtils.fromJson(devicesVo.getDescription(), JsonNode.class);
int siteType = jsonNode.get("siteType").asInt();
String fieldId = jsonNode.get("fieldId").asText();
camera.setSiteType(siteType);
camera.setFieldId(fieldId);
if (null == kylinCamera) {
camera.setCameraId(IDGenerator.nextSnowId());
camera.setGbId(gbId);
camera.setImgUrl("https://camera.zhengzai.tv/camera/live/".concat(gbId).concat(".jpg"));
cameraMapper.insert(camera);
} else {
camera.setUpdatedAt(LocalDateTime.now());
cameraMapper.update(
camera,
Wrappers.lambdaUpdate(KylinCamera.class).eq(KylinCamera::getGbId, gbId)
);
}
}
return "success";
} catch (ClientException | JsonProcessingException e) {
log.error("获取设备列表Exception:[msg={}, e={}]", e.getMessage(), e);
return "error";
}
}
@GetMapping(value = "detectPedestrian")
@ApiOperation("DetectPedestrian")
public String detectPedestrian() {
String accessKey = "LTAI4FxrURzMvvu9reFgwY5o"; //您的AccessKeyID
String accessKeySecret = "Ym5tfAxOf2zX20MgjikLI3Wz3tlwVV"; //您的AccessKeySecret
String regionId = "cn-beijing";
//String file = "/home/admin/file/1.jpg"; //或者本地上传
String file = "https://camera.zhengzai.tv/camera/live/20220101202301070001.jpg";
try {
InputStream inputStream = ViapiFileUtilAdvance.buildInputStream(file);
ViapiFileUtilAdvance fileUtils = ViapiFileUtilAdvance.getInstance(accessKey, accessKeySecret, regionId);
String ossTempFileUrl = fileUtils.upload(inputStream);
System.out.println(ossTempFileUrl);
DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "LTAI4FxrURzMvvu9reFgwY5o", "Ym5tfAxOf2zX20MgjikLI3Wz3tlwVV");
IAcsClient client = new DefaultAcsClient(profile);
DetectPedestrianRequest request = new DetectPedestrianRequest();
request.setImageURL(ossTempFileUrl);
DetectPedestrianResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
return "success";
} catch (Exception e) {
log.error("获取设备列表Exception:[msg={}, e={}]", e.getMessage(), e);
return "error";
}
}
}
package com.liquidnet.service.platform.utils;
import com.aliyun.fileform.models.FileField;
import com.aliyun.openplatform20191219.models.AuthorizeFileUploadRequest;
import com.aliyun.openplatform20191219.models.AuthorizeFileUploadResponse;
import com.aliyun.oss.models.PostObjectRequest;
import com.aliyun.tea.TeaConverter;
import com.aliyun.tea.TeaPair;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.facebody.model.v20191230.DetectPedestrianRequest;
import com.aliyuncs.facebody.model.v20191230.DetectPedestrianResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ViapiFileUtilAdvance {
public static void main(String[] args) throws Exception {
String accessKey = "LTAI4FxrURzMvvu9reFgwY5o"; //您的AccessKeyID
String accessKeySecret = "Ym5tfAxOf2zX20MgjikLI3Wz3tlwVV"; //您的AccessKeySecret
String regionId = "cn-beijing";
//String file = "/home/admin/file/1.jpg"; //或者本地上传
String file = "https://camera.zhengzai.tv/camera/live/20220101202301070001.jpg";
try (InputStream inputStream = buildInputStream(file)) {
ViapiFileUtilAdvance fileUtils = ViapiFileUtilAdvance.getInstance(accessKey, accessKeySecret, regionId);
String ossTempFileUrl = fileUtils.upload(inputStream);
System.out.println(ossTempFileUrl);
DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "LTAI4FxrURzMvvu9reFgwY5o", "Ym5tfAxOf2zX20MgjikLI3Wz3tlwVV");
/** use STS Token
DefaultProfile profile = DefaultProfile.getProfile(
"<your-region-id>", // The region ID
"<your-access-key-id>", // The AccessKey ID of the RAM account
"<your-access-key-secret>", // The AccessKey Secret of the RAM account
"<your-sts-token>"); // STS Token
**/
IAcsClient client = new DefaultAcsClient(profile);
DetectPedestrianRequest request = new DetectPedestrianRequest();
request.setImageURL(ossTempFileUrl);
DetectPedestrianResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
}
}
public static InputStream buildInputStream(String filePath) throws IOException {
if (StringUtils.startsWithAny(filePath, new CharSequence[]{"http://", "https://"})) {
filePath = URLDecoder.decode(filePath, "UTF-8");
URL url = new URL(filePath);
URLConnection urlConnection = url.openConnection();
return urlConnection.getInputStream();
} else {
File key1 = new File(filePath);
return new FileInputStream(key1);
}
}
public static synchronized ViapiFileUtilAdvance getInstance(String accessKeyId, String accessKeySecret, String regionId) throws Exception {
String mapKey = String.format("%s:%s:%s", regionId, accessKeyId, accessKeySecret);
ViapiFileUtilAdvance fileUtils = _map.get(mapKey);
if (fileUtils == null) {
_map.putIfAbsent(mapKey, new ViapiFileUtilAdvance(accessKeyId, accessKeySecret, regionId));
fileUtils = _map.get(mapKey);
}
return fileUtils;
}
private ViapiFileUtilAdvance(String accessKeyId, String accessKeySecret, String regionId) throws Exception {
Map<String, Object> cm = new HashMap<>();
cm.put("regionId", regionId);
cm.put("autoretry", "true");
cm.put("accessKeyId", accessKeyId);
cm.put("accessKeySecret", accessKeySecret);
cm.put("connectTimeout", 15 * 1000);
cm.put("readTimeout", 30 * 1000);
cm.put("maxIdleConns", 200);
cm.put("type", "access_key");
cm.put("endpoint", "openplatform.aliyuncs.com");
_runtime = RuntimeOptions.build(cm);
com.aliyun.tearpc.models.Config authConfig = com.aliyun.tearpc.models.Config.build(cm);
_authClient = new com.aliyun.openplatform20191219.Client(authConfig);
//ossEndpointType = "internal";//aliyun-vpc
_ossConfig = com.aliyun.oss.models.Config.build(TeaConverter.buildMap(
new TeaPair("accessKeySecret", accessKeySecret),
new TeaPair("type", "access_key"),
new TeaPair("protocol", _authClient._protocol),
new TeaPair("regionId", _authClient._regionId)
));
}
public String upload(InputStream inputStream) throws Exception {
AuthorizeFileUploadRequest authRequest = AuthorizeFileUploadRequest.build(TeaConverter.buildMap(
new TeaPair("product", "imageseg"),
new TeaPair("regionId", _authClient._regionId)
));
AuthorizeFileUploadResponse authResponse = _authClient.authorizeFileUploadWithOptions(authRequest, _runtime);
com.aliyun.oss.models.Config ossConfig = new com.aliyun.oss.models.Config();
com.aliyun.openapiutil.Client.convert(_ossConfig, ossConfig);
ossConfig.accessKeyId = authResponse.accessKeyId;
ossConfig.endpoint = com.aliyun.openapiutil.Client.getEndpoint(authResponse.endpoint, authResponse.useAccelerate, ossEndpointType);
com.aliyun.oss.Client ossClient = new com.aliyun.oss.Client(ossConfig);
FileField fileObj = FileField.build(TeaConverter.buildMap(
new TeaPair("filename", authResponse.objectKey),
new TeaPair("content", inputStream),
new TeaPair("contentType", "")
));
PostObjectRequest.PostObjectRequestHeader ossHeader = PostObjectRequest.PostObjectRequestHeader.build(TeaConverter.buildMap(
new TeaPair("accessKeyId", authResponse.accessKeyId),
new TeaPair("policy", authResponse.encodedPolicy),
new TeaPair("signature", authResponse.signature),
new TeaPair("key", authResponse.objectKey),
new TeaPair("file", fileObj),
new TeaPair("successActionStatus", "201")
));
PostObjectRequest uploadRequest = PostObjectRequest.build(TeaConverter.buildMap(
new TeaPair("bucketName", authResponse.bucket),
new TeaPair("header", ossHeader)
));
com.aliyun.ossutil.models.RuntimeOptions ossRuntime = new com.aliyun.ossutil.models.RuntimeOptions();
com.aliyun.openapiutil.Client.convert(_runtime, ossRuntime);
ossClient.postObject(uploadRequest, ossRuntime);
String imageURL = "http://" + authResponse.bucket + "." + authResponse.endpoint + "/" + authResponse.objectKey + "";
return imageURL;
}
RuntimeOptions _runtime;
com.aliyun.openplatform20191219.Client _authClient;
com.aliyun.oss.models.Config _ossConfig;
String ossEndpointType = null;
static Map<String, ViapiFileUtilAdvance> _map = new ConcurrentHashMap<>();
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment