大华ICC事件订阅与监听
概要
整体环境:
(兼容性很强,不一定必须用我这里的版本 )
整理截止日期:2023-08-17
前端:unity2021.3.6f1c1 + C# + Rider2023.1.1
大华ICC:v5.0.0.12 (我这里的现场环境是V5.0.0.3没有啥不兼容的地方)
组成:
- 第三方服务端应用(监听用) 以下简称第三方
- ICC鉴权中心(订阅用) ICC平台提供
- ICC事件中心 (向监听地址推送订阅结果) ICC平台提供
第三方就是我们自己开发的监听端,这里使用的是unity+C#,并未使用大华提供 SDK (没必要,能直接网络通讯),ICC鉴权中心与ICC事件中心都是ICC部署时提供的,相应的还要提供:ICC后台ip+端口,登录账号、密码,OpenAPI的账户[client_id]与秘钥[client_secret]
监听大华推送的事件本质就是:向ICC服务器发送一个能接受消息的端口
这里提供官方文档链接1:https://open-icc.dahuatech.com/#/home
整体架构流程
-
第三方通过鉴权中心完成登录,推荐 ICC开放平台-API文档-鉴权中心-用户密码模式 方式登录
步骤顺序 URL 注 获取公钥 /evo-apigw/evo-oauth/1.0.0/oauth/public-key 返回体保留:publicKey 认证 /evo-apigw/evo-oauth/1.0.0/oauth/extend/token 密码需要通过RSA与publicKey加密后发送 刷新认证信息 /evo-apigw/evo-oauth/1.0.0/oauth/extend/refresh/token token保活,刷新access_token 关于token保活:官方文档里有说可以直接定时调用 认证接口2 ,本质都一样,保证access_token不过期就可以
-
向ICC平台提供订阅地址
调用事件订阅 [/evo-apigw/evo-event/1.0.0/subscribe/mqinfo] 接口订阅消息
订阅结构如下://json post /evo-apigw/evo-event/1.0.0/subscribe/mqinfo { "param": { "monitors": [ { "monitor": "监听地址:端口", "monitorType": "url", "events": [ { //订阅内容类型 "category": "alarm", "subscribeAll": 1, "domainSubscribe": 2, //订阅内容↓ "authorities": [ { "types": [ "57", "51", "61" ] } ] } ] } ], "subsystem": { "subsystemType": 0,//固定值:0 "name": "监听地址_端口", "magic": "监听地址_端口" } } }
详细订阅权限设置见官方文档:APi文档-事件中心-事件订阅引导
-
保证第三方开放的监听端口能通
添加防火墙入站规则,我这里用的是TCP端口,这里提供第三方为Windows的两种设置方式:
第一种:主动开放端口: 控制面板-系统和安全-windows Defender防火墙-高级设置-入站规则-新建规则
添加入站设置
第二种:调用命令接口开发端口,这里提供C#版本方式
private static void AddFireWallPort(int port) { ProcessStartInfo processStartInfo = new ProcessStartInfo("netsh", $"firewall set portopening TCP {port.ToString()} ENABLE"); processStartInfo.Verb = "runas"; processStartInfo.CreateNoWindow = false; processStartInfo.UseShellExecute = true; processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(processStartInfo).WaitForExit(); }
第三方开启端口监听3,我这里用的C#的System.Net.HttpListener:
//开启监听
public static void StartServer()
{
Debug.Log("--开启 Http监听--");
httpobj = new HttpListener();
httpobj.Prefixes.Add($"http://+:{开放端口号}/");
httpobj.Start();
httpobj.BeginGetContext(监听回调, null);
}
//关闭监听
public static void StopServer()
{
if (httpobj != null)
{
Debug.Log("关闭 Http监听");
httpobj.Stop();
httpobj = null;
}
}
httpobj.Prefixes的url配置具体可以查看.net的官链:https://learn.microsoft.com/zh-cn/dotnet/api/system.net.httplistener?view=netframework-4.0
开启监听后可以尝试发送请求到该端口,测试下端口是否正常开启
4. 对接完成,附我们现场环境的对接测试截图:
附注
- 重复订阅时,订阅请求中name字段相同的订阅,会覆盖前一个。
- 订阅时注意[]与{}的区别,端口能通,监听不到消息可以优先从订阅处排查,能登录ICC后台的开发者推荐查看对应的evo-event.txt日志并搜索监听ip,查看后台收到的订阅json是否符合要求,基本上只要本地或其他网段能向监听地址发送消息就能规避telnet通的问题。