作为上级,要支持下级的注册、保活、注销、校时的请求。
提供的url路径:
序号 |
功能 |
URI |
请求方法 |
1 |
注册 |
/VIID/System/Register |
POST |
2 |
注销 |
/VIID/System/UnRegister |
POST |
3 |
保活 |
/VIID/System/Keepalive |
POST |
4 |
校时 |
/VIID/System/Time |
GET |
application-dev.yml
server:
port: 10005
server1400:
dahua:
ip: 44.160.252.68
port: 9400
code: 35070000005031000001
username: ADMIN
password: ADMIN999
myip: 44.110.2.21
receiveAddr: http://${server1400.myip}:${server.port}
applicantName: 管理员
applicantOrg: xx公司
code: 35070000005031000155
会话管理接口 java 程序实现:
@Api(tags = GAT/1400 会话管理接口)
@RestController
@RequestMapping(/VIID/System)
@Slf4j
public class SessionController {
@Autowired
private RestTemplate restTemplate;
@Value(${server1400.username})
private String username;
@Value(${server1400.password})
private String password;
@Value(${server1400.dahua.code:})
private String dahuaCode;
String registerUrl, unRegisterUrl, keepaliveUrl, timeUrl;
public SessionController(
@Value(${server1400.dahua.ip}) String ip,
@Value(${server1400.dahua.port}) String port) {
registerUrl = http:
unRegisterUrl = http:
keepaliveUrl = http:
timeUrl = http:
}
@PostMapping(/Register)
@ApiOperation(value = 注册, httpMethod = POST)
public Result register(@RequestBody String json) {
log.warn(json={},json);
RegisterRequestObject obj = JSONObject.parseObject(json,RegisterRequestObject.class);
String deviceId = obj.getRegisterObject().getDeviceID();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(application/json; charset=UTF-8));
headers.set(User-Identify, deviceId);
headers.setConnection(keepalive);
RegisterRequestObject registerRequestObject = new RegisterRequestObject();
RegisterRequestObject.RegisterObject registerObject = new RegisterRequestObject.RegisterObject();
registerObject.setDeviceID(deviceId);
registerRequestObject.setRegisterObject(registerObject);
HttpEntity<String> httpEntity = new HttpEntity<>(JSONUtil.toJsonStr(registerRequestObject), headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(registerUrl, HttpMethod.POST, httpEntity, String.class);
int code = responseEntity.getStatusCode().value();
if (org.apache.http.HttpStatus.SC_UNAUTHORIZED == code) {
HttpHeaders responseEntityHeaders = responseEntity.getHeaders();
String authenticate = responseEntityHeaders.get(WWW-Authenticate).get(0);
String[] children = authenticate.split(,);
String realm = null, qop = null, nonce = null, opaque = null, method = POST;
for (int i = 0; i < children.length; i++) {
String item = children[i];
String[] itemEntry = item.split(=);
if (itemEntry[0].equals(Digest realm)) {
realm = itemEntry[1].replaceAll(\, );
} else if (itemEntry[0].equals(qop)) {
qop = itemEntry[1].replaceAll(\, );
} else if (itemEntry[0].equals(nonce)) {
nonce = itemEntry[1].replaceAll(\, );
}
}
String nc = 00000001;
String cnonce = DigestUtils.generateSalt2(8);
String response = DigestUtils.getResponse(username, realm, password, nonce, nc, cnonce, qop, method, registerUrl);
String authorization = DigestUtils.getAuthorization(username, realm, nonce, registerUrl, qop, nc, cnonce, response, opaque);
headers.set(Authorization, authorization);
httpEntity = new HttpEntity<>(JSONUtil.toJsonStr(registerRequestObject), headers);
responseEntity = restTemplate.exchange(registerUrl, HttpMethod.POST, httpEntity, String.class);
code = responseEntity.getStatusCode().value();
if (org.apache.http.HttpStatus.SC_OK == code) {
String body = responseEntity.getBody();
return Result.success();
}
}
return Result.failed(注册失败);
}
@AuthIgnore
@PostMapping(/Keepalive)
@ApiOperation(value = 保活, httpMethod = POST)
public Result keepalive(@RequestBody String json) {
log.warn(json={},json);
KeepaliveRequestObject obj = JSONObject.parseObject(json,KeepaliveRequestObject.class);
String deviceId = obj.getKeepaliveObject().getDeviceID();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(application/json; charset=UTF-8));
headers.set(User-Identify, deviceId);
headers.setConnection(keepalive);
KeepaliveRequestObject keepaliveRequestObject = new KeepaliveRequestObject();
KeepaliveRequestObject.KeepaliveObject keepaliveObject = new KeepaliveRequestObject.KeepaliveObject();
keepaliveObject.setDeviceID(deviceId);
keepaliveRequestObject.setKeepaliveObject(keepaliveObject);
log.warn(保活请求 url:{} ,参数:{}, keepaliveUrl, keepaliveRequestObject);
HttpEntity<KeepaliveRequestObject> httpEntity = new HttpEntity<>(keepaliveRequestObject, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(keepaliveUrl, HttpMethod.POST, httpEntity, String.class);
if (org.apache.http.HttpStatus.SC_OK == responseEntity.getStatusCode().value()) {
return Result.success();
}
return Result.failed(保活失败);
}
@AuthIgnore
@PostMapping(/UnRegister)
@ApiOperation(value = 注销, httpMethod = POST)
public Result unregister(@RequestBody String json) {
log.warn(json={},json);
UnRegisterRequestObject obj = JSONObject.parseObject(json,UnRegisterRequestObject.class);
String deviceId = obj.getUnRegisterObject().getDeviceID();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(application/json; charset=UTF-8));
headers.set(User-Identify, deviceId);
headers.setConnection(keepalive);
UnRegisterRequestObject unRegisterRequestObject = new UnRegisterRequestObject();
UnRegisterRequestObject.UnRegisterObject unRegisterObject = new UnRegisterRequestObject.UnRegisterObject();
unRegisterObject.setDeviceID(dahuaCode);
unRegisterRequestObject.setUnRegisterObject(unRegisterObject);
HttpEntity<String> httpEntity = new HttpEntity<>(JSONUtil.toJsonStr(unRegisterRequestObject), headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(unRegisterUrl, HttpMethod.POST, httpEntity, String.class);
if (org.apache.http.HttpStatus.SC_UNAUTHORIZED == responseEntity.getStatusCode().value()) {
HttpHeaders responseEntityHeaders = responseEntity.getHeaders();
String authenticate = responseEntityHeaders.get(WWW-Authenticate).get(0);
String[] children = authenticate.split(,);
String realm = null, qop = null, nonce = null, opaque = null, method = POST;
;
for (int i = 0; i < children.length; i++) {
String item = children[i];
String[] itemEntry = item.split(=);
if (itemEntry[0].equals(Digest realm)) {
realm = itemEntry[1].replaceAll(\, );
} else if (itemEntry[0].equals(qop)) {
qop = itemEntry[1].replaceAll(\, );
} else if (itemEntry[0].equals(nonce)) {
nonce = itemEntry[1].replaceAll(\, );
}
}
String nc = 00000001;
String cnonce = DigestUtils.generateSalt2(8);
String response = DigestUtils.getResponse(username, realm, password, nonce, nc, cnonce, qop, method, unRegisterUrl);
String authorization = DigestUtils.getAuthorization(username, realm, nonce, unRegisterUrl, qop, nc, cnonce, response, opaque);
headers.set(Authorization, authorization);
httpEntity = new HttpEntity<>(JSONUtil.toJsonStr(unRegisterRequestObject), headers);
responseEntity = restTemplate.exchange(unRegisterUrl, HttpMethod.POST, httpEntity, String.class);
if (org.apache.http.HttpStatus.SC_OK == responseEntity.getStatusCode().value()) {
return Result.success();
}
}
return Result.failed(注销失败);
}
@AuthIgnore
@GetMapping(/Time)
@ApiOperation(value = 校时, httpMethod = GET)
public Result time(@RequestBody String json) {
log.warn(json={},json);
UnRegisterRequestObject obj = JSONObject.parseObject(json,UnRegisterRequestObject.class);
String deviceId = obj.getUnRegisterObject().getDeviceID();
HttpHeaders headers = new HttpHeaders();
headers.set(User-Identify, deviceId);
headers.setConnection(keepalive);
HttpEntity<Object> httpEntity = new HttpEntity<>(null, headers);
ResponseEntity<SystemTimeObject> entity = restTemplate.getForEntity(timeUrl, SystemTimeObject.class, httpEntity);
SystemTimeObject.SystemTime systemTime = entity.getBody().getSystemTime();
String time = DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss).format(LocalDateTime.now());
return Result.success(time);
}
}
涉及到的实体类:
RegisterObject.java
@Data
public class RegisterRequestObject {
private RegisterObject RegisterObject;
@Data
public static class RegisterObject {
private String DeviceID;
}
}
KeepaliveRequestObject.java
@Data
public class KeepaliveRequestObject {
private KeepaliveObject KeepaliveObject;
@Data
public static class KeepaliveObject {
private String DeviceID;
}
}
UnRegisterRequestObject.java
@Data
public class UnRegisterRequestObject {
private UnRegisterObject UnRegisterObject;
@Data
public static class UnRegisterObject {
private String DeviceID;
}
}
SystemTimeObject.java
@Data
public class SystemTimeObject {
private SystemTime SystemTime;
@Data
public class SystemTime{
private String VIIDServerID;
private String TimeMode;
private String LocalTime;
private String TimeZone;
}
}
Result.java
@Data
public class Result<T> implements Serializable {
private String code;
private T data;
private String msg;
@JsonInclude(JsonInclude.Include.NON_NULL)
private Long total;
public static <T> Result<T> success() {
return success(null);
}
public static <T> Result<T> success(T data) {
ResultCode rce = ResultCode.SUCCESS;
if (data instanceof Boolean && Boolean.FALSE.equals(data)) {
rce = ResultCode.SYSTEM_EXECUTION_ERROR;
}
return result(rce, data);
}
public static <T> Result<T> failed() {
return result(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), ResultCode.SYSTEM_EXECUTION_ERROR.getMsg(), null);
}
public static <T> Result<T> failed(String msg) {
return result(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), msg, null);
}
public static <T> Result<T> status(boolean status) {
if (status) {
return success();
} else {
return failed();
}
}
public static <T> Result<T> failed(IResultCode resultCode) {
return result(resultCode.getCode(), resultCode.getMsg(), null);
}
private static <T> Result<T> result(IResultCode resultCode, T data) {
return result(resultCode.getCode(), resultCode.getMsg(), data);
}
private static <T> Result<T> result(String code, String msg, T data) {
Result<T> result = new Result<T>();
result.setCode(code);
result.setData(data);
result.setMsg(msg);
return result;
}
public static <T> Result<T> success(T data, Long total) {
Result<T> result = new Result();
result.setCode(ResultCode.SUCCESS.getCode());
result.setMsg(ResultCode.SUCCESS.getMsg());
result.setData(data);
result.setTotal(total);
return result;
}
}
IResultCode.java
public interface IResultCode {
String getCode();
String getMsg();
}
ResultCode.java
public enum ResultCode implements IResultCode, Serializable {
SUCCESS(00000,一切ok),
SYSTEM_EXECUTION_ERROR(B0001,系统执行出错);
@Override
public String getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
private String code;
private String msg;
}
SubscribeReq.java
@ApiModel
@Data
public class SubscribeReq {
@ApiModelProperty(value = 设备ID, example = 13030421191190201061, required = true)
private String deviceId;
private String type;
}
订阅与接收
@Api(tags = GAT/1400 订阅接口)
@RestController
@RequestMapping(/v1/subscribe)
@Slf4j
public class SubscribeController {
@Autowired
private RestTemplate restTemplate;
@Value(${server1400.receiveAddr:})
private String receiveAddr;
@Value(${server1400.applicantName:})
private String applicantName;
@Value(${server1400.applicantOrg:})
private String applicantOrg;
@Value(${server1400.dahua.code:})
private String dahuaCode;
@Value(${server1400.reportInterval:10})
private int reportInterval;
private int days = 300;
String subscribeUrl;
public SubscribeController(
@Value(${server1400.dahua.ip}) String ip,
@Value(${server1400.dahua.port}) String port) {
subscribeUrl = http:
}
@PostMapping
@ApiOperation(value = 订阅, httpMethod = POST)
@RequestMapping(/subByType)
public Result subByType(@RequestBody SubscribeReq subscribeReq) {
String title = ;
String receiveUrl = receiveAddr+/v1/subscribe/receiveXtml;
String subscribeDetail = subscribeReq.getType();;
String ResultImageDeclare = -1;
String ResultFeatureDeclare = -1;
switch (subscribeDetail){
case 5:
title = 订阅采集系统目录;
receiveUrl = receiveAddr+/v1/subscribe/receiveXtml;
ResultImageDeclare = -1;
ResultFeatureDeclare = -1;
break;
case 3:
title = 订阅采集设备目录;
receiveUrl = receiveAddr+/v1/subscribe/receiveSbml;
ResultImageDeclare = -1;
ResultFeatureDeclare = -1;
break;
case 12:
title = 订阅人脸识别消息;
receiveUrl = receiveAddr+/v1/subscribe/receiveFace;
ResultImageDeclare = -1;
ResultFeatureDeclare = -1;
break;
}
String time = DateTimeFormatter.ofPattern(yyyyMMddHHmmss).format(LocalDateTime.now());
Random random = new Random();
int xh = 10000+random.nextInt(1000);
String subscribeID = 350700000050 + 03 + time + xh;
String resourceURI = dahuaCode;
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().plusDays(days));
Integer operateType = 0;
SubscribeRequestObject subscribeRequestObject = new SubscribeRequestObject();
SubscribeRequestObject.SubscribeListObject subscribeListObject = new SubscribeRequestObject.SubscribeListObject();
subscribeRequestObject.setSubscribeListObject(subscribeListObject);
List<SubscribeRequestObject.Subscribe> subscribeList = new ArrayList<>();
SubscribeRequestObject.Subscribe subscribe = new SubscribeRequestObject.Subscribe();
subscribe.setSubscribeID(subscribeID);
subscribe.setTitle(title);
subscribe.setSubscribeDetail(subscribeDetail);
subscribe.setResourceURI(dahuaCode);
subscribe.setApplicantName(applicantName);
subscribe.setApplicantOrg(applicantOrg);
subscribe.setBeginTime(beginTime);
subscribe.setEndTime(endTime);
subscribe.setReceiveAddr(receiveUrl);
subscribe.setOperateType(operateType);
subscribe.setResultFeatureDeclare(ResultFeatureDeclare);
subscribe.setResultImageDeclare(ResultImageDeclare);
subscribe.setReportInterval(reportInterval);
subscribeList.add(subscribe);
subscribeListObject.setSubscribeObject(subscribeList);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(application/json;charset=utf-8));
headers.set(User-Identify, dahuaCode);
String bodyStr = JSONUtil.toJsonStr(subscribeRequestObject);
HttpEntity<String> httpEntity = new HttpEntity<>(bodyStr, headers);
try{
ResponseEntity<String> responseEntity = restTemplate.exchange(subscribeUrl, HttpMethod.POST, httpEntity, String.class);
int code = responseEntity.getStatusCode().value();
if (org.apache.http.HttpStatus.SC_OK == code) {
String body = responseEntity.getBody();
return Result.success();
}
}catch(Exception e){
log.error(有异常:{},e.getMessage());
}finally {
}
return Result.failed(订阅失败);
}
@PostMapping(/receiveFace)
public Result receiveFace(@RequestBody String json) {
log.warn(receiveFace...);
JSONObject obj1 = JSONObject.parseObject(json);
JSONObject obj2 = obj1.getJSONObject(SubscribeNotificationListObject);
JSONArray arr1 = obj2.getJSONArray(SubscribeNotificationObject);
for (int i = 0; i < arr1.size(); i++) {
JSONObject obj3 = arr1.getJSONObject(i);
JSONObject obj4 = obj3.getJSONObject(FaceObjectList);
JSONArray arr2 = obj4.getJSONArray(FaceObject);
int len = arr2.size();
for (int j = 0; j < len; j++) {
JSONObject obj5 = arr2.getJSONObject(i);
String DeviceID = obj5.getString(DeviceID);
String FaceID = obj5.getString(FaceID);
String SourceID = obj5.getString(SourceID);
String ShotTime = obj5.getString(ShotTime);
JSONObject obj6 = obj5.getJSONObject(SubImageList);
JSONArray arr3 = obj6.getJSONArray(SubImageInfoObject);
}
}
return Result.success();
}
@PostMapping(/receiveXtml)
public Result receiveXtml(@RequestBody String json) {
log.warn(receiveXtml...);
return Result.success();
}
@PostMapping(/receiveSbml)
public Result receiveSbml(@RequestBody String json) {
log.warn(receiveSbml...);
return Result.success();
}
@PostMapping
@ApiOperation(value = 取消订阅, httpMethod = POST)
@RequestMapping(/cancelSubV2)
public Result cancelSubV2(@RequestBody String json){
JSONObject obj = JSONObject.parseObject(json);
String id = obj.getString(id);
SubscribeRequestObject.Subscribe rec = new SubscribeRequestObject.Subscribe();
rec.setSubscribeID(id);
rec.setOperateType(1);
rec.setSubscribeCancelOrg(applicantOrg);
rec.setSubscribeCancelPerson(applicantName);
rec.setCancelTime(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss).format(LocalDateTime.now()));
rec.setCancelReason(取消订阅);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(application/json;charset=utf-8));
headers.set(User-Identify, dahuaCode);
Map<String,Object> map = new HashMap<>();
map.put(SubscribeObject,rec);
String bodyStr = JSON.toJSONString(map);
HttpEntity<String> httpEntity = new HttpEntity<>(bodyStr, headers);
String url = subscribeUrl+/+id;
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, String.class);
int code = responseEntity.getStatusCode().value();
if (org.apache.http.HttpStatus.SC_OK == code) {
String body = responseEntity.getBody();
return Result.success();
}
return Result.failed(取消订阅失败);
}
}