一、平台注册/注销
1.1 注册/注销流程
注册流程1如图所示
图 1
下级平台主动向上级平台注册;注册鉴权信息(用户名和密码)由上级平台提供;
1.2 报文说明
1.2.1 下级第一次注册
POST /VIID/System/Register HTTP/1.1
Host: 192.168.1.240:10000
Accept: application/json,application/*+json
Content-Type: application/VIID+JSON;charset=UTF-8
Connection: keepalive
User-Identify:34020000001110000001
User-Agent: libghttp/1.0
Content-Length: 64
{
."RegisterObject":.{
.."DeviceID":."34020000001110000001"
.}
}
其中192.168.1.240:10000为注册平台的地址
1.2.2 上级响应未认证
HTTP/1.1 401 Unauthorized
Content-Type: application/json
WWW-Authenticate: Digest realm="firberhome", nonce="8qx43l7i"
1.2.3 下级第二次注册
POST /VIID/System/Register HTTP/1.1
Host: 192.168.1.240:10008
Accept: application/json,application/*+json
Content-Type: application/*+JSON;charset=UTF-8
Connection: keepalive
User-Identify:34020000001110000001
Authorization: Digest username="dbTest", realm="firberhome", nonce="8qx43l7i", uri="/VIID/System/Register", algorithm="MD5", cnonce="wenminchen@126.com", nc=00000001, qop=auth, response="48164a9699ccec9345016d62bc27384e"
User-Agent: libghttp/1.0
Content-Length: 64
{
."RegisterObject":.{
.."DeviceID":."34020000001110000001"
.}
}
1.2.4 注册成功上级响应
HTTP/1.1 200 OK
Content-Type: application/json
{"ResponseStatus":{"Id":"34020000001110000001","LocalTime":"20200512161231","RequestURL":"/VIID/System/Register","StatusCode":0,"StatusString":"OK"}}
以上为完整的注册流程,注销流程类似
二、Keepalived保活
2.1保活流程
下级向上级上报心跳数据
2.2 报文说明
2.2.1 下级上报保活
POST /VIID/System/Keepalive HTTP/1.1
Host: 192.168.1.240:10000
Accept: application/json,application/*+json
Content-Type: application/VIID+JSON;charset=UTF-8
Connection: keepalive
User-Identify:34020000001110000001
User-Agent: libghttp/1.0
Content-Length: 65
{
."KeepaliveObject":.{
.."DeviceID":."34020000001110000001"
.}
}
4.2.2 上级反馈响应
HTTP/1.1 200 OK
Content-Type: application/json
{"ResponseStatus":{"Id":"34020000001110000001","LocalTime":"20200512161231","RequestURL":"/VIID/System/Keepalive","StatusCode":0,"StatusString":"OK"}}
订阅-通知
上下级概念
订阅通知过程本质是数据转移,例如A想通过视图库获得B的机动车数据,那么A就是上级、B就是下级;假如A想通过B间接获得C的机动车数据,那么A就是B的上级,B是C的上级,这个过程为跨级订阅/通知。
tep1:订阅者(上级)向被订阅者(下级)发送HTTP POST请求/VIID/Subscribes。
Step2:被订阅者(下级)将订阅成功与否的响应消息返回给订阅者(上级)。
订阅成功后,被订阅者(下级)如果有订阅信息,便会进行通知任务。
Step3:被订阅者(下级)向订阅者(上级)发送HTTP POST请求/VIID/SubscribeNotifications。
Step4:订阅者(上级)返回响应消息。
Step5:被订阅者(下级)接收到Step4订阅者(上级)正确返回结果才会再重复Step3,4的操作,如此循环。
@AuthorizationInterceptor.UnAuthRequest
@RequestMapping("/subscribes")
public Result subscribe(
// @RequestBody SubscribeReq subscribeReq
) {
log.info("订阅接口---------->");
// 订阅统一标识码 = 公安机关机构代码 + 子类型编码(03-订阅)+ 时间编码(YYYYMMDDhhmmss) + 流水序号(00001)
String time = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());
//123456789012
String subscribeID = "360302000000" + "03" + time + "00001";
String title = "订阅车牌识别消息";
String subscribeDetail = "13"; // 订阅类别:视频卡口目录 7--视频卡口目录 12-人脸信息 13-车辆信息
Integer ResourceClass=4;
String resourceURI ="360xxxxxxx"; // 订阅资源路径 这个参数很重要 对方提供
String applicantName = "xxxxx"; // 申请人
String applicantOrg = "xxxxxx公司"; // 申请单位
String beginTime ="20210326150000"; //DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
String endTime ="20210331230000"; //DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now().plusMinutes(5l));
String receiveAddr = "http://36.36.1.70:1314/VIID/SubscribeNotifications";
String ResultImageDeclare="01";
String ResultFeatureDeclare="-1";
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("36030220195032160250");
subscribe.setApplicantName(applicantName);
subscribe.setApplicantOrg(applicantOrg);
subscribe.setBeginTime(beginTime);
subscribe.setEndTime(endTime);
subscribe.setReceiveAddr(receiveAddr);
subscribe.setOperateType(operateType);
subscribeList.add(subscribe);
subscribeListObject.setSubscribeObject(subscribeList);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/json;charset=utf-8"));
headers.set("User-Identify","36030220195032160999");
HttpEntity<String> httpEntity = new HttpEntity<>(JSONUtil.toJsonStr(subscribeRequestObject), headers);
// log.info("消息体:{}", JSONUtil.toJsonStr(subscribeRequestObject));
// 请求执行
ResponseEntity<String> responseEntity = restTemplate.exchange(subscribeUrl, HttpMethod.POST, httpEntity, String.class);
log.info("头部消息"+responseEntity.getHeaders());
if (org.apache.http.HttpStatus.SC_OK == responseEntity.getStatusCode().value()) {
log.info("响应体"+responseEntity.getBody());
log.info(Result.success()+"订阅成功");
return Result.success();
}
log.info(responseEntity.getBody());
log.info(Result.failed()+"订阅失败");
return Result.failed("订阅失败");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)