经过与大华技术支持的沟通,门禁服务程序已经开发好了,可以正常接收门禁开关事件,可以发送开门命令。基于项目实时性要求,这里使用SignalR实现门禁状态、控制命令的实时传送。

几种场景需求

根据SignalR的设计规则,Client端可以主动调用服务端Hub的多个方法,但是客户端被动接收消息的方法只能有一个

根据门禁功能需求,我们将Client分为两组:

  • doorclient:指Web客户端
  • doorserver:指门禁服务端

这样便于服务端区分Web客户端和门禁服务端这两类client。

项目中主要实现以下几个场景:

Web客户端初始加载,刷新全部门禁状态

  • A. 浏览器主动请求初始化门禁状态;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务查询门禁状态,主动发送门禁状态列表;
  • D. web服务端接收消息,并根据connectId转发给指定浏览器。
//web客户端
chat.server.sendMessageByBrowser(); // 定义AddMessage供服务器调用
chat.client.AddMessage = function (result) {
for (var i = 0; i < result.length; i++) {
try {
//前端响应门禁状态变化
} catch (error) {
}
}
}; //web服务端
/// <summary>
/// 浏览器发送消息,向doorServer请求所有门禁状态,用于初始化门禁状态
/// </summary>
/// <param name="name"></param>
public void SendMessageByBrowser()
{
var messageList = new List<DoorStateInfo>();
var dc = new DoorStateInfo {ConnectId = Context.ConnectionId};
messageList.Add(dc);
Clients.Group("doorserver").AddMessage(messageList);
} /// <summary>
/// 门禁服务发送多条开关门消息给某个浏览器,hubserver转发给浏览器
/// 浏览器id放在messagelist[0].ConnectId
/// </summary>
/// <param name="name"></param>
/// <param name="messageList"></param>
public void SendManyMessageByDoorServer(string name, List<DoorStateInfo> messageList)
{
Clients.Client(messageList[0].ConnectId).AddMessage(messageList);
} //门禁服务端
// 创建一个集线器代理对象
HubProxy = Connection.CreateHubProxy("DoorAlarmHub"); // 供服务端调用,将消息输出到消息列表框中
HubProxy.On<string, List<DoorStateInfo>>("AddMessage", (message) =>
{
var alarmMsg = new AlarmMsg
{
Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
AlarmInfo = message,
AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY
};
if (message != null && message.Count > 0)
{
//无门禁状态,为门禁查询命令
if (message[0].DoorState == EM_NET_DOOR_STATUS_TYPE.EM_NET_DOOR_STATUS_UNKNOWN)
{
alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY;
}
//有门禁状态,为门禁控制命令
else
{
alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_CONTROL;
}
m_AlarmMsgQueue.Enqueue(alarmMsg);
}
});

Web端请求打开某个门

  • A. 浏览器主动请求开门;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务发送开门命令,接收到门禁状态变化消息后,主动发送门禁状态变化信息;
  • D. web服务端接收信息,并转发到doorclient组。
//web服务端
/// <summary>
/// 浏览器端调用,请求开门
/// </summary>
public void SendOpenDoorByBrowser(/*业务参数用于标识门禁*/)
{ var messageList = new List<DoorStateInfo>(); //业务处理
... Clients.Group("doorserver").AddMessage("doorserver", messageList);
} /// <summary>
/// 门禁服务发送开关门消息,hubserver转发给浏览器
/// </summary>
/// <param name="name"></param>
/// <param name="message"></param>
public void SendOneMessageByDoorServer(string name, DoorStateInfo message)
{ //业务处理
Clients.Group("doorclient").AddMessage(message);
}

门禁服务发送门禁状态变化

  • A.这种情况主要发生在门禁刷卡等开门操作,引起的门禁状态变化,门禁服务接收到消息后,主动发送门禁状态变化信息;
  • B.web服务端接收信息,并转发到doorclient组。

几个问题说明

AddMessage方法

客户端使用AddMessage接收server转发来的消息,由于client监听接收消息只能有一个方法,但是存在单个门禁状态变化消息和多个两种情况。因此AddMessage的消息参数统一使用List<Message>,然后在server端转发时相应加入业务标记,便于client端处理。

门禁服务程序的事件机制

门禁服务程序采用事件机制

  • 刷卡等开发事件接收到后,门禁服务会主动进行消息发送,通知所有浏览器更新相应门禁状态;
  • 浏览器初始化请求所有门禁状态时,由于消息通信是不能直接返回的,因此信息传递时携带connectId,用于下一条消息确认发送对象;
  • 与初始化请求一样,浏览器发送开门命令后,门禁服务接收到开门命令发送给大华门禁服务器后,会在收到门禁状态变化事件时,向doorclient组发送消息。两条消息是相对独立的。

大华门禁SDK二次开发(二)-SignalR应用的更多相关文章

  1. 大华门禁SDK二次开发(一)-技术沟通

    项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...

  2. 研究大华3G设备接入自主视频开发平台

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengshuiyue/article/details/24311977 近期项目上须要接入3G摄像头 ...

  3. EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能

    本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603 Demo项目介绍 EasyRTMP Demo代码下载地址https://github.c ...

  4. Linux基于webRTC的二次开发(二) 实现远程桌面共享

    webRTC中的desktop_capture模块提供了捕获桌面和捕获窗口的相关功能,而实现远程桌面共享功能需要将desktop_capture捕获的画面作为peerconnection的视频源,下面 ...

  5. EasyDSS点播与直播服务器软件-二次开发接口对接说明示列

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播版本主要包含:上传.转码.分发.直播版本,主要包含:直播.录像, 直播支持RTMP输 ...

  6. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器软件二次开发接口对接说明示列

    EasyDSS相关功能 EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播版本主要包含:上传.转码.分发.直播版本主要包含:直播.录像 ...

  7. Jmeter二次开发——基于Java请求

    简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...

  8. 【视频开发】EasyIPCamera通过RTSP协议接入海康、大华等摄像机,摒弃私有SDK接入弊端

    近期工作中需要开发一套视频监控系统,实现WEB端.手机APP端预览局域网内的道路监控摄像机,我负责一些后台服务的开发工作. 由于之前项目中的程序都是采用私有协议.各摄像机厂商的SDK进行视频监控系统开 ...

  9. EasyIPCamera通过RTSP协议接入海康、大华等摄像机,摒弃私有SDK接入弊端

    本文转自博客:http://blog.csdn.net/xinlanbobo/article/details/53156742 近期工作中需要开发一套视频监控系统,实现WEB端.手机APP端预览局域网 ...

随机推荐

  1. Java安全(权限)框架 - Shiro 功能讲解 架构分析

    Java安全(权限)框架 - Shiro 功能讲解 架构分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 简述Shiro Shiro出自公司Apache(阿帕奇),是java的一 ...

  2. 《k8s-1.13版本源码分析》-调度预选

    本文大纲 预选流程 predicate的并发 一个node的predicate predicates的顺序 单个predicate执行过程 具体的predicate函数 本系列文章已经开源到githu ...

  3. Mybatis插入数据返回主键ID

    <insert id="add" parameterType="com.dsa.core.base.model.ProductSync">      ...

  4. 设计模式之结构类模式PK

    结构类模式包括: 适配器模式 桥梁模式 组合模式 装饰模式 门面模式 享元模式 代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更 ...

  5. PXE安装windows系统,pxe-e55:ProxyDhcp service did not reply to request on port 4011

    这个pxe-e55" 错误表示 pxe 客户端已向端口4011上的代理 dhcp 服务器发送请求, 但未收到答复.似乎只有在dhcp 服务器上设置了 dhcp 类标识符选项 #60, 但同一 ...

  6. 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑心中会激动一番(或许这是判断是否是一个标准阿猿的标准吧)! 首先自己从宏观把控一下,通过上网科普自 ...

  7. 好程序员web前端分享CSS基础篇

    学习目标 1.CSS简介 2.CSS语法 3.样式的创建 4.两种引入外部样式表的区别 5.样式表的优先级和作用域 6.CSS选择器 7.选择器的权重 8.浮动属性的简单应用 9.HTML.CSS注释 ...

  8. 史上最全的springboot导出pdf文件

    最近项目有一个导出报表文件的需求,我脑中闪过第一念头就是导出pdf(产品经理没有硬性规定导出excel还是pdf文件),于是赶紧上网查看相关的资料,直到踩了无数的坑把功能做出来了才知道其实导出exce ...

  9. PHP Iterator迭代对象属性

    foreach用法和之前的数组遍历是一样的,只不过这里遍历的key是属性名,value是属性值.在类外部遍历时,只能遍历到public属性的,因为其它的都是受保护的,类外部不可见. class Har ...

  10. 在Windows 10 + Python 3.6.5 中用 pip 安装最新版 TensorFlow v1.8 for GPU

    声明 什么cuDNN之类的安装,应该是毫无难度的,按照官网的教程来即可,除非...像我一样踩了狗屎运.咳咳,这些问题不是本文的关键. 本文的关键是解决pip安装tensorflow gpu版的问题. ...