结果放在最前面:
https://github.com/En1s0o/hik8200-cas
最近海康 PVIA 将升级到海康 IOT,在此分享 PVIA 的封装
直达电梯 https://www.jianshu.com/p/0e76390b6bd1
背景
海康 8200 部分功能只能在页面上操作(例如:添加设备),而 SDK 并没有提供相关 API,这对后端代码而言是相当不便的。这个项目正是为解决这个问题而生。
项目使用到的开源库
- Jackson
- Guava
- OkHTTP3
- Retrofit2
- BouncyCastle
- Jsoup
提供的接口
public Object flatRequest(CasFlatRequest flatRequest) throws Exception;
- CasFlatRequest.java
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CasFlatRequest {
@JsonProperty(value = "method", required = true)
private String method;
@JsonProperty(value = "url", required = true)
private String url;
@JsonProperty("values")
private Map<String, String> values;
}
内部流程
调用 flatRequest
发起一次请求:
1、没有登录,或者会话过期
(a) 海康 8200 会要求重定向到登录页面
经过本人测试,海康 8200 的 POST 在首次登录总是失败的。因此如果原始请求为非 GET 请求,本 SDK 会拦截返回的数据,并修改重定向的地址到一个返回数据较少的 GET 请求(/vms/deviceInfo!getTypeData.action)。只有该 GET 接口成功返回(说明登录成功),才会再次发出原始的请求,得到正确的数据。
当然了,如果原始请求就是 GET 请求,这里则不会修改重定向的地址,也不会多发最后那次请求。
(b) 解析 html 页面,得到登录表单,并附加一些登录相关的信息,例如:用户名、加密后的密码等等
(c) 发出登录请求
(d) 一系列重定向
如果原始请求非 GET 请求(例如:POST),这里会再次发出原始请求,因为登录成功的重定向地址已经改为一个返回数据较少的 GET 请求,而非原始请求。
2、已经登录,且会话有效(只要海康 8200 不要求重定向到登录页面)
(a) 发起请求,返回结果
例如,显示添加设备的窗口编号的网络交互过程:
https://github.com/En1s0o/hik8200-cas/blob/master/showAddDeviceWindowN.action.log